GoogleTestのパラメータテストについて
業務でGoogleTestを使ってテストを書いています。導入したはいいものの、レガシーコードに対してテストを書いているということもあり、進捗がいまいちです。また、不慣れな点も多く手探りな状態で使っています。
今回は、パラメータテストをしていた時に「このパターンどうやって書くんだろ」と思ったので、その内容を記事にします。
パラメータテストの書き方
本題の前にパラメータテストの書き方です。
公式ドキュメントなど以下の記事を参考に書いたので、目新しいことはしていませんので、記事の紹介のみで割愛します。
- 上級ガイド — Google Test ドキュメント日本語訳
- Google Testで「値をパラメータ化したテスト」を試してみる:とりあえずやってみる:So-netブログ
-
google-gtest: value parameterized testのCombineを使う - nobu-qの日記
複数のパラメータを設定するときにtupleを使うっていうのはめちゃめちゃ参考になりました。
書きたかったパターン
本題です。まず、私がやりたかったテストのパラメータは以下の通りです。(因子などは例です。)
モータ | スイッチ | 設定 |
---|---|---|
モータA | スイッチA | オフ |
モータB | スイッチB | オン |
上記のパラメータから以下の組み合わせのテストを行いたかったのです。combineを使用すれば普通にできるのですが、今回は、モータとスイッチの組み合わせは固定しておきたかったのです。(モータAのときはスイッチAだけをテストする。)
モータ | スイッチ | 設定 |
---|---|---|
モータA | スイッチA | オフ |
モータB | スイッチB | オフ |
モータA | スイッチA | オン |
モータB | スイッチB | オン |
combineだとすべての組み合わせをテストしてしまうので、思ったパターンをテストできませんでした。
以下GoogleTestの一例。これだと、すべての組み合わせがテストされてしまう。
INSTANTIATE_TEST_CASE_P( TestData, ParamTest, ::testing::Combine(::testing::ValueIn(motor), ::testing::VaueIn(switch),
::testing::Bool()) );
対処した方法
モータとスイッチの組み合わせを別の因子に置き換え、テストコード内でモータとスイッチを取得するようにしました。
ハード構成 | 設定 |
---|---|
ハード構成A | オフ |
ハード構成B | オン |
ハード構成 | モータ | スイッチ |
---|---|---|
ハード構成A | モータA | スイッチA |
ハード構成B | モータB | スイッチB |
テストの組み合わせは、ハード構成の番号と設定の組み合わせにする。
INSTANTIATE_TEST_CASE_P( TestData, ParamTest, ::testing::Combine(::testing::ValueIn(hardware_no), ::testing::Bool()) );
例えば、ハードの構成を配列などで事前にテストフィクスチャに定義しておけば、以下のような記述で、モータやスイッチを取得することができます。
TEST_P(ParamTest, test) { int hardware_no = std::tr1::get<0>(GetParam()); bool setting = std::tr1::get<1>(GetParam()); int motor_no = hardware[hardware_no].motor_no; int switch_no = hardware[hardware_no].swtch_no; ASSERT_EQ(...); }
おわりに
以上のやり方で、目的のパターンでテストすることができました。
「設定」の部分が2値なら、こんなことしなくてもテストケース羅列してもよかったのですが、結構組み合わせが多かったのでいろいろ模索しました。
(そもそもテストに対する知識不足は否めない。。。)