让我首先定义单元测试和端到端测试的含义。假设您有一个包含一堆 Java 类的程序:A 调用 B,B 调用 C,等等。
单元测试是针对 A 模拟出 B 的测试,以及针对 B 模拟出 C 的单独测试,依此类推。
端到端测试是对 A 的测试,它测试 A,并传递地测试 B 和 C。
为简单起见,并让讨论集中在手头的主题上,而不是被次要细节分散注意力,我们假设整个系统是无状态的:您使用输入调用顶层 (A),并且你得到一个输出。给定的输入只有一个有效的输出。
需要明确的是,我这里不包括外部系统,例如到其他服务器的 RPC、数据库、文件系统等外部状态、任何类型的 UI(“断言以编程方式点击 Delete 按钮会删除当前文档”)等. 我们只是在谈论同一进程中的一堆类。
现在,可以采取两种方法:
编写端到端测试,尝试覆盖所有可能的输入和状态。仅在需要时编写单元测试,例如,如果端到端测试没有充分测试特定类,或者端到端测试失败并且您发现编写单元测试来定位错误很有帮助。但总的来说,目标是进行彻底的端到端测试。
编写对每个类或组件进行详尽测试的单元测试。写一个端到端的测试作为事后的想法,或者根本不写。即使您编写它,也不要尝试详尽地测试所有可能的输入。
我更喜欢 (1),因为如果端到端测试通过并且详尽无遗,我知道整个系统适用于我测试的所有案例。然而,如果每个类或组件都能正常工作,那么它们之间的集成点仍然可能存在错误,这是我读到的大多数错误发生的地方(抱歉,我现在没有引用资料)。
那么,其中哪一个更适合您——进行彻底的端到端测试,还是进行彻底的单元测试?为什么?请给出具体原因,以便我和其他读者自己评估答案。
如果这个问题更适合programmers.stackexchange.com,请将它移到那里(版主)。
最佳答案
虽然无法对此类问题提供一般性答案,但根据经验,您应该考虑 Test Pyramid :
- 一些系统测试
- 一些集成测试
- 大量单元测试
原因是outlined by J.B. Rainsberger ,但它的要点是,对于任何相当复杂的应用程序,覆盖所有可能行为的组合爆炸会阻止除单元测试之外的任何东西的有效覆盖。您必须编写数万或数十万个集成测试才能知道您的系统是否正常工作。
关于unit-testing - 在两者都适用的情况下,端到端测试是否比单元测试更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30010024/