在两者都适用的情况下,端到端测试是否比单元测试好?

Vad*_*ick 3 integration-testing unit-testing end-to-end

首先让我定义一下单元测试和端到端测试的含义。假设您有一个带有一堆Java类的程序:A调用B,B调用C,依此类推。

单元测试是针对A模仿B的测试,另外是针对B模仿C的测试,依此类推。

端到端测试是针对A的测试,该测试对A以及可传递的B和C进行测试。

为简单起见,并且为了使讨论集中于当前主题,而不是被次要细节分散注意力,让我们假设系统总体上是无状态的:您使用输入调用顶层(A),然后得到一个输出。给定输入只有一个有效输出。

需要明确的是,我这里没有包括外部系统,例如到其他服务器的RPC,数据库,外部状态(例如文件系统),任何类型的UI(“以编程方式点击Delete按钮来删除当前文档”)等等。我们只是在谈论同一过程中的一堆类。

现在,可以采用两种方法:

  1. 编写端对端测试,尝试覆盖所有可能的输入和状态。仅在需要时才编写单元测试,例如,如果某个特定的类没有通过端到端测试进行充分测试,或者端到端测试失败,并且发现编写单元测试来本地化错误很有帮助。但总的来说,目标是进行全面的端到端测试。

  2. 编写单元测试以详尽地测试每个类或组件。写一个端到端的测试作为事后的想法,或者根本不做。即使编写它,也不要尝试详尽地测试所有可能的输入。

我更喜欢(1),因为如果端到端测试通过并且是详尽无遗的,那么我知道该系统对于我测试的所有情况都适用。尽管每个类或组件均能正常工作,但它们之间的集成点仍可能存在错误,这是我看到的大多数错误发生的地方(对不起,我现在没有参考)。

那么,以下哪一项对您更有效-进行了全面的端到端测试或进行了完整的单元测试?为什么?请给出具体原因,以便我和其他读者自己评估答案。

如果这个问题更适合Programmer.stackexchange.com,请移至那里(主持人)。

Mar*_*ann 5

虽然不可能为这样的问题提供一般性的答案,但是根据经验,您应该考虑使用“ 测试金字塔”

  • 一些系统测试
  • 一些集成测试
  • 大量的单元测试

原因由JB Rainsberger概述,但要点是,对于任何相当复杂的应用程序,涵盖所有可能行为的组合爆炸会阻止除单元测试以外的任何内容有效覆盖。您必须编写成千上万的集成测试,才能知道系统是否正常运行。

  • @KartickVaddadi确实取决于您的意思。正如[Steve Freeman解释的那样,您可能关心故障安全系统或“安全故障”系统](http://www.higherorderlogic.com/2011/04/tdd-embracing-failure)。如果要进行后者,则可能不需要太多的* coverage *,在这种情况下,可能只需要集成测试。但是,从JB Rainsberger的博览会中可以很明显地看出,对于任何非平凡的应用程序,您都需要进行单元测试才能获得合理的覆盖率。 (2认同)