GoogleTestで値をパラメータ化する
GoogleTestで値をパラメータ化する。
内部で同じ判定をするならその実装を何度も書くなんて馬鹿げている。
たとえコピペで済むとしてもだ。
だから以下のようにテストしたいことはよくある。
int a{0}, b{10};
TestX(a);
TestX(b);
やりたいこと
- いくつも似たテストを書くのを回避する
以下たぶん最小のコード
class OddTest
:public ::testing::TestWithParam<int> {};
TEST_P(OddTest, IsOdd) {
auto x = GetParam();
EXPECT_TRUE( x % 2 == 1 );
EXPECT_FALSE( x % 2 == 0 );
}
INSTANTIATE_TEST_CASE_P(
ParamtererizedTest
, OddTest
, ::testing::Range(1, 10,2)
);
- ::testingに用意されたクラスを継承してフィクスチャクラスを作成
- テストとフィクスチャを関連付ける(TEST_Pの第一引数に指定)
- テストを実体化
肝はTEST_Pで呼んでいるGetParamマクロで、これはINSTANTIATE_TEST_CASE_Pの
第3引数に渡したものがいい感じに展開されてれreturnされるらしい。
Range以外にもValuesやCombine等が使える(上級ガイド — Google Test ドキュメント日本語訳
)。
ちなみにフィクスチャクラスの親にはTestWithParam<T>の代わりに
TestとWithParamInterface<T>の2つを継承してもいい。
TestとWithParamInterface<T>を継承したものがTestWithParam<T>らしい。
TestWithParamとWithParamInterfaceの型引数にはパラメータ化の対象となるオブジェクトの型を指定する。
型安全で、マクロを使わず、テスト失敗の原因となるコードの位置(ファイル、行)を特定してくれるテストシステムが欲しいけど難しいのだろうなぁ。