猿问

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

我有两个 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。


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


慕斯709654
浏览 111回答 1
1回答

森栏

问题本身有些事情看起来不对劲,我会尽力澄清没有必要保留两个 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-pluginpom 然后在一个post-integration-test阶段运行另一个脚本来停止这两个应用程序
随时随地看视频慕课网APP

相关分类

Java
我要回答