我想测试我的 Spring Boot 应用程序的层 - 服务、数据、控制器。
我知道使用 Spring Boot,我们可以在服务器参与或不参与的情况下测试这些(通过创建模拟环境)。所以我的问题是——测试这些层的最佳实践是什么?或者它是否取决于我们要测试的特定层?
我想测试我的 Spring Boot 应用程序的层 - 服务、数据、控制器。
我知道使用 Spring Boot,我们可以在服务器参与或不参与的情况下测试这些(通过创建模拟环境)。所以我的问题是——测试这些层的最佳实践是什么?或者它是否取决于我们要测试的特定层?
单元测试很简单。你坚持 SRP 原则,模拟所有协作者并单独测试。
在集成测试方面,没有明确的答案和明确的标准。它总是取决于您正在处理的项目,甚至是特定的功能。
在使用了一些 Spring Boot 应用程序之后,我倾向于将您的 IT 套件分为四个部分/类别:
1) REST API 测试
所以我们只测试@Restontrollers
. 您使用@WebMvcTest(MyController.class)
或@WebFluxTest(MyController.class)
取决于您使用的控制器类型。从服务层往下的任何东西都是模拟的。您尽可能多地强调输入参数/请求正文,并测试每种组合。
2) 存储库测试
仅验证 ORM 层的测试。你用@DataJpaTest
这个。在这里,您可以测试您拥有的每个存储库方法的所有可能场景,而无需关心调用它的内容等。
3) 切片测试
这是您验证bean@Component
和@Service
bean 之间交互的地方。这是测试应用程序实际业务逻辑的地方。由您决定是通过 REST 发送数据还是使用对 top-most 的调用@Service
。不过在这种情况下,我总是对@Repository
图层进行存根。
4) 端到端测试
这些在真实的 Web 服务器上工作:
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
这里没有什么是嘲笑的。
讨论
这里的关键是决定每个应该使用多少,记住切片测试可能是最重要的。
主要重点不应该放在端到端测试上。它们有点像句末的逗号。它们是最慢的并且需要最多的设置。因此,它们最容易出错、难以维护和难以理解。理想情况下,这些应该保持在最低限度(仅涵盖最关键的情况)。
此外,在运行您的 IT 套件时,它们应该按以下顺序分组:
1) 控制器测试
2) 切片测试
3) 存储库测试
4) E2E 测试
(从最快和需要最少环境交互到最慢)。
同样,由团队决定我们想要使用其中的哪些,以什么顺序和频率。
补充阅读: 我写了一篇关于常见集成测试错误的文章,它可以补充上面给出的信息,并在你的项目中进一步帮助你。