c++ Google类型参数化和值参数化测试组合?



我希望能够通过以下代码片段对各种类型的测试进行参数化:

template <typename T>
class MyTestSuite : public testing::TestWithParam<tuple<T, vector<vector<T>>, T, T>>
{
public:
MyTestSuite()
{
_var = get<0>(GetParam());
// and the rest of the test params
}
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());

这个帖子已经有一段时间了:谷歌测试:有没有一种方法可以将类型参数化和值参数化的测试结合起来?从上面的编译错误来看,还是不能一石二鸟吗?

决定使用带有参数化测试的模板基测试夹具类:

template <typename T>
class MyTestFixture
{
protected:
void SetUp(...) {}
T _var;
};
class MyTestSuite1 : public MyTestFixture<size_t>, public testing::TestWithParam<tuple<size_t, vector<vector<size_t>>, size_t, size_t>>
{
public:
void SetUp() override
{
MyTestFixture::SetUp(get<0>(GetParam()));
// and the rest of the test params
}
};
class MyTestSuite2 : public MyTestFixture<long>, public testing::TestWithParam<tuple<size_t, vector<vector<long>>, size_t, long>>
{
public:
void SetUp() override
{
MyTestFixture::SetUp(get<0>(GetParam()));
// and the rest of the test params
}
};
TEST_P(MyTestSuite1, MyTests1)
{
ASSERT_EQ(this->_expected, this->DoSomething(this->_var));
}
TEST_P(MyTestSuite2, MyTests2)
{
ASSERT_EQ(this->_expected, this->DoSomething(this->_var));
}
INSTANTIATE_TEST_SUITE_P(
MyGroup,
MyTestSuite1,
::testing::Values(make_tuple<size_t, ...>(4, vector<vector<size_t>>{{1, 2}, {1, 3}, {3, 4}}, 1, 1),
make_tuple<size_t, ...>(10, vector<vector<size_t>>{{1, 2}, {1, 3}, {3, 4}}, 1, 2),
make_tuple<size_t, ...>(20, vector<vector<size_t>>{{1, 2}, {1, 3}, {3, 4}}, 1, 4)));