構造体をパラメータ化
ぱっと思いつく簡単な方法として構造体を使う方法があります。struct Param { int x; float y; }; ::std::vector<Param> make_param() { ::std::vector<Param> v; for( int i=0; i < 5; ++i ) v.push_back(Param{ i, i*0.5f }); return v; } class Test : public testing::TestWithParam<Param> {}; INSTANTIATE_TEST_CASE_P(A, Test, testing::ValuesIn(make_param())); TEST_P(Test, A) { Param p = GetParam(); ::std::cout << p.x << ", " << p.y << ::std::endl; }
ただ、これだと構造体の定義やパラメータの生成がやや面倒です。
tuple パラメータ
tuple をパラメータの型として扱う方法です。class Test : public testing::TestWithParam< ::std::tuple<int, float> > {}; INSTANTIATE_TEST_CASE_P(A, Test, testing::Values( ::std::make_tuple(0, 0*0.5f) , ::std::make_tuple(1, 1 * 0.5f) , ::std::make_tuple(2, 2 * 0.5f) , ::std::make_tuple(3, 3 * 0.5f) , ::std::make_tuple(4, 4 * 0.5f) )); TEST_P(Test, A) { ::std::tuple<int, float> p = GetParam(); ::std::cout << ::std::get<0>(p) << ", " << ::std::get<1>(p) << ::std::endl; }
構造体の分だけ、すこ~しだけ簡単になった?気がします。
パラメータの構築は最初の例のように vector を返す関数で作ってもいいです。お好みでどうぞ。
iutest の場合
恒例の宣伝。自作テスティングフレームワークである iutest では以下のようなに ::std::get を省略した書き方もできます。
class Test : public ::iutest::TestWithParam< ::std::tuple<int, float> > {}; IUTEST_INSTANTIATE_TEST_CASE_P(A, Test, ::iutest::Values( ::std::make_tuple(0, 0*0.5f) , ::std::make_tuple(1, 1 * 0.5f) , ::std::make_tuple(2, 2 * 0.5f) , ::std::make_tuple(3, 3 * 0.5f) , ::std::make_tuple(4, 4 * 0.5f) )); IUTEST_P(Test, A) { ::std::cout << GetParam<0>() << ", " << GetParam<1>() << ::std::endl; }
0 件のコメント:
コメントを投稿