是O.K.在Google Test框架内的TDD周期中使用全局数据进行多项测试?

时间:2014-01-20 11:34:06

标签: c++ unit-testing tdd googletest

我刚刚开始使用Gtest,我正在编写看起来像这样的测试:

TEST(testFamily, specificTest) {
     initData data; 
     ASSERT_TRUE(boolean_algorithm(data)); 
}

问题是我的测试代码不必要地膨胀,因为我有很多可以使用相同数据的测试,所以行:

 initData data; 
每次测试都不应重复

。我知道测试应该是相互独立的,在这方面,使用像常量全局

这样的东西
const initData data; 

带来诸如“您确定您的测试不会修改全局测试数据吗?”之类的问题。我应该继续为每个测试初始化​​相同的测试配置吗?有时初始化的测试数据需要比一行更多的代码....

3 个答案:

答案 0 :(得分:2)

没关系,但我会在测试类中创建该对象,而不是在全局范围内创建(如Test Fixtures: Using the Same Data Configuration for Multiple Tests中所述)。

例如,像这样:

initData CreateData() 
{
    initData d;
    // set values
    return d;
}

class testFamily : public testing::Test
{
public:
    testFamily() :
            data( CreateData()  )
    {
    }
    ~testFamily()
    {
    }

    initData data;
};

TEST_F( testFamily, specificTest )
{
    ASSERT_TRUE(boolean_algorithm(data)); 
}

现在,只在一个地方(CreateData()函数)计算(或设置)数据结构。

答案 1 :(得分:1)

免责声明:我之前没有使用googletest!但是说......

在单元测试之间共享可修改数据绝不是一个好主意。单元测试应独立于任何其他单元测试,并且无论您运行单元测试的顺序都无关紧要。您通过共享数据运行的风险是作为修改数据的副作用(或后果)测试通过(或失败)。单元测试也应该非常快速地运行,如果花费太长时间,测试将被丢弃或永远不会运行(并且非常无意义)。

但现在的问题是,如果创建测试数据的代价是多少呢?如果您的测试数据依赖于单元测试之外的资源(数据库,网络连接等),那么您实际正在进行的是集成测试,这些测试运行起来很慢(如果数据没有被正确管理,则可以通过重置它来实现每次试运行。)

我在单元测试中重复使用静态(不可修改)数据没有任何问题(并在测试套件加载时进行设置)但重新使用可能以某种方式修改的数据是大禁忌。

也许你应该问自己的另一个问题是,我可以看看Mock还是Stub我需要的物品?

答案 2 :(得分:0)

我认为你的担忧归结为两件事:

  • 担心您不必要地消耗内存,或
  • 担心不必要地重复代码。

请记住,测试应该分开的原因是因为如果需要,它们应该能够独立运行。在这方面,可以继续为每个测试重新初始化相同的上下文。

如果你担心测试代码的可维护性,一个想法是如果你有很多具有非常相似的上下文的测试,那么所有初始化的东西都可以被放入一个刚被调用的公共函数中。这将具有保持各个测试代码清洁的附加优势。