gpt4 book ai didi

c++ - GTest 参数化测试从数组或类似解包 Values 参数

转载 作者:行者123 更新时间:2023-12-04 07:22:51 28 4
gpt4 key购买 nike

使用 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())
);

关于c++ - GTest 参数化测试从数组或类似解包 Values 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68385071/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com