【问题标题】:How do I create flexible unit tests?如何创建灵活的单元测试?
【发布时间】:2008-11-14 21:23:43
【问题描述】:

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

我想知道我们是否可以做一些具体的事情来使单元测试更加灵活,这样它们就不会因为错误的原因而中断。

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

【问题讨论】:

    标签: unit-testing


    【解决方案1】:

    这是一个有点简单的答案,但显示了正确的心态:

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

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

    【讨论】:

      【解决方案2】:

      +1 给乔恩。说得好。

      我发现以更 BDD 的风格构建测试很有价值。那就是...拒绝每个类别的固定装置的心态,而不是每个上下文的固定装置。

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

      那些涵盖组织和干净/可读的测试。

      为了让我的测试不那么脆弱,我开始停止模拟。模拟框架对于消除依赖关系至关重要,但你模拟的越多,测试知道关于实现的越多。如果实现发生变化(但行为没有变化),那么您的测试不应该中断。

      【讨论】:

        【解决方案3】:

        也 +1 给乔恩。

        在典型的工程时尚中,答案总是“视情况而定”。

        我建议看一下“xUnit 测试模式:重构测试代码”一书。 (在这种情况下,x={J,N} 涵盖了 Java 和 .NET 世界,并不是明确打算用于新的实际称为 xUnit 框架。)

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

        【讨论】:

          【解决方案4】:

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

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

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

          1) 更改系统设计以简化测试设置,通常是通过应用 SRP 并在我们的课程中寻找责任漏洞。

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

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

          【讨论】:

            【解决方案5】:

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

            模拟对象的原因包括

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-12-31
              • 1970-01-01
              • 2017-03-10
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多