每个测试用例必须在最后撤消它们的操作吗?

时间:2009-07-20 21:23:22

标签: c++ unit-testing

问题可能有点模糊,但这是我想知道的一个例子(伪代码):

//start test-case for CreateObject function
{
// initialization of parameters
MyObject *obj = CreateObject();
// test results
}
//end test-case for CreateObject function

在这种情况下是否还需要通过调用“DestroyObject”函数来释放内存? [这是产生这个问题的特殊情况]

我的个人观点是否定的,我不应该撤消该函数的功能,但如果进行了许多测试,我可以保持没有内存/资源用于该测试套件(不太可能发生但...... )。

你怎么看?在这种情况下以及一般情况下。

谢谢,

尤利安

4 个答案:

答案 0 :(得分:8)

在这种情况下,您应该释放测试用例已分配的内存。这样,您可以使用一个工具,让您运行测试并确认没有内存泄漏。让你的测试代码泄漏内存意味着这会失败,你无法确定漏洞是在测试中而不在你的生产代码中。

对于更一般的情况,测试应该清理他们所做的事情。大多数单元测试框架允许您实现tearDown()方法来执行此操作。这样,如果一个测试失败,您将知道该测试存在问题,而不是与另一个测试的交互。

答案 1 :(得分:4)

您应该尝试在堆栈上创建所有模拟对象(或使用智能指针)。这样,当测试功能超出范围时,它们会自动被破坏。

答案 2 :(得分:3)

与测试没有直接关系,但是如果您的C ++代码可以执行以下操作:

MyObject *obj = CreateObject();

其中“obj”不是智能指针或不是由类管理,那么你就有问题了。如果我正在写测试,我会说:

MyObject obj;
// tests on obj here

无论您的测试结果如何,都会正确销毁obj。如果可以避免,请不要在C ++中动态创建对象。

答案 3 :(得分:1)

通常,您希望测试隔离的代码路径和独立的功能,并且您希望每次都进行公平的测试。这意味着重新开始,准确设置您需要的内容,然后在您通过时放弃测试环境。这避免了不同测试用例留下可能改变后续运行的结果或行为的副作用的问题。这也意味着您可以保证您的测试彼此独立,并且您可以按任何顺序运行任何子集。

然而,你会发现,拥有套前和套件后的设置和拆卸方法也很常见,这些方法建立了一整套测试环境(如数据库或其他)。单元测试可以执行。