C++ユニットテストフレームワーク-gtest-1-断言
4905 ワード
0ディレクトリ 1前言 2 bool値検査 3数値型検査 4文字列チェック 5は、成功または失敗を返す を示します.6異常検査 7 Predicate検査 8浮動小数点検査 1はじめに
gtestでは,断言マクロはASSERT系列,EXPECT系列の2種類に分類されると理解できる. ASSERT_* チェックポイントが失敗した場合は、現在の関数を終了します(注:現在のケースを終了するわけではありません).EXPECT_* シリーズの断言は、チェックポイントが失敗した場合、引き続き実行されます.
例:
ここで予想される結果が4の場合、次の出力が表示されます.
自動出力のエラー情報に不満がある場合は、オペレータ<<でカスタム情報を出力することもできます.通常、これはデバッグやチェックポイントの補足説明に役立ちます.
次に例を示します.
これにより、エラー情報の位置決めが容易になります.
2 bool値チェック
Fatal断言
非Fatalアサーション
検証#ケンショウ#
ASSERT_TRUE(条件式)
EXPECT_TRUE(条件式)
(条件式)is true
ASSERT_FALSE(条件式)
EXPECT_FALSE(条件式)
(条件式)is false
3数値型検査
Fatal断言
非Fatalアサーション
検証#ケンショウ#
ASSERT_EQ(expected, actual);
EXPECT_EQ(val1, val2);
expected == actual
ASSERT_NE(val1, val2);
EXPECT_NE(val1, val2);
val1 != val2
ASSERT_LT(val1, val2);
EXPECT_LT(val1, val2);
val1 < val2
ASSERT_LE(val1, val2);
EXPECT_LE(val1, val2);
val1 <= val2
ASSERT_GT(val1, val2);
EXPECT_GT(val1, val2);
val1 > val2
ASSERT_GE(val1, val2);
EXPECT_GE(val1, val2);
val1 >= val2
4文字列チェック
Fatal断言
非Fatalアサーション
検証#ケンショウ#
ASSERT_STREQ(expected_str, actual_str);
EXPECT_STREQ(val1, val2);
2文字列が同じ
ASSERT_STRNE(str1, str2);
EXPECT_STRNE(val1, val2);
2文字列が異なる
ASSERT_STRCASEEQ(expected_str, actual_str);
EXPECT_STRCASEEQ(val1, val2);
大文字と小文字を無視し、2文字列が同じ
ASSERT_STRCASENE(str1, str2);
EXPECT_STRCASENE(val1, val2);
大文字と小文字を無視して2文字列が異なる
STREQとSTRNEはchar*とwchar_を同時にサポートt*タイプの、STRCASEEQとSTRCASENEはchar*しか受信していないので、あまり使わないのではないでしょうか.次の例を示します.
5戻り成功または失敗を表示
直接復帰成功:SUCCEED();失敗を返す場合は、致命的な断言(FAIL();)と非致命的な断言(ADD_FAILURE();)
6異常検査
Fatal断言
非Fatalアサーション
検証#ケンショウ#
ASSERT_THROW(文、異常タイプ);
EXPECT_THROW(文、異常タイプ);
文に指定されたコードは、指定された例外を放出します.
ASSERT_ANY_THROW(文);
EXPECT_ANY_THROW(文);
文に指定されたコードは、例外を放出します.
ASSERT_NO_THROW(文);
EXPECT_NO_THROW(文);
文に指定されたコードは例外を放出しません
例:
7 Predicate検査
Fatal断言
非Fatalアサーション
検証#ケンショウ#
ASSERT_PRED1(pred1, val1);
ASSERT_PRED1(pred1, val1);
pred 1(val 1)はtrueを返す
ASSERT_PRED2(pred2, val1, val2);
ASSERT_PRED2(pred2, val1, val2);
pred 2(val 1,val 2)はtrueを返す
…
…
…
例:
入力結果は次のとおりです.
このような出力に不満がある場合は、以下のように出力フォーマットをカスタマイズすることもできます.
Fatal断言
非Fatalアサーション
検証#ケンショウ#
ASSERT_PRED_FORMAT1(p_format1, val1);
EXPECT_PRED_FORMAT1(p_format1, val1);
p_format 1(val 1)成功
ASSERT_PRED_FORMAT2(p_format2, val1, val2);
EXPECT_PRED_FORMAT2(p_format2, val1, val2);
p_format 2(val 1,val 2)成功
…
…
…
例:
失敗した場合、出力される情報は次のとおりです.
8浮動小数点検査
Fatal断言
非Fatalアサーション
検証#ケンショウ#
ASSERT_FLOAT_EQ(expected, actual);
EXPECT_FLOAT_EQ(expected, actual);
floatはほぼ等しい
ASSERT_DOUBLE_EQ(expected, actual);
EXPECT_DOUBLE_EQ(expected, actual);
doubleはほぼ等しい
2つの近い数を比較します.
Fatal断言
非Fatalアサーション
検証#ケンショウ#
ASSERT_NEAR(val1,val2,abs_error);
EXPECT_NEAR(val1,val2,abs_error);
2つの数の差は絶対値absを超えないerror
また、次の操作も可能です.
その他は
トップに戻る
gtestでは,断言マクロはASSERT系列,EXPECT系列の2種類に分類されると理解できる.
例:
EXPECT_EQ(3, add(1,2)) // add 3
ここで予想される結果が4の場合、次の出力が表示されます.
g: : error: Value of: Add(1, 2)
Actual: 4
Expected:3
自動出力のエラー情報に不満がある場合は、オペレータ<<でカスタム情報を出力することもできます.通常、これはデバッグやチェックポイントの補足説明に役立ちます.
次に例を示します.
for (int i = 0; i < x.size(); ++i)
{
EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i;
}
これにより、エラー情報の位置決めが容易になります.
2 bool値チェック
Fatal断言
非Fatalアサーション
検証#ケンショウ#
ASSERT_TRUE(条件式)
EXPECT_TRUE(条件式)
(条件式)is true
ASSERT_FALSE(条件式)
EXPECT_FALSE(条件式)
(条件式)is false
3数値型検査
Fatal断言
非Fatalアサーション
検証#ケンショウ#
ASSERT_EQ(expected, actual);
EXPECT_EQ(val1, val2);
expected == actual
ASSERT_NE(val1, val2);
EXPECT_NE(val1, val2);
val1 != val2
ASSERT_LT(val1, val2);
EXPECT_LT(val1, val2);
val1 < val2
ASSERT_LE(val1, val2);
EXPECT_LE(val1, val2);
val1 <= val2
ASSERT_GT(val1, val2);
EXPECT_GT(val1, val2);
val1 > val2
ASSERT_GE(val1, val2);
EXPECT_GE(val1, val2);
val1 >= val2
4文字列チェック
Fatal断言
非Fatalアサーション
検証#ケンショウ#
ASSERT_STREQ(expected_str, actual_str);
EXPECT_STREQ(val1, val2);
2文字列が同じ
ASSERT_STRNE(str1, str2);
EXPECT_STRNE(val1, val2);
2文字列が異なる
ASSERT_STRCASEEQ(expected_str, actual_str);
EXPECT_STRCASEEQ(val1, val2);
大文字と小文字を無視し、2文字列が同じ
ASSERT_STRCASENE(str1, str2);
EXPECT_STRCASENE(val1, val2);
大文字と小文字を無視して2文字列が異なる
STREQとSTRNEはchar*とwchar_を同時にサポートt*タイプの、STRCASEEQとSTRCASENEはchar*しか受信していないので、あまり使わないのではないでしょうか.次の例を示します.
5戻り成功または失敗を表示
直接復帰成功:SUCCEED();失敗を返す場合は、致命的な断言(FAIL();)と非致命的な断言(ADD_FAILURE();)
6異常検査
Fatal断言
非Fatalアサーション
検証#ケンショウ#
ASSERT_THROW(文、異常タイプ);
EXPECT_THROW(文、異常タイプ);
文に指定されたコードは、指定された例外を放出します.
ASSERT_ANY_THROW(文);
EXPECT_ANY_THROW(文);
文に指定されたコードは、例外を放出します.
ASSERT_NO_THROW(文);
EXPECT_NO_THROW(文);
文に指定されたコードは例外を放出しません
例:
int Foo(int a, int b)
{
if (a == 0 || b == 0)
{
throw "don't do that";
}
int c = a % b;
if (c == 0)
return b;
return Foo(b, c);
}
TEST(FooTest, HandleZeroInput)
{
EXPECT_ANY_THROW(Foo(10, 0));
EXPECT_THROW(Foo(0, 5), char*);
}
7 Predicate検査
Fatal断言
非Fatalアサーション
検証#ケンショウ#
ASSERT_PRED1(pred1, val1);
ASSERT_PRED1(pred1, val1);
pred 1(val 1)はtrueを返す
ASSERT_PRED2(pred2, val1, val2);
ASSERT_PRED2(pred2, val1, val2);
pred 2(val 1,val 2)はtrueを返す
…
…
…
例:
bool MutuallyPrime(int m, int n)
{
return Foo(m , n) > 1;
}
TEST(PredicateAssertionTest, Demo)
{
int m = 5, n = 6;
EXPECT_PRED2(MutuallyPrime, m, n);
}
入力結果は次のとおりです.
error: MutuallyPrime(m, n) evaluates to false, where
m evaluates to 5
n evaluates to 6
このような出力に不満がある場合は、以下のように出力フォーマットをカスタマイズすることもできます.
Fatal断言
非Fatalアサーション
検証#ケンショウ#
ASSERT_PRED_FORMAT1(p_format1, val1);
EXPECT_PRED_FORMAT1(p_format1, val1);
p_format 1(val 1)成功
ASSERT_PRED_FORMAT2(p_format2, val1, val2);
EXPECT_PRED_FORMAT2(p_format2, val1, val2);
p_format 2(val 1,val 2)成功
…
…
…
例:
testing::AssertionResult AssertFoo(const char* m_expr, const char* n_expr, const char* k_expr, int m, int n, int k) {
if (Foo(m, n) == k)
return testing::AssertionSuccess();
testing::Message msg;
msg << m_expr << " " << n_expr << " :" << Foo(m, n) << " :" << k_expr;
return testing::AssertionFailure(msg);
}
TEST(AssertFooTest, HandleFail)
{
EXPECT_PRED_FORMAT3(AssertFoo, 3, 6, 2);
}
失敗した場合、出力される情報は次のとおりです.
error: 3 6 :3 :2
8浮動小数点検査
Fatal断言
非Fatalアサーション
検証#ケンショウ#
ASSERT_FLOAT_EQ(expected, actual);
EXPECT_FLOAT_EQ(expected, actual);
floatはほぼ等しい
ASSERT_DOUBLE_EQ(expected, actual);
EXPECT_DOUBLE_EQ(expected, actual);
doubleはほぼ等しい
2つの近い数を比較します.
Fatal断言
非Fatalアサーション
検証#ケンショウ#
ASSERT_NEAR(val1,val2,abs_error);
EXPECT_NEAR(val1,val2,abs_error);
2つの数の差は絶対値absを超えないerror
また、次の操作も可能です.
EXPECT_PRED_FORMAT2(testing::FloatLE, val1, val2);
EXPECT_PRED_FORMAT2(testing::DoubleLE, val1, val2);
その他は
トップに戻る