如何创建灵活的单元测试?

时间:2008-11-07 17:53:19

标签: unit-testing

我们目前正在使用单元测试来测试我们的项目。我们涵盖了大部分功能,但我认为我们的测试太脆弱了。

我想知道我们是否有任何特定的事情可以使单元测试更加灵活,因此它们不会因为错误的原因而中断。

有几个答案提到要小心嘲笑太多......那么嘲笑的正当理由是什么?我认为这可能是我们的主要问题之一,但是当你的应用程序主要是一个动态的,数据库驱动的网站时,你如何摆脱嘲弄?

5 个答案:

答案 0 :(得分:17)

这是一个有点简单的答案,但表现出正确的心态:

  • 如果行为以您关心的方式发生变化,测试应该中断。
  • 如果行为以您不关心的方式发生变化,测试应继续有效。

尽可能 - 不要远离 - 确保你正在测试方法的“最终结果”而不关心它是如何到达那里的。需要注意的一件事是嘲笑 - 它非常有用,但很容易使你的测试变得脆弱。

答案 1 :(得分:5)

+1给Jon。好吧。

我发现以更多BDD风格构建我的测试有很多价值。那就是......拒绝每类固定装置的思维方式,而是选择每个上下文的装置。

我还发现RhinoMocks 3.5的AAA语法要好得多。

这些涵盖组织和清洁/可读测试。

为了让我的测试变得不那么脆弱,我开始重新开始嘲笑。模拟框架对于存根依赖关系至关重要,但模拟的越多,知道关于实现的测试越多。如果实现发生了变化(但行为没有改变)那么你的测试就不会破坏。

答案 2 :(得分:3)

同样+1给Jon。

在典型的工程方式中,答案始终是“它取决于”。

我建议你看一下“xUnit测试模式:重构测试代码”这本书。 (在这种情况下,x = {J,N}既可以覆盖Java和.NET世界,也不会明确地用于新的实际调用的xUnit框架。)

正如OO世界中出现的设计模式一样,TDD世界也出现了模式。值得一看。

答案 3 :(得分:2)

我发现当我的测试具有以下属性时,它们往往更脆弱

1)复杂地设置正确的状态以便测试实际的逻辑。 2)对嘲笑的期望很高。 3)测试代码的可读性差。 4)一般糟糕的系统设计。

为解决这些问题,我们尝试执行以下操作

1)更改系统设计以便简化测试设置,通常是通过应用SRP并在我们班级中查找责任泄漏。

2)使用模拟而没有明确期望模拟上执行的调用的数量或顺序。

3)将测试代码视为生产代码,执行代码,设计评审等。

答案 4 :(得分:0)

  

那么合理的原因是什么   嘲讽?我认为这可能是其中之一   我们的主要问题,但当你的   应用程序主要是动态的,   数据库驱动的网站,你怎么得到的   远离嘲笑?

模拟对象的原因包括

  • 对象是或使用外部资源,如数据库,网络,文件系统
  • object是一个GUI
  • 对象尚未[可用]
  • 对象行为不确定
  • 设置对象的费用很高