代码之家  ›  专栏  ›  技术社区  ›  INS

每个测试用例最终都必须撤销其操作吗?

  •  1
  • INS  · 技术社区  · 16 年前

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

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

    我个人的意见是不,我不应该撤消该函数所做的操作,但如果要进行许多测试,我可能会在没有内存/资源的情况下继续使用该测试套件(不太可能发生,但……)。

    你怎么认为?在这种情况下,也是在一般情况下。

    谢谢,

    尤利安

    4 回复  |  直到 16 年前
        1
  •  8
  •   aem    16 年前

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

    至于更一般的情况,测试应该清理他们所做的工作。大多数单元测试框架都允许您实现tearDown()方法来实现这一点。这样,如果一个测试失败,你就会知道这是该测试的问题,而不是与另一个测试的交互。

        2
  •  4
  •   Milan BabuÅ¡kov    16 年前

    你真的应该尝试在堆栈上创建所有模拟对象(或使用智能指针)。这样,当测试函数超出范围时,它们会自动被销毁。

        3
  •  3
  •   anon    16 年前

    MyObject *obj = CreateObject();
    

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

    MyObject obj;
    // tests on obj here
    

    无论测试结果如何,obj都会被正确销毁。如果可能的话,永远不要在C++中动态创建对象。

        4
  •  1
  •   Rob    16 年前

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

    然而,你会发现,有预套件和后套件设置和拆卸方法也很常见,这些方法设置了一个完整的测试环境(如数据库或其他任何东西),可以对其执行一系列单元测试。