2

我有一些测试:

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)
{
// ...
}

没有不必要的代码重复

4

4 回答 4

1

除了一个小例外(两个测试不能有相同的名称),这应该是正确的方向:

#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 的不同调用之间的命名冲突,我将 Name 附加到模板名称和测试方法名称。TEST_F 宏调用带有名称和索引。我没有测试它,因为我没有谷歌测试,但许多测试框架中的机制工作相似。

于 2013-02-26T15:03:08.037 回答
0

如何自动将测试链接到两个夹具(装饰)?

通过添加一个公共基类:

class CommonFixture
{
  public:
    // add member variables and initialize them in the constructor
};
class Somefixture1 : ::testing::Test, protected CommonFixture{}
class Somefixture2 : ::testing::Test, protected CommonFixture{}

测试保持不变:

TEST_F(SomeFixture1, SomeName)
{
// ...
}
TEST_F(SomeFixture2, SomeName)
{
// ...
}

现在您获得了 Somefixture1 和 Somefixture2 的通用夹具。您可以从测试中访问这些常见对象。

于 2013-02-26T12:25:52.713 回答
0

您可以采用BЈовић看起来不错的方法。
或者需要对测试本身进行小的更改的另一种方法可能是拥有一个“超级”类,它将两个实例都作为成员。

class superFuxture
{
public:
    Somefixture1 f1;
    Somefixture2 f2;
}

然后你的测试会是这样的:

TEST_F(superFuxture, SomeName)
{
    //when you were accessing a member of Somefixture1 you'll now need to do:
    //f1.SomeFixture1Member
}
于 2013-02-26T12:58:43.713 回答
0

Google Test 有两种方法可以在不同的上下文中执行相同的测试主体:值参数化测试类型化/类型参数化测试。不完全是您想要的,但它是它提供的最接近的东西。

于 2013-02-27T14:44:50.263 回答