GTest参数化测试解包数组中的值参数或类似参数



使用GTest进行简单的参数化测试,例如:

class Example :public ::testing::TestWithParam<std::tuple<int, int>> {
};
TEST_P(LeapYearMultipleParametersTests, ChecksIfLeapYear) {
int a = std::get<0>(GetParam());
int b = std::get<1>(GetParam());
ASSERT_EQ(a, b);
}
INSTANTIATE_TEST_CASE_P(
Ex,
Example,
::testing::Values(
std::make_tuple(0, 0),
std::make_tuple(1, 2)
));


如果我想从数组中生成值,例如:

auto make_values() {
std::tuple<int, int> res[2];
res[0] = std::make_tuple(0, 0);
res[1] = std::make_tuple(1, 2);
return res;
}

然后使用该数组作为::testing::Values(...)中的参数,例如:

INSTANTIATE_TEST_CASE_P(
Ex,
Example,
::testing::Values(make_values())
));

如何将数组解包为多个参数呢?


编辑:

我已经达成了定义模板函数的部分解决方案

template<typename T, std::size_t... I>
auto values(T* t, std::index_sequence<I...>)
{
return ::testing::Values(t[I]...);
}

然后像一样使用

values(make_values() /*res*/, std::make_index_sequence<2>{});

但第二个参数std::make_index_sequence<2>{}并不是很优雅。无论如何,用另一个template来提供第二个参数是可能的吗?

问题的关键是使用::testing::ValuesIn而不是::testing::Values。因为在您的情况下,您传递的是容器,而不是一堆值。完整答案如下:

class Example : public ::testing::TestWithParam<std::tuple<int, int>> {
};
TEST_P(Example, ChecksIfLeapYear)
{
int a = std::get<0>(GetParam());
int b = std::get<1>(GetParam());
ASSERT_EQ(a, b);
}
using ValuesContainer = std::vector<std::tuple<int, int>>;
ValuesContainer make_values()
{
ValuesContainer res;
res.emplace_back(0, 0);
res.emplace_back(1, 2);
return res;
}
INSTANTIATE_TEST_CASE_P(
Ex,
Example,
::testing::ValuesIn(make_values())
);

相关内容

  • 没有找到相关文章

最新更新