【发布时间】:2008-11-14 21:23:43
【问题描述】:
我们目前正在使用单元测试来测试我们的项目。我们涵盖了大部分功能,但我认为我们的测试太脆弱了。
我想知道我们是否可以做一些具体的事情来使单元测试更加灵活,这样它们就不会因为错误的原因而中断。
一些答案提到要小心嘲笑太多......那么嘲笑的正当理由是什么?我认为这可能是我们的主要问题之一,但是当您的应用程序主要是一个动态的、数据库驱动的站点时,您如何摆脱模拟?
【问题讨论】:
标签: unit-testing
我们目前正在使用单元测试来测试我们的项目。我们涵盖了大部分功能,但我认为我们的测试太脆弱了。
我想知道我们是否可以做一些具体的事情来使单元测试更加灵活,这样它们就不会因为错误的原因而中断。
一些答案提到要小心嘲笑太多......那么嘲笑的正当理由是什么?我认为这可能是我们的主要问题之一,但是当您的应用程序主要是一个动态的、数据库驱动的站点时,您如何摆脱模拟?
【问题讨论】:
标签: unit-testing
这是一个有点简单的答案,但显示了正确的心态:
尽可能地——不要非常妨碍你——确保你在测试方法的“最终结果”而不关心它是如何到达那里的。需要注意的一件事是 mocking - 它非常有用,但很容易使您的测试变得脆弱。
【讨论】:
+1 给乔恩。说得好。
我发现以更 BDD 的风格构建测试很有价值。那就是...拒绝每个类别的固定装置的心态,而不是每个上下文的固定装置。
我还发现 RhinoMocks 3.5 的 AAA 语法要好得多。
那些涵盖组织和干净/可读的测试。
为了让我的测试不那么脆弱,我开始停止模拟。模拟框架对于消除依赖关系至关重要,但你模拟的越多,测试知道关于实现的越多。如果实现发生变化(但行为没有变化),那么您的测试不应该中断。
【讨论】:
也 +1 给乔恩。
在典型的工程时尚中,答案总是“视情况而定”。
我建议看一下“xUnit 测试模式:重构测试代码”一书。 (在这种情况下,x={J,N} 涵盖了 Java 和 .NET 世界,并不是明确打算用于新的实际称为 xUnit 框架。)
正如设计模式出现在 OO 世界中一样,模式也出现在 TDD 世界中。值得一看。
【讨论】:
我发现当我的测试具有以下属性时,它们往往更脆弱
1) 复杂地设置正确的状态以测试实际逻辑。 2)对模拟的许多期望。 3) 测试代码的可读性差。 4) 一般糟糕的系统设计。
为了解决这些问题,我们尝试执行以下操作
1) 更改系统设计以简化测试设置,通常是通过应用 SRP 并在我们的课程中寻找责任漏洞。
2) 使用模拟,而对模拟上执行的调用的数量或顺序没有明确的期望。
3) 将测试代码视为生产代码、执行代码、设计审查等。
【讨论】:
那么有什么正当理由 嘲讽?我认为这可能是其中之一 我们的主要问题,但是当你的 应用程序主要是动态的, 数据库驱动的网站,你怎么得到 远离嘲讽?
模拟对象的原因包括
【讨论】: