GoogleTest:尝试使用测试获取抽象基类,然后使用derrived类来定义多个测试场景

时间:2014-07-29 14:09:25

标签: googletest

在尝试对某些代码进行BDD样式测试时,我有一组测试,我希望在多个场景中执行这些测试。我已经在C#中使用NUnit& NSubstitute但我正在努力用GoogleTest实现C ++代码的预期结果。

我想做的概念 - 但由于BaseTest中的纯虚方法而无法编译:

class BaseTest : public ::testing::Test {
protected:
    int expected = 0;
    int actual = 0;

    virtual void SetUp() {  printf("BaseTest SetUp()\r\n"); }
    virtual void TearDown() {  printf("BaseTest TearDown()\r\n"); }
    virtual void PureVirtual() = 0;
};

TEST_F(BaseTest, BaseTest1)
{
    printf("BaseTest BaseTest1\r\n");
    ASSERT_EQ(expected, actual);
}

class ScenarioOne: public BaseTest {
public:
    virtual void SetUp()
    {
        BaseTest::SetUp();
        printf("ScenarioOne SetUp()\r\n"); 
        actual = 20;
        expected = 20;
    }

    virtual void PureVirtual() {}
};

class ScenarioTwo: public BaseTest {
public:
    virtual void SetUp()
    {
        BaseTest::SetUp();
        printf("ScenarioTwo SetUp()\r\n"); 
        actual = 98;
        expected = 98;
    }

    virtual void PureVirtual() {}
};

上面的代码大大简化了,BaseTest类将定义30多个测试,Scenario类将拥有广泛而复杂的输入数据来运行被测试的代码,预期的结果将是相当大且非繁琐的 - 因此在派生类SetUp()方法中的想法,定义输入数据和预期结果,并用输入数据刺激测试中的代码。然后,基类中的测试将根据预期结果测试各种实际结果,并在适当时通过/失败。

我考虑过尝试使用参数化测试,但由于输入数据的复杂性和预期结果,这看起来很难,而且对于每个新的测试场景,我认为这意味着修改每个测试以提供输入数据和预期结果作为附加参数。

正如我之前所说,我可以在C#中轻松完成这类工作,但遗憾的是我此时正在开发一个C ++项目。我试图用GoogleTest做什么?

1 个答案:

答案 0 :(得分:3)

好的 - 我刚想到了一个潜在的解决方案。

将所有测试放在头文件中,如下所示:

// Tests.h - Tests to be performed for all test scenarios
TEST_F(SCENARIO_NAME, test1)
{
    ASSERT_EQ(expected, actual);
}

BaseTest类只有基本的SetUp()/ TearDown()方法,成员变量用于保存预期和实际结果以及派生场景类的任何辅助函数 - 但是如果需要,没有测试可以是抽象的。

然后针对每个场景:

class ScenarioOne: public BaseTest 
{
public:
    virtual void SetUp()
    {
        BaseTest::SetUp();
        printf("ScenarioOne SetUp()\r\n"); 
        actual = 20;
        expected = 20;
    }
};

#define SCENARIO_NAME ScenarioOne
#include "Tests.h"

结果效果是一组定义的测试,然后可以应用于多个测试场景。

这看起来有点像作弊,所以如果有人有更好的方法,我会感兴趣。