|
此版本仍在开发中,尚未视为稳定版。如需最新稳定版本,请使用 Spring Boot 4.0.4! |
运行集成测试
虽然你可以非常轻松地直接从你的测试(或测试套件)中启动 Spring Boot 应用程序,但有时更希望在构建过程中处理这一点。
为了确保在集成测试前后正确管理 Spring Boot 应用程序的生命周期,你可以使用 start 和 stop 目标,如下例所示:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>pre-integration-test</id>
<goals>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>post-integration-test</id>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
现在,这种设置可以使用failsafe-plugin来运行您的集成测试,正如您所期望的那样。
应用程序在单独的进程中启动,并使用 JMX 与应用程序进行通信。
默认情况下,插件使用端口 9001。
如果需要配置 JMX 端口,请参阅专门的示例。 |
你也可以配置一个更高级的设置,在设置了特定属性时跳过集成测试,参见专门的示例。
在不使用 Spring Boot 父 POM 的情况下使用 Failsafe
Spring Boot 的父 POM spring-boot-starter-parent 将 Failsafe 的 <classesDirectory> 配置为 ${project.build.outputDirectory}。
如果没有此配置(该配置会使 Failsafe 使用编译后的 class 文件而非重新打包的 JAR 文件),Failsafe 将无法加载您的应用程序类。
如果您未使用父 POM,则应按照以下示例所示,以相同方式配置 Failsafe:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<configuration>
<classesDirectory>${project.build.outputDirectory}</classesDirectory>
</configuration>
</plugin>
spring-boot:start
org.springframework.boot:spring-boot-maven-plugin:4.1.0-M3
启动一个 Spring 应用程序。与 run 目标不同,此操作不会阻塞,并允许其他目标对应用程序进行操作。该目标通常用于集成测试场景中,在测试套件运行前启动应用程序,并在测试结束后停止。
可选参数
| 姓名 | 类型 | 默认 |
|---|---|---|
|
|
|
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
|
|
|
|
|
|
||
|
||
|
|
|
|
||
|
||
|
|
|
|
||
|
|
|
|
|
|
|
参数详情
addResources
直接将 Maven 资源添加到类路径中,这样就可以对资源进行实时原地编辑。重复的资源会从 target/classes 中移除,以防止在调用 ClassLoader.getResources() 时出现重复。建议您考虑将 spring-boot-devtools 添加到项目中,因为它不仅提供此功能,还包含许多其他特性。
姓名 |
|
|---|---|
类型 |
|
默认值 |
|
用户属性 |
|
Since |
|
additionalClasspathElements
应添加到类路径中的额外类路径元素。一个元素可以是包含类和资源的目录,也可以是一个 JAR 文件。
姓名 |
|
|---|---|
类型 |
|
默认值 |
|
用户属性 |
|
Since |
|
classesDirectory
包含用于运行应用程序的类和资源文件的目录。
姓名 |
|
|---|---|
类型 |
|
默认值 |
|
用户属性 |
|
Since |
|
commandlineArguments
应传递给应用程序的命令行参数。使用空格分隔多个参数,并确保将包含多个值的参数用引号括起来。当指定此选项时,其优先级高于 #arguments。
姓名 |
|
|---|---|
类型 |
|
默认值 |
|
用户属性 |
|
Since |
|
environmentVariables
应与用于运行应用程序的派生进程关联的环境变量列表。
姓名 |
|
|---|---|
类型 |
|
默认值 |
|
用户属性 |
|
Since |
|
excludeGroupIds
要排除的 groupId 名称的逗号分隔列表(精确匹配)。
姓名 |
|
|---|---|
类型 |
|
默认值 |
|
用户属性 |
|
Since |
|
excludes
要排除的构件定义集合。Exclude 元素定义了必需的 groupId 和 artifactId 组件,以及一个可选的 classifier 组件。当将其配置为属性时,值应以逗号分隔,各组件之间用冒号分隔:
groupId:artifactId,groupId:artifactId:classifier
姓名 |
|
|---|---|
类型 |
|
默认值 |
|
用户属性 |
|
Since |
|
includes
要包含的构件定义集合。Include 元素定义了必需的 groupId 和 artifactId 组件,以及一个可选的 classifier 组件。当配置为属性时,值应以逗号分隔,各组件之间用冒号分隔:
groupId:artifactId,groupId:artifactId:classifier
姓名 |
|
|---|---|
类型 |
|
默认值 |
|
用户属性 |
|
Since |
|
jmxName
自动部署的 MBean 的 JMX 名称,用于管理 Spring 应用程序的生命周期。
姓名 |
|
|---|---|
类型 |
|
默认值 |
|
用户属性 |
|
Since |
jvmArguments
应与用于运行应用程序的派生进程关联的 JVM 参数。在命令行中,请确保将多个值用引号括起来。
姓名 |
|
|---|---|
类型 |
|
默认值 |
|
用户属性 |
|
Since |
|
mainClass
主类的名称。如果未指定,则将使用找到的第一个包含 'main' 方法的已编译类。
姓名 |
|
|---|---|
类型 |
|
默认值 |
|
用户属性 |
|
Since |
|
maxAttempts
检查 Spring 应用程序是否就绪的最大尝试次数。结合“wait”参数,可得出一个全局超时值(默认为 30 秒)。
姓名 |
|
|---|---|
类型 |
|
默认值 |
|
用户属性 |
|
Since |
noverify
用于标识该代理需要使用 -noverify 参数。
姓名 |
|
|---|---|
类型 |
|
默认值 |
|
用户属性 |
|
Since |
|
profiles
要激活的 Spring 配置文件。这是指定 'spring.profiles.active' 参数的便捷快捷方式。在命令行中,请使用逗号分隔多个配置文件。
姓名 |
|
|---|---|
类型 |
|
默认值 |
|
用户属性 |
|
Since |
|
systemPropertyVariables
要传递给进程的 JVM 系统属性列表。
姓名 |
|
|---|---|
类型 |
|
默认值 |
|
用户属性 |
|
Since |
|
spring-boot:stop
org.springframework.boot:spring-boot-maven-plugin:4.1.0-M3
停止由“start”目标启动的应用程序。通常在测试套件完成之后调用。
可选参数
| 姓名 | 类型 | 默认 |
|---|---|---|
|
|
|
|
|
|
|
|
<h1>示例</h1>
用于集成测试的随机端口
Spring Boot 测试集成的一个很好的特性是,它可以为 Web 应用程序分配一个空闲端口。
当使用该插件的 start 目标时,Spring Boot 应用程序会单独启动,这使得很难将实际使用的端口传递给集成测试本身。
下面的示例展示了如何使用Build Helper Maven Plugin实现相同的功能:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<id>reserve-tomcat-port</id>
<goals>
<goal>reserve-network-port</goal>
</goals>
<phase>process-resources</phase>
<configuration>
<portNames>
<portName>tomcat.http.port</portName>
</portNames>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>pre-integration-test</id>
<goals>
<goal>start</goal>
</goals>
<configuration>
<arguments>
<argument>--server.port=${tomcat.http.port}</argument>
</arguments>
</configuration>
</execution>
<execution>
<id>post-integration-test</id>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<test.server.port>${tomcat.http.port}</test.server.port>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</build>
你现在可以在任意集成测试中获取 test.server.port 系统属性,以构建指向服务器的正确 URL。
自定义 JMX 端口
jmxPort 属性允许自定义插件用于与 Spring Boot 应用程序通信的端口。
此示例展示了在端口 9001 已被占用的情况下,如何自定义端口:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jmxPort>9009</jmxPort>
</configuration>
<executions>
<execution>
<id>pre-integration-test</id>
<goals>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>post-integration-test</id>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
| 如果你需要配置 JMX 端口,请确保像上面所示那样在全局配置中进行设置,以便两个目标(goals)都能共享该配置。 |
跳过集成测试
skip 属性允许完全跳过 Spring Boot Maven 插件的执行。
此示例展示了如何通过命令行属性跳过集成测试,同时仍确保 repackage 目标得以执行:
<project>
<properties>
<skip.it>false</skip.it>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>pre-integration-test</id>
<goals>
<goal>start</goal>
</goals>
<configuration>
<skip>${skip.it}</skip>
</configuration>
</execution>
<execution>
<id>post-integration-test</id>
<goals>
<goal>stop</goal>
</goals>
<configuration>
<skip>${skip.it}</skip>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<configuration>
<skip>${skip.it}</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
默认情况下,集成测试将会运行,但此设置允许您轻松地通过命令行禁用它们,如下所示:
$ mvn verify -Dskip.it=true