1 回答
TA贡献1810条经验 获得超5个赞
问题本身有些事情看起来不对劲,我会尽力澄清
没有必要保留两个 Spring Boot 应用程序:一个src/test
在src\main
. 如果你确实需要使用两个不同的微服务——至少使用两个 maven 模块:
project |___ app1 | |__ src/main/java - app1 production code is here | |__ src/test/java - app1 tests are here | |__ pom.xml |___ app2 | |__ src/main/java - app2 production code is here | |__ src/test/java - app2 tests are here | |__ pom.xml |__ pom.xml
现在 Spring Boot 很好地支持在@SpringBootTest
注释的帮助下运行一个微服务,注释基本上试图在测试中模拟 Spring Boot 微服务的启动(具有配置管理、组件扫描等) 。并且由于 spring 配置缓存功能,您可以在测试用例之间重用相同的应用程序上下文。
通常 spring universe 中的集成测试测试一个特定的微服务,该微服务能够模拟出它的一些 bean,这些 bean 可以为外部组件提供集成点。
然而,如果你想运行 2 个应用程序,你可能需要一个完整的“系统测试”,因为你测试了这些组件之间的交互。这有点超出了 spring 本身的范围,它存在于一个 JVM 中并服务于一个进程(应用程序)。
因此,假设每个测试都是出于明确的特定原因而完成的,首先,问问自己到底想测试什么?
例如,如果您想测试应用程序 1 的内部逻辑,也许您根本不应该启动应用程序 2。例如,如果 app1 通过 HTTP/Rest 与 app2 交互,也许你应该使用某种模拟服务器,比如wiremock 或者,在 mockito 中模拟与该服务器交互的 bean,或者使用 Internal Spring Test 的模拟服务器来表示一个例如这里的远程应用程序
这适用于大多数情况。
现在,如果您真的需要一个系统测试来检查可能涉及许多应用程序的“业务流程”,请做好准备,有一天您将不得不创建另一个应用程序,然后测试将变得更加复杂。也许您应该考虑创建一个包含所有微服务的测试环境并从那里运行测试套件。然后自动化使用一些脚本创建环境并运行此脚本以创建环境并在其上运行测试,然后删除环境。您还需要关心(如果)您拥有的所有数据库、配置管理等。我建议与您工作场所的 Devops 人员讨论这个问题,他们可能会帮助您解决这个问题。你也可以和你的 QA 部门谈谈,询问项目的自动化,这可能是一项非常有趣的任务,通常每个公司都以自己的方式解决它。
如果您仍然需要从 maven 运行它,现在如何组织代码。
我会把系统测试放在一个单独的模块中(因为它们实际上既不属于 app1 也不属于 app2):
project |___ app1 | |__ src/main/java - app1 production code is here | |__ src/test/java - app1 tests are here | |__ pom.xml |___ app2 | |__ src/main/java - app2 production code is here | |__ src/test/java - app2 tests are here | |__ pom.xml |__ test-module | |__pom.xml //depends on app1, app2 | |__ src/test/java - all system tests are here |__ pom.xml
然后使这个模块同时依赖于 app1 和 app2,以便它们首先编译。然后考虑到当 Maven 构建此模块时,app1 和 app2 的工件已准备就绪。
Maven 的默认生命周期有一个阶段的概念,它基本上是您想要运行插件的挂钩点。因此,例如,您可以创建一个脚本来运行两个应用程序(具有配置的端口和所有内容),然后分阶段运行脚本,然后在您必须在测试模块中pre-integration-test
配置的帮助下将所有测试作为集成测试运行maven-failsafe-plugin
pom 然后在一个post-integration-test
阶段运行另一个脚本来停止这两个应用程序
添加回答
举报