Google TestとMockを使う
前回に引き続きgoogle testを扱う。 googletestの基本的な使い方 googletestをプロジェクトへ簡単に導入するには、CMakeを使う(前回のエントリ)のが一番楽だと思う。 基本的にはTEST()マクロを使うことでテストを作っていく。 TESTマクロは、第一引数にtest_case_name、第二引数にtest_nameを置く。 注意としては、テストケース名、テスト名にはアンダースコア(_)を使ってはいけない。参考 これは、C++の予約語やgoogletestが生成するテストクラスがtestcasename_testnameのようになるためらしい。 さて、テスト対象から出力される結果の判定については、ASSERT_やEXPECT_を使う。 例えば、掛け算の結果を返す関数のテストは下記のように行う。 int32_t TimesCalc(int32_t a, int32_t b){ return a * b; } TEST(TestTips, BasicAssertions) { EXPECT_EQ(TimesCalc(7,6), 42); } 判定の種類は数値のequal以外にも、not equal、less/grater thanなどももちろんあるし、文字列比較もある。 Test Fixture 各テストケースで同じような処理(データセットやリソースの確保など)を書く場合はフィクスチャクラスとしてまとめられる。これが地味に便利。 後でまた出てくるが、例えばMockクラスを用意して、テスト対象とは関係ないが値の設定などを行わなければいけない場合などに使っている。 class CommunicatorTest: public ::testing::Test{ protected: virtual void SetUp(){ mock_connector = new MockConnector; communicator = std::make_unique<Communicator>(mock_connector); } virtual void TearDown(){ delete mock_connector; } std::unique_ptr<Communicator> communicator; MockConnector *mock_connector; }; TEST_F(CommunicatorTest, fixtureTest){ EXPECT_TRUE(true); } 上はとりあえずリソースの確保と破棄をフィクスチャクラスとしてまとめている(このレベルはいらないと思うし、new/deleteやunique_ptrを使っていたり普通はない) さっきまで使っていたTESTマクロがTEST_F、test_case_nameがフィクスチャクラスに変わっている。 TEST_Fマクロでは最初このテストが実行されるときにコンストラクタまたはSetUp()が実行され、テストのスコープが最後まで実行されるとデストラクタまたはTearDown()が実行される。 Mock テストしたい関数が別の関数を読んでいて、その結果を持って処理がされる実装はある。 単体レベルに切り分けることが良いにしても、組み込みや機器とのコミュニケーションを賄う機能の場合はなおさらだ。...