我有一些测试:
class Somefixture: ::testing::Test{};
class Somefixture2: ::testing::Test{};
TEST_F(SomeFixture, SomeName)
{
// ...
}
如何自动将测试链接到两个灯具(装饰)?
TEST_F2(SomeFixture, SomeFixture2, SomeName){}
虽然所需的结果就像我写的那样:
TEST_F(SomeFixture, SomeName)
{
// ...
}
TEST_F(SomeFixture2, SomeName)
{
// ...
}
没有不必要的代码重复
最佳答案
除了一个小异常(exception)(两个测试不能具有相同的名称),这应该正确地执行:
#define TEST_F2(F1, F2, Name) \
template <struct Fixture> struct MyTester##Name : Fixture { \
void test##Name(); \
}; \
\
TEST_F(MyTester##Name<F1>, Name##1){ test##Name(); } \
TEST_F(MyTester##Name<F2>, Name##2){ test##Name(); } \
\
template <struct Fixture> void MyTester##Name::test##Name()
这将调用两个测试,每个测试都使用MyTester作为从两个固定装置之一继承的固定装置。由于do_test是MyTester的成员,因此它可以访问固定装置中所有继承的成员。测试框架将为每个测试创建一个MyTester对象,并将相应的实际灯具作为基类对象创建。为避免与其他测试的命名冲突或在TEST_F2的不同调用之间发生命名冲突,我在模板名称和测试方法名称后附加了名称。 TEST_F宏调用提供了名称和索引。我没有进行测试,因为我没有Google Test,但是许多测试框架中的机制都类似。