CppUnitコード生成 & 自動化

どこかにありそうだよな、と思いながら作ってみた。C++単体テストフレームワークCppUnitを、最低限の記述だけでテストケースを作成できるようにするツールを作ってみた。

解決すべき問題

CppUnitのテストケースの作成において、同じことを複数回書かなければいけない、あるいはコードが定型文である箇所が多い。たとえば、hoge というモジュールのテストは hogeTest.hpp hogeTest.cpp というファイルを記述して、さらにいくつかのモジュールのテストケースをまとめて実際に実行する(main関数がある)testRunner.cpp というファイルが必要。

たとえば hogeTest.hpp

hogeTest.hpp で本質的に重要な情報は、test_case1 〜 test_caseN という名前でテストケースを作成するというだけで、ほとんどのコードは定型文。

class hogeTest {
private:
    CPPUNIT_TEST_SUITE( hogeTest );
    CPPUNIT_TEST( test_case1 );
    ....
    CPPUNIT_TEST( test_caseN );
    CPPUNIT_TEST_SUITE_END();

    // fixtures
    hoge_t var1; hoge_t var2;
public:
    void test_case1();
    ....
    void test_caseN();
}

こんな調子で、結構非本質的なところで手を動かさなければいけないので大変面倒なのである。

しかも、テストケースを1つ追加する場合に、大体4ヶ所くらいに追記をする必要があるため、面倒なことこの上ない。ただでさえ面倒なテストが、これではやる気がおこならい。

作ったもの

必要な情報を1ヶ所に書いておいて、その情報からコード生成するのが筋だろう、ということでこんな感じのものを。

#require foo bar

#fixtures
hoge_t var1; hoge_t var2;
#end

#testcase test_case1 ()
    CPPUNIT_ASSERT( ... );
    ....
#end 

...

#testcase test_caseN ()
    CPPUNIT_ASSERT( ... );
    ....
#end

このような内容のファイルを、hoge.suite という名前で保存して、今回作ったツールに食わせると、テストケースを定義したcpp、hppファイル、makefileを生成してくれる。あとはmakefileを実行すれば、foo、barというモジュールとリンクして、テストが実行される。これでめでたく、最小限の記述でテストを書ける環境が整った。

しかし、ツールの開発に気をとられて肝心の本体の開発のほうが。。。