構造体をパラメータ化
ぱっと思いつく簡単な方法として構造体を使う方法があります。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;
}
