gpt4 book ai didi

java - 在集成测试之前启动主应用程序和测试应用程序

转载 作者:行者123 更新时间:2023-11-28 21:16:22 25 4
gpt4 key购买 nike

我有两个 spring boot 应用程序,一个在 src/test 中,另一个在 src/main 中。他们有自己独立的 app.properties 和独立的端口。

我想进行集成测试,在它运行之前,我希望它在我在 maven 中运行集成测试时启动这两个服务器。到目前为止,使用前后 maven 集成测试插件没有帮助,我似乎无法在 Spring Boot 中以编程方式启动它们。

此外,我已经意识到即使我使用 ActiveProfile 和 spring boot 测试指定集成测试也不会连接到我的主应用程序,它总是会启动我的测试应用程序。

我的主要应用:

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;


@SpringBootApplication
public class App
{
public static void main( String[] args )
{
new SpringApplicationBuilder(App.class)
.build()
.run(args);
}
}

我的测试应用:

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;

@SpringBootApplication
public class MockServerApp {
public static void main(String[] args) {
// TODO Auto-generated method stub
new SpringApplicationBuilder(MockServerApp.class)
.build()
.run(args);

}
}

我的集成测试

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.PropertySource;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;

import com.nulogix.billing.App;
import com.nulogix.billing.mockserver.MockServerApp;

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT,classes = {App.class})

public class BillingMediatorIT {


@Test
public void testOne(){



}
}

我的 App.class 连接到端口 28433,我的 MockServerApp.class 连接到端口 9119。

出于某种原因,我的测试仍然连接到 MockServerApp.class,因为它使用端口 9119。

如何解决此问题并使其启动两个应用程序预集成测试阶段。

最佳答案

问题本身有些地方看起来不对,我会尽力澄清

没有必要保留两个 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,或者使用将代表远程应用程序的内部 Spring Test 模拟服务器 like here for example

这适用于大多数情况。

现在,如果您真的需要一个系统测试来检查可能涉及许多应用程序的“业务流程”,请做好准备,有一天您将不得不创建另一个应用程序,然后测试将变得更加复杂。也许您应该考虑创建一个包含所有微服务的测试环境并从那里运行测试套件。然后使用一些脚本自动化环境创建并运行此脚本以创建环境并在其上运行测试,然后删除环境。您还需要关心(如果)您拥有的所有数据库、配置管理等。我建议与您工作场所的 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 的 Artifact 已准备就绪。

Maven 的默认生命周期有一个概念 phases这基本上是你想要运行插件的 Hook 点。因此,例如,您可以创建一个脚本来运行这两个应用程序(具有配置的端口和所有内容),然后在 pre-integration-test 阶段运行脚本然后在 maven-failsafe-plugin 的帮助下将所有测试作为集成测试运行,您必须在测试模块 pom 和 post-integration-test 中进行配置> 阶段性地运行另一个将停止两个应用程序的脚本

关于java - 在集成测试之前启动主应用程序和测试应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57549738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com