Alexis 在上面完整地描述了单元测试和集成测试之间的区别,但我觉得有必要加入 Java 的特殊性以及如何编写和注意单元测试和集成测试之间的区别。
单元测试
通常对于单元测试,模拟框架用于模拟特定类和特定方法的某些依赖项。由于使用单元测试,我们只想测试单个代码单元(类方法),我们不想担心该方法与之通信的其他类,因此我们模拟那些外部依赖项并经常 验证 对这些外部依赖项的方法调用是在没有实际运行外部方法的情况下执行的。
Mocking 是为您的应用程序编写强大测试的强大工具,它鼓励开发人员编写干净、精心设计和松散耦合 代码。
您将在整个 java 项目中看到的一个常见示例是 Mockito 框架。我建议阅读更多关于该主题的内容here。
集成测试
“为暴露接口中的缺陷以及集成组件或系统之间的交互中的缺陷而执行的测试。”
在java术语中,这通常是指类之间的交互。 A 类如何调用 B 类并确保它们之间的链接在数据传输、错误处理和控制流方面正常工作。集成测试通常不使用模拟框架,但在实践中可以。通常,您希望在不模拟依赖链接的情况下全面测试组件交互。但是,这取决于您在应用程序设计方面的需求。有关这方面的更多信息可以找到here
通常在集成测试中,数据库会针对其 CRUD(创建-读取-更新-删除)操作进行测试。单元测试与数据库没有连接。这是因为需要数据库连接的测试本质上会产生副作用。测试代码的“单个单元”的概念存在泄漏。因此,通常从集成测试开始对数据库进行测试。
要求此数据库连接通常会导致集成测试的运行速度比单元测试慢得多。这是因为需要为测试类的每组事务汇总数据库,并且通常如果您使用的是 IOC 容器(如 Spring),那么开销会更大到时间就会存在。通常,对于集成测试,我们使用测试数据库,而不是真正的数据库,并且通常在内存中。
总结
如果您的项目设计良好,则单元测试和集成测试应该按包隔离。它在概念上是有意义的,在架构上它是开发人员适应和感到舒适的更好方法。它还完全划清了什么是集成测试和什么是单元测试之间的界限。
单元测试非常快,应该是应用程序的基础测试套件。
在大多数情况下,由于需要数据库连接,集成测试可能会很慢,但可以涵盖比单元测试更多的变体。
单元测试通常使用模拟框架来模拟外部依赖项。
集成测试通常使用真正的依赖对象进行测试。
单元测试不应有数据库连接。
集成测试通常会连接到测试数据库。