【问题标题】:Understanding testing (BDD) — Can I skip Unit Test duplicating something that is already covered in certain Integration Test?理解测试 (BDD) — 我可以跳过单元测试来复制某些集成测试中已经涵盖的内容吗?
【发布时间】:2011-11-17 11:56:15
【问题描述】:

注意:之前有类似的问题(BDD And Unit Testing),但没有真正的直接答案。只需链接到这本书。

假设我们测试个人资料页面。用户提交他的数据。

  • 验证失败 - 我们通知他,对象未更新。
  • 验证通过 - 他被重定向到带有提交数据的个人资料页面。对象已更新。酷!

那么,如果我在 BDD 期间测试了验证是否正常工作,我是否需要使用单元测试对其进行仔细检查?或者我可以跳过它?在这种情况下,正确的做法是什么?为什么?

【问题讨论】:

  • 集成测试通常很慢。单元测试很快,因为它们只涉及一个对象,不使用数据库或文件系统等。一旦你有 10,000 个测试,你就会关心能够只运行单元测试而不是等待集成测试。

标签: unit-testing tdd integration-testing bdd


【解决方案1】:

集成测试检查您的部件是否以正确的方式协同工作。

单元测试涵盖每个部分本身的正确功能。

所以,答案分为两部分:

  1. 不,您不应该跳过它。集成测试在整个页面(包括其所有模块)的上下文中测试您的验证。进行验证的模块肯定也应该有单元测试来测试它(就像单元测试一样)。
  2. 您永远不会使用集成测试和单元测试来测试相同的东西。在集成测试中,您测试了页面在某些输入下的行为。在单元测试中,如果您正在测试自包含模块,您甚至可以忽略您在页面中。即使该模块验证了一些数据并做出了一些决定。您只需对该验证过程和该决策的结果进行单元测试。

【讨论】:

  • 谢谢,对我来说更清楚了。实际上可能会尝试The RSpec Book
【解决方案2】:

如果验证逻辑很简单,请继续忽略 TDD 教条。您不会从“适当的”单元测试中获得太多收益。

但是如果验证很复杂,您可能无法在集成测试中测试所有极端情况(或者如果您这样做,测试将需要很长时间才能运行并且很脆弱,即经常中断各种原因,当它们破裂时,有时很难确定原因。

单元测试受这些问题的影响要小得多,因此它们可以用来补充集成测试。

【讨论】:

  • 请问什么是 TDD 教条?是否以某种方式与单元测试有关?
  • @jibiel:TDD 教条是每个类都必须进行单元测试,必须使用模拟完全隔离地测试该类,并且每个测试都必须测试一件事。不允许有任何例外,如果它太难,那么你必须重构,直到它不是。我碰巧认为这是一个值得向往的理想,但通常不切实际且效率低下,而且您可以获得很多好处,而无需一直遵守所有规则。
  • 在TDD视图中,测试不是为了测试(你肯定知道,只是为了给其他人添加第二个视图)。测试是 1. 开发工具,使您能够创建具有良好设计的简单代码(这就是您对“您必须重构直到它不是”的抱怨——如果它不容易测试,那么您就有设计问题); 2. 它们作为代码特性的(可执行)文档;只有 3.(作为一个令人愉快的副作用,我会说)是他们自动测试代码行为正确的能力。你可以放宽规则,但在你知道为什么会这样之前不能。为此,您必须使用它们。
  • @Michael - ...in complete isolation using mocks 不是 TDD 的一部分。这就像试图说重构是 TDD。没有意义。模拟和重构是工具!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
相关资源
最近更新 更多