【问题标题】:TDD - how to define scope of integration test having isolated unit tests in place?TDD - 如何定义具有独立单元测试的集成测试范围?
【发布时间】:2012-06-21 21:48:49
【问题描述】:

假设我正在使用现有代码库中的一些代码开发新功能。 我正在测试我的设计,所以我对我的功能部件进行了独立的测试,使用 stubbed/mocked 的合作者。现在我想测试一下他们是否一起玩得很好。

我是否应该编写一个大型测试,将所有真正的依赖关系连接在一起(除了一些外部系统等)?换句话说,我应该为整个故事编写集成测试,还是将它分成几个较小的部分,测试让我们说 3-4 个对象一起玩只是这个故事的一部分?然后我最终会从头到尾为整个功能编写测试。但是我应该在一个测试用例中执行多少个对象的协作?

如果是后者,我需要准备设置(连接依赖关系,其中一些存根),为每个测试准备测试数据和预期条件。现在往上走(在更高层次上对越来越多的模块进行分组)我仍然需要以某种方式“复制”这个准备步骤。 这种“重复”不好吗?

我说的是“测试级别”,如下所示:

---------------------------------------------------------------
| ------------------------------------
|| ------  ------                    |
|| |unit|  |unit|  units integration |
|| ------  ------                    | 
|-------------------------------------     integration of some
|                                          already integrated
|-------------------------------------     units, etc
|| ------  ------                    |
|| |unit|  |unit|  units integration |
|| ------  ------                    | 
|-------------------------------------
|---------------------------------------------------------------

正如“经典”(而不是“嘲笑者”)TDD 从业者所说,我应该尽可能多地使用真正的实现。但是然后测试具有 3 级依赖关系并最终具有数据库或外部系统的对象意味着我仍然必须存根/模拟某些东西。那么我应该在最后只模拟这个繁重的/外部服务吗?

提出这个问题的触发因素是,保持我所有的测试得到维护变得越来越困难,我认为我在某个地方失败了。代码中的每一次中等更改都会导致大量测试失败。我想知道我做错了什么。

提前感谢所有提示和答案。

【问题讨论】:

  • 如果你在做 TDD,你的测试应该会失败。您先更改测试,然后更改代码直到通过。

标签: mocking tdd integration-testing


【解决方案1】:

反思为什么你的测试如此脆弱。 (一些my thoughts.. 虽然针对端到端测试)。我需要有关您的情况的更多信息来提出补救措施。

如果功能被破坏,测试应该失败 - 如果你重构你的代码,即通过行为保持转换改变结构,那么你的测试不应该被破坏。

我目前的方法是

  • 有许多微小的、集中的、超快速的单元测试(如果您将每个类与其依赖项隔离开,则为微测试)。这应该构成您的大部分测试
  • 集成测试:参考端口和适配器(六角形)架构。您的应用程序与外部子系统接口,例如数据库或 Web .. 清楚地定义您的应用程序和子系统之间的端口(接口)。接下来编写集成测试,以验证插入端口的任何实现是否符合您的合同(例如,您将测试 MySqlDataRepository 是否可以通过针对真实数据库进行测试来实际持久化信息)。通过这样做,您可以验证 MySqlDataRepository 是否有效。现在您的所有单元测试都不需要太慢了。您可以使用 mockDatabase 而不会失去任何信心
  • 最后,您需要进行一些端对端测试,以验证所有部件的接线是否正确。正如你所说,这些将是最慢和最痛苦的维护。但是它们有价值;您可以通过选择正确的端到端测试来最大程度地减少维护麻烦。

更多信息:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多