What is the best way to test Spring Boot application? With server involvement or by creating mock environment?

Der*_*ick 2 java integration-testing springmockito spring-boot spring-boot-test

I want to test my Spring Boot application's layers - service, data, controllers.

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

Mac*_*ski 5

单元测试非常简单..您坚持SRP原则,模拟出所有协作者并进行独立测试。

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

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

1)REST API测试

因此,我们仅测试@Restontrollers。您使用@WebMvcTest(MyController.class)@WebFluxTest(MyController.class)取决于使用的控制器类型。从服务层到底层的任何事物都将被模拟。您尽可能强调输入参数/请求正文,并从每种组合中测试地狱。

2)存储库测试

测试仅验证ORM层。您@DataJpaTest用于此。在这里,您可以针对每种存储库方法测试每种可能的情况,而无需关心调用它的内容等。

3)切片测试

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

4)端到端测试

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

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)

这里什么都没有嘲笑。

讨论区

这里的关键是确定应使用每种方法的量,同时要记住,切片测试可能是最重要的。

当然,不应将主要重点放在E2E测试上。它们在句子结尾有点像逗号。它们是最慢的,需要最多的设置。因此,它们最容易出错,难以维护且难以理解。理想情况下,应将这些限制降至最低(仅涵盖最关键的情况)。

同样,在运行IT套件时,应按以下顺序将它们分组:

1)控制器测试

2)切片测试

3)存储库测试

4)端到端测试

(从最快的,要求最少的环境交互到最慢的交互)。

同样,由团队决定我们要使用哪个,以什么顺序和频率使用。

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