【问题标题】:Google Test: Parameterized tests which use an existing test fixture class?谷歌测试:使用现有测试夹具类的参数化测试?
【发布时间】:2011-03-10 07:14:30
【问题描述】:

我有一个当前被许多测试使用的测试夹具类。

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

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

我该怎么做?

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

【问题讨论】:

    标签: c++ unit-testing googletest


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。我的问题是参数化测试夹具需要从 ::testing::TestWithParam 继承,而我当前的夹具仅从 ::testing::Test 继承。此外,使用参数化测试的测试使用 TEST_P 而不是 TEST_F 声明。任何想法如何解决这些差异?
    【解决方案2】:

    问题在于,对于常规测试,您的夹具必须从 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) { ... }
    

    【讨论】:

    • 不得不采用这个解决方案,因为我有一个不支持 WithParamInterface 的非常旧的 gtest 版本;
    【解决方案3】:

    这个问题现在在Google Test documentation 中得到了解答(来自 VladLosev 的answer 在技术上是正确的,但可能需要做更多的工作)

    具体来说,当你想给一个预先存在的fixture类添加参数时,你可以这样做

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

    【讨论】:

    • 与 VladLosev 提出的建议相比,这绝对看起来更干净,工作量也更少(这在技术上是正确的,也许是在 ParamInterface 不可用的时候)
    • 不要忘记,如果你在MyParamFixtureTest 中定义SetUp(),它应该调用MyFixtureTest::SetUp(),否则基类的设置将永远不会运行。
    • 如何使用MyParameterType类型的正确参数实例化MyParamFixtureTest
    猜你喜欢
    • 2012-05-02
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 2016-11-02
    • 2011-01-17
    • 2022-07-27
    相关资源
    最近更新 更多