2015年9月3日木曜日

[iutest] Google Test と袂を分かちつつある

Google Test v1.7 がリリースされて、約2年になろうとしています。
v1.7 がリリースされたのが、2013年9月。
v1.6 がリリースされたのが、2011年4月。
v1.8 はいつになるでしょうか。まだその気配はなさそうですが…


ただ、開発は進んでいて、trunk には v1.7 にない機能が、既に幾つか追加されています。
代表的なものとしては、
  • --gtest_flagfile コマンドラインオプション
  • "名前付き"値のパラメータ化テスト
があります。

flagfile は指定したファイルから、コマンドラインオプションを設定する機能です。
コマンドライン引数には文字数制限があるため、--gtest_filter オプションの条件が長くなると収まらない問題の対応として追加されました。

名前付き値のパラメータ化テストは、値のパラメータ化テストのテスト名を任意に設定できる機能です。
以下のように INSTANTIATE_TEST_CASE_P の最後に命名 Functor を指定して使います。
指定しなかった場合は、これまでどおりのインデックスによる命名になります。
class CustomFunctorNamingTest : public TestWithParam<std::string> {};
TEST_P(CustomFunctorNamingTest, CustomTestNames) {}

struct CustomParamNameFunctor {
  std::string operator()(const ::testing::TestParamInfo<std::string>& info) {
    return info.param;
  }
};

INSTANTIATE_TEST_CASE_P(CustomParamNameFunctor,
                        CustomFunctorNamingTest,
                        Values(std::string("FunctorName")),
                        CustomParamNameFunctor());


iutest の実装
さて、これらの機能ですが、iutest では少し違った実装をしています。

フィルターオプションの拡張
まず、flagfile の前に、このフラグが追加された理由である、コマンドライン引数の長さの問題に対して、フィルターオプションをファイルから読み込める方法を追加しました。

test.exe --iutest_filter=@filter.txt

のように、フィルターの先頭に @ を付けてファイルパスを指定します。
フィルターファイルは行頭 # でコメント、改行で条件区切り(; セミコロン)になります。
# iutest_filter_file_tests testdata
*Run*
# comment
*OK*
上記フィルターファイルは、"--iutest_filter=*Run*:*OK*" と同じです。

flagfile
さて、本題の flagfile ですが、もちろん実装しています。
使い方は、Google Test と一緒で

test.exe --iutest_flagfile=flag.txt

のように使います。
ファイルの書き方ですが、一行ごとにオプションを書きます。
また、iutest の場合フィルターファイルと同じように行頭 # でコメントを書けます。
あと、空行は無視されるようになってます。(Google Test も無視してほしいなぁ)

# iutest_flagfile_tests testdata
--iutest_filter=@testdata/filter.txt
--iutest_color=off

上記は iutest のフラグファイルの例です。
先に説明をしたフィルターオプションをファイル指定することもできます。


名前付き値のパラメータ化テスト
Google Test では、INSTANTIATE_TEST_CASE_P に命名 Functor を指定する方式でしたが、iutest ではテストフィクスチャーに MakeTestName 関数を書くことでカスタマイズできます。

class RenameParamTest : public ::iutest::TestWithParam<bool>
{
public:
    template<typename T>
    static const ::std::string MakeTestName(const char* basename, int, const T& param)
    {
        ::std::string name = basename;
        return name + "/" + ::iutest::StreamableToString(param);
    }
};

Google Test の方法だと、インスタンス化の時に命名方法を変えられるので、INSTANTIATE_TEST_CASE_P ごとに名前を変えることが可能です。iutest は実装の容易さから上記方法で実装しました。(INSTANTIATE_TEST_CASE_P ごとに名前を変える必要があるのか、ちょっと想定できなかったので)
と、言っても iutest は Google Test と互換性を持つようにしていますので、そのうち対応することになるとは思います。

最後に
というわけで、iutest の開発も落ち着いてきて独自の機能というのが増えつつあります。
Google Test との互換性のこともあるため、完全に離れてしまうことはないですが、少し窮屈に感じることも出てきました。

そろそろ新しいテスティングフレームワークを出したいなぁーと思ったりもしてますが…
今日はこの辺で!
では。

0 件のコメント:

コメントを投稿