单元测试是测试代码在实际类中的测试。这个类的另一个依赖被mock或忽略了,因为重点是测试类内部的代码。
集成测试是涉及来自目标应用程序的磁盘访问、应用程序服务和/或框架的测试。集成测试与其他外部服务隔离运行。
我举个例子。您有一个 Spring 应用程序,并且您进行了大量单元测试以保证业务逻辑正常工作。完美的。但是你必须保证什么样的测试:
- 您的应用程序服务可以启动
- 您的数据库实体已正确映射
- 您拥有所有必要的注释按预期工作
- 你
Filter
的工作正常
- 您的 API 正在接受某种数据
- 您的主要功能确实在基本场景中工作
- 您的数据库查询按预期工作
- ETC...
这不能通过单元测试来完成,但作为开发人员,您需要保证所有的东西都正常工作。这是集成测试的目标。
理想的场景是独立于应用程序在生产环境中使用的另一个外部系统运行的集成测试。您可以使用 Wiremock 进行 Rest 调用、像 H2 这样的内存数据库、从调用外部系统的某些特定类中模拟 bean 等来实现这一点。
有点好奇,Maven 有一个特定的集成测试插件:maven failsafe plugin
,它执行名称以IT结尾的测试类(默认情况下)。示例:UserIT.java
。
对集成测试意味着什么的困惑
有些人将“集成测试”理解为涉及“集成”到当前系统使用的其他外部系统的测试。此类测试只能在您已启动并运行所有系统的环境中进行。没有虚假,没有嘲笑。
这可能只是一个命名问题,但我们缺少满足上述项目必要性的测试(我理解为集成测试)。相反,我们正在将单元测试(仅限测试类)定义为“集成”测试(整个真实系统)。如果不是集成测试,那么中间是什么?
您可以在Martin Fowler的这篇文章中阅读更多关于这种混淆的信息。他将“集成测试”一词分为两个含义:“广泛”和“狭义”集成测试:
狭窄的集成测试
- 只执行我的服务中与单独服务对话的那部分代码
- 使用这些服务的测试替身,无论是在进程中还是远程
- 因此由许多范围狭窄的测试组成,通常范围不比单元测试大(并且通常使用与单元测试相同的测试框架运行)
广泛的集成测试
- 需要所有服务的实时版本,需要大量的测试环境和网络访问
- 通过所有服务练习代码路径,而不仅仅是负责交互的代码
您可以获得更多关于这篇文章的详细信息。