Google Test中类型与值参数化测试结合的编译问题咨询
类型参数化与值参数化测试结合的编译问题
问题背景
尝试通过Google Test为不同类型实现同时支持类型参数化和值参数化的测试,编写了如下代码:
template <typename T> class MyTestSuite : public testing::TestWithParam<tuple<T, vector<vector<T>>, T, T>> { public: MyTestSuite() { _var = get<0>(GetParam()); // 其他测试参数初始化逻辑 } protected: T _var; }; TYPED_TEST_SUITE_P(MyTestSuite); TYPED_TEST_P(MyTestSuite, MyTests) { ASSERT_EQ(this->_expected, this->DoSomething(this->_var)); } REGISTER_TYPED_TEST_SUITE_P(MyTestSuite, MyTests); using MyTypes = ::testing::Types<size_t>; INSTANTIATE_TYPED_TEST_SUITE_P( MyGroup, MyTestSuite, ::testing::Combine( ::testing::Values(4, vector<vector<size_t>>{{1, 2}, {1, 3}, {3, 4}}, 1, 1), ::testing::Values(10, vector<vector<size_t>>{{1, 2}, {1, 3}, {3, 4}}, 1, 2), ::testing::Values(20, vector<vector<size_t>>{{1, 2}, {1, 3}, {3, 4}}, 1, 4)));
但遇到编译错误:
error: there are no arguments to ‘GetParam’ that depend on a template parameter, so a declaration of ‘GetParam’ must be available [-fpermissive] [build] 284 | _var = get<0>(GetParam());
疑问:从该编译错误来看,是否Google Test至今仍无法同时实现类型参数化与值参数化测试?
解答
Google Test完全支持同时实现类型参数化和值参数化测试,你遇到的错误是C++模板名称查找规则导致的,并非框架功能限制。
错误原因
在模板类MyTestSuite的构造函数中,GetParam()是基类testing::TestWithParam<...>的成员函数,但由于基类的类型依赖于模板参数T,编译器在模板实例化前无法确定GetParam()的存在,因此需要显式指明这是基类的成员函数。
修复步骤
修正
GetParam()的调用方式:
将构造函数中的GetParam()改为this->GetParam(),让编译器明确该函数是依赖于模板参数的基类成员:MyTestSuite() { _var = get<0>(this->GetParam()); // 其他参数初始化逻辑 }或者也可以直接指定基类作用域:
_var = get<0>(testing::TestWithParam<tuple<T, vector<vector<T>>, T, T>>::GetParam());修正参数实例化的错误:
你的INSTANTIATE_TYPED_TEST_SUITE_P中Combine的用法有误:Combine用于组合多个独立的参数生成器,而你当前每个Values中塞入了多个不同类型的元素,会导致参数类型不匹配。
如果你需要的是三组独立的测试参数,直接用Values传递完整的tuple实例即可:INSTANTIATE_TYPED_TEST_SUITE_P( MyGroup, MyTestSuite, ::testing::Values( make_tuple<size_t, vector<vector<size_t>>, size_t, size_t>(4, {{1,2},{1,3},{3,4}}, 1, 1), make_tuple<size_t, vector<vector<size_t>>, size_t, size_t>(10, {{1,2},{1,3},{3,4}}, 1, 2), make_tuple<size_t, vector<vector<size_t>>, size_t, size_t>(20, {{1,2},{1,3},{3,4}}, 1, 4) ) );
内容的提问来源于stack exchange,提问作者khteh
相关产品推荐
相关产品推荐

