Google Test:使用现有测试夹具类的参数化测试?

des*_*ons 20 c++ unit-testing googletest

我有一个测试夹具类,目前许多测试都使用它.

#include <gtest/gtest.h>
class MyFixtureTest : public ::testing::Test {
  void SetUp() { ... }
};
Run Code Online (Sandbox Code Playgroud)

我想创建一个参数化测试,它也使用MyFixtureTest提供的所有功能,而无需更改我现有的所有测试.

我怎么做?

我在网上发现了类似的讨论,但还没有完全理解他们的答案.

mab*_*ham 39

这个问题现在在Google测试文档中得到解答(VladLosev 的答案在技​​术上是正确的,但可能稍微多一些工作)

具体来说,当您想要将参数添加到预先存在的夹具类时,您可以这样做

class MyFixtureTest : public ::testing::Test {
  ...
};
class MyParamFixtureTest : public MyFixtureTest,
                           public ::testing::WithParamInterface<MyParameterType> {
  ...
};

TEST_P(MyParamFixtureTest, MyTestName) { ... }
Run Code Online (Sandbox Code Playgroud)

  • 与VladLosev提出的相比,这看起来更清晰,更少工作(这在技术上是正确的,也可能是在ParamInterface不可用的时候) (5认同)

Vla*_*sev 22

问题是,对于常规测试,您的fixture必须从testing :: Test和参数化测试派生,它必须从test :: TestWithParam <>派生.

为了适应这种情况,您必须修改fixture类才能使用参数类型

template <class T> class MyFixtureBase : public T {
  void SetUp() { ... };
  // Put the rest of your original MyFixtureTest here.
};

// This will work with your non-parameterized tests.
class MyFixtureTest : public MyFixtureBase<testing::Test> {};

// This will be the fixture for all your parameterized tests.
// Just substitute the actual type of your parameters for MyParameterType.
class MyParamFixtureTest : public MyFixtureBase<
    testing::TestWithParam<MyParameterType> > {};
Run Code Online (Sandbox Code Playgroud)

这样,您可以在创建参数化测试时保持所有现有测试的完整性

TEST_P(MyParamFixtureTest, MyTestName) { ... }
Run Code Online (Sandbox Code Playgroud)