一尘不染

在Maven下对多个Spring Boot应用程序进行端到端集成测试

spring-boot

SpringMaven构建的验证阶段为多个启动应用程序运行端到端集成测试的推荐方法是什么?

基本上,我有一个多模块Maven项目,其中几个模块是单独的spring
boot应用程序。这些单独的应用程序具有自己的数据源配置,与JMS队列的集成流等。例如,应用程序A将轮询数据库以查找事件,当事件A发生时,它将生成JSON数据文件并将消息放入JMS队列。应用程序B正在轮询JMS队列,因此接收消息,读取文件,使用另一个数据库进行一些处理,然后将消息放入另一个队列。然后,应用程序C将接收该消息,等等,等等。

我已经为各个应用程序设置了集成测试;它们在Maven故障安全插件下运行。但是,我想在Maven下端到端地集成测试整个系统。我已经在专为此任务的项目中设置了一个单独的模块,因此希望该模块的验证构建阶段可以使用其他从属模块进行端到端测试。

是否有最佳做法来做到这一点?我看到3种可能的方式:

  1. 将每个应用程序的配置加载到相同的应用程序上下文中。但是,由于存在多个数据源等,因此会产生冲突,因此必须手动配置所有这些数据源,才能启用端到端集成测试-因此我觉得这是错误的。
  2. 作为一个单独的过程启动每个应用程序-如果测试模块的构建停止/崩溃/崩溃等,如何正确跟踪它们并确保它们被关闭?
  3. 有没有一种方法可以在同一过程中轻松加载单独的Spring Boot应用程序,每个应用程序都有自己的配置上下文?这似乎是最明智的选择。是否有关于Maven构建/故障安全插件的注意事项?

阅读 287

收藏
2020-05-30

共1个答案

一尘不染

非常好的问题!我自己会对其他人的回答感兴趣。我会分享我的意见。

在我的理解中,您首先应该知道要测试什么。集成测试应该与至少一部分应用程序一起使用,并确保您开发的组件在半真实的环境中可以正常工作。看来您已经做到了。

现在,关于系统测试(我有意区分集成测试和系统测试)。这些应该“模仿”质量检查人员:)因此,他们将系统视为黑匣子。他们不能调用任何内部API并运行真实流。端到端测试IMO属于此类。

在这种情况下,您想将它们与生产环境中部署的系统和生产环境中的类路径进行比较。

因此,我并不真的像您一样相信选项1。

关于选项3,我不确定它是否也是一个好的解决方案。即使您在不同的应用程序上下文中运行您的内容(我不太了解Spring引导,因此我在技术上也无法对此发表评论),但据我所知,它们将在运行时共享相同的类路径,因此您可能有风险在您的第三方之间发生冲突(尽管我知道spring
boot本身定义了很多版本的jar,但您知道我的意思),尤其是当您仅升级一个模块并可能更改依赖项时。因此,当您按照这种方法运行时,您实际上并不真正知道内存中到底运行了什么。

因此,对于 端到端
测试,我将选择选项2。关于同步,该选项可能是在应用程序级别实现一些逻辑,并在操作系统级别实现进程状态跟踪。我要评论的另一点是,一般而言,端到端测试仍然是功能测试(它们检查系统的功能行为),因此,一般而言,您不应在每次测试中都检查系统崩溃。如果检查每个流的系统崩溃,这些测试将太慢。当然,您可以维护一个相对较小的测试套件来检查极端情况。

希望这可以帮助

2020-05-30