24

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

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

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

我怎么做?

我在网上找到了类似的讨论,但没有完全理解他们的答案。

4

3 回答 3

49

这个问题现在在谷歌测试文档中得到了回答(VladLosev 的回答在技术上是正确的,但可能需要做更多的工作)

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

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

TEST_P(MyParamFixtureTest, MyTestName) { ... }
于 2014-01-14T16:34:11.913 回答
24

问题在于,对于常规测试,您的夹具必须从 testing::Test 派生,而对于参数化测试,它必须从 testing::TestWithParam<> 派生。

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

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> > {};

这样,您可以在使用创建参数化测试时保持所有现有测试不变

TEST_P(MyParamFixtureTest, MyTestName) { ... }
于 2010-07-14T21:55:54.017 回答
0

如果您创建一个派生自这个通用夹具的新夹具,而不是在该派生类上创建参数化测试 - 这会帮助您并解决您的问题吗?

来自 Google Test wiki 页面:“在 Google Test 中,您通过将共享逻辑放入基本测试夹具中来在测试用例之间共享夹具,然后从该基础为每个想要使用此通用逻辑的测试用例派生一个单独的夹具。”

于 2010-07-02T04:51:51.123 回答