如何解决GTest 参数化测试从数组或类似解包 Values 参数
使用 GTest 进行简单的参数化测试,例如:
// Add an OnClickListener to the dialog,so that the selection will be handled.
builder.setMultiChoiceItems(
categories,checkedItems,new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog,int which,boolean isChecked) {
checkedItems[which] = isChecked;
}
}
);
如果我想从数组中生成值,例如:
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,::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>{}
来提供第二个参数是可能的吗?
解决方法
问题的关键是使用 ::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())
);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。