2

我想测试我的 Spring Boot 应用程序的层 - 服务、数据、控制器。

我知道使用 Spring Boot,我们可以在服务器参与或不参与的情况下测试这些(通过创建模拟环境)。所以我的问题是——测试这些层的最佳实践是什么?或者它是否取决于我们要测试的特定层?

4

1 回答 1

6

单元测试很简单。你坚持 SRP 原则,模拟所有协作者并单独测试。

在集成测试方面,没有明确的答案和明确的标准。它总是取决于您正在处理的项目,甚至是特定的功能。

在使用了一些 Spring Boot 应用程序之后,我倾向于将您的 IT 套件分为四个部分/类别:

1) REST API 测试

所以我们只测试@Restontrollers. 您使用@WebMvcTest(MyController.class)@WebFluxTest(MyController.class)取决于您使用的控制器类型。从服务层往下的任何东西都是模拟的。您尽可能多地强调输入参数/请求正文,并测试每种组合。

2) 存储库测试

仅验证 ORM 层的测试。你用@DataJpaTest这个。在这里,您可以测试您拥有的每个存储库方法的所有可能场景,而无需关心调用它的内容等。

3) 切片测试

这是您验证bean@Component@Servicebean 之间交互的地方。这是测试应用程序实际业务逻辑的地方。由您决定是通过 REST 发送数据还是使用对 top-most 的调用@Service。不过在这种情况下,我总是对@Repository图层进行存根。

4) 端到端测试

这些在真实的 Web 服务器上工作:

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)

这里没有什么是嘲笑的。

讨论

这里的关键是决定每个应该使用多少,记住切片测试可能是最重要的。

主要重点不应该放在端到端测试上。它们有点像句末的逗号。它们是最慢的并且需要最多的设置。因此,它们最容易出错、难以维护和难以理解。理想情况下,这些应该保持在最低限度(仅涵盖最关键的情况)。

此外,在运行您的 IT 套件时,它们应该按以下顺序分组:

1) 控制器测试

2) 切片测试

3) 存储库测试

4) E2E 测试

(从最快和需要最少环境交互到最慢)。

同样,由团队决定我们想要使用其中的哪些,以什么顺序和频率。

补充阅读: 我写了一篇关于常见集成测试错误的文章,它可以补充上面给出的信息,并在你的项目中进一步帮助你。

于 2019-08-21T07:47:47.830 回答