我刚刚开始使用Gtest,我正在编写看起来像这样的测试:
TEST(testFamily, specificTest) {
initData data;
ASSERT_TRUE(boolean_algorithm(data));
}
问题是我的测试代码不必要地膨胀,因为我有很多可以使用相同数据的测试,所以行:
initData data;
每次测试都不应重复。我知道测试应该是相互独立的,在这方面,使用像常量全局
这样的东西const initData data;
带来诸如“您确定您的测试不会修改全局测试数据吗?”之类的问题。我应该继续为每个测试初始化相同的测试配置吗?有时初始化的测试数据需要比一行更多的代码....
答案 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)
我认为你的担忧归结为两件事:
请记住,测试应该分开的原因是因为如果需要,它们应该能够独立运行。在这方面,可以继续为每个测试重新初始化相同的上下文。
如果你担心测试代码的可维护性,一个想法是如果你有很多具有非常相似的上下文的测试,那么所有初始化的东西都可以被放入一个刚被调用的公共函数中。这将具有保持各个测试代码清洁的附加优势。