【发布时间】:2017-04-06 12:40:57
【问题描述】:
如果有以下3个模板函数:
template <typename T, size_t SIZE>
size_t foo1(array<T, SIZE>& a, size_t start){}
template <typename T, size_t SIZE>
size_t foo2(array<T, SIZE>& a, size_t start){}
template <typename T, size_t SIZE>
size_t foo3(array<T, SIZE>& a, size_t start){}
这三个都对数组 a 执行相同的操作,但实现方式不同。
现在我喜欢为所有三个函数设置一个谷歌测试,但没有 C'n'P 所有测试本身。我读过“值参数化测试”,但我无法在模板函数本身上定义指针。
测试可能如下所示:
TEST(Foo1, t1) {
std::array<int, 2> arr = {3,1};
EXPECT_EQ(1, arr[foo1(arr, 0)]);
}
TEST(Foo2, t1) {
std::array<int, 2> arr = {3,1};
EXPECT_EQ(1, arr[foo2(arr, 0)]);
}
TEST(Foo3, t1) {
std::array<int, 2> arr = {3,1};
EXPECT_EQ(1, arr[foo3(arr, 0)]);
}
(如何)是否可以为所有三个模板函数设置测试用例并重用其测试,而无需将测试包装在自定义函数中(仅使用 gTest)?
我只喜欢定义一次测试并将使用的函数作为某种测试参数“传递”给测试。
提前致谢:-)
编辑 1:
经过长时间的尝试,我运行了这个:
template<typename T, size_t SIZE>
using fooFp = size_t (*)(std::array<T, SIZE>&, size_t);
template <typename T, size_t SIZE>
class fooTemplateClass: public ::testing::TestWithParam<fooFp<T, SIZE>> {};
class Tc1 : public fooTemplateClass<int, 1>{};
TEST_P(Tc1 , Fnc) {
fooFp<int, 1> fnc = GetParam();
std::array<int, 1> arr = {1};
EXPECT_EQ(1, arr[fnc(arr, 0)]);
}
INSTANTIATE_TEST_CASE_P(Name, Tc1, ::testing::Values(foo1<int, 1>, foo2<int, 1>, foo3<int, 1>), );
但是,这仍然不方便,因为我需要为每个模板组合定义一个类(在这种情况下为 Tc1)。我也不喜欢我需要在 INSTANTIATE_TEST_CASE_P 中定义所有模板设置。
有没有办法概括这个,所以我只需要写这样的东西:
TEST_P(fooTemplateClass<int, 1>, Fnc) {
std::array<int, 1> arr = {1};
fooFp<int, 1> fnc = GetParam();
EXPECT_EQ(1, arr[fnc(arr, 0)]);
}
INSTANTIATE_TEST_CASE_P(Name, fooTemplateClass, ::testing::Values(foo1, foo2, foo3), );
我在编译时知道所有模板类型和大小,因此我可以传递它们。但目前我不知道如何将模板类传递给 TEST_P 宏......
【问题讨论】:
标签: c++ templates googletest