运行集成测试

虽然你可以很容易地从测试(或测试套件)本身启动 Spring Boot 应用程序,但可能需要在构建本身中处理它。 要确保 Spring Boot 应用程序的生命周期围绕集成测试得到正确管理,你可以使用 和 目标,如以下示例所示:startstopspring-doc.cn

<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 来运行您的集成测试,就像您所期望的那样。spring-doc.cn

应用程序在单独的进程中启动,JMX 用于与应用程序通信。 默认情况下,插件使用 port . 如果您需要配置 JMX 端口,请参阅专用示例9001

您还可以配置更高级的设置,以便在设置特定属性时跳过集成测试,请参阅专用示例spring-doc.cn

在没有 Spring Boot 的父 POM 的情况下使用 Failsafe

Spring Boot 的父 POM 将 Failsafe 配置为 。 如果没有此配置,这会导致 Failsafe 使用已编译的类而不是重新打包的 jar,则 Failsafe 无法加载应用程序的类。 如果您不使用父 POM,则应以相同的方式配置 Failsafe,如以下示例所示:spring-boot-starter-parent<classesDirectory>${project.build.outputDirectory}spring-doc.cn

<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:3.4.0spring-doc.cn

启动 Spring 应用程序。与目标相反,这不会阻止并允许其他目标对应用程序进行操作。此目标通常用于集成测试方案,其中应用程序在测试套件之前启动,并在测试套件之后停止。runspring-doc.cn

必需参数

名字 类型 违约

classes目录spring-doc.cn

Filespring-doc.cn

${project.build.outputDirectory}spring-doc.cn

参数详情

addResources

将 maven 资源直接添加到 Classpath 中,这允许对资源进行实时就地编辑。从中删除重复的资源,以防止它们在调用时出现两次。请考虑添加到您的项目中,因为它提供了此功能以及更多功能。target/classesClassLoader.getResources()spring-boot-devtoolsspring-doc.cn

名字spring-doc.cn

addResourcesspring-doc.cn

类型spring-doc.cn

booleanspring-doc.cn

默认值spring-doc.cn

falsespring-doc.cn

用户属性spring-doc.cn

spring-boot.run.addResourcesspring-doc.cn

因为spring-doc.cn

1.0.0spring-doc.cn

additionalClasspathElements

应添加到 Classpath 中的其他 Classpath 元素。元素可以是包含类和资源的目录,也可以是 jar 文件。spring-doc.cn

名字spring-doc.cn

additionalClasspathElementsspring-doc.cn

类型spring-doc.cn

java.lang.String[]spring-doc.cn

默认值spring-doc.cn

用户属性spring-doc.cn

spring-boot.run.additional-classpath-elementsspring-doc.cn

因为spring-doc.cn

3.2.0spring-doc.cn

agents

代理 jar 的路径。spring-doc.cn

名字spring-doc.cn

agentsspring-doc.cn

类型spring-doc.cn

java.io.File[]spring-doc.cn

默认值spring-doc.cn

用户属性spring-doc.cn

spring-boot.run.agentsspring-doc.cn

因为spring-doc.cn

2.2.0spring-doc.cn

arguments

应传递给应用程序的参数。spring-doc.cn

名字spring-doc.cn

argumentsspring-doc.cn

类型spring-doc.cn

java.lang.String[]spring-doc.cn

默认值spring-doc.cn

用户属性spring-doc.cn

因为spring-doc.cn

1.0.0spring-doc.cn

classesDirectory

包含应该用于运行应用程序的类和资源文件的目录。spring-doc.cn

名字spring-doc.cn

classesDirectoryspring-doc.cn

类型spring-doc.cn

java.io.Filespring-doc.cn

默认值spring-doc.cn

${project.build.outputDirectory}spring-doc.cn

用户属性spring-doc.cn

因为spring-doc.cn

1.0.0spring-doc.cn

commandlineArguments

命令行中应传递给应用程序的参数。使用空格分隔多个参数,并确保在引号之间将多个值括起来。指定后,优先于 。#argumentsspring-doc.cn

名字spring-doc.cn

commandlineArgumentsspring-doc.cn

类型spring-doc.cn

java.lang.Stringspring-doc.cn

默认值spring-doc.cn

用户属性spring-doc.cn

spring-boot.run.argumentsspring-doc.cn

因为spring-doc.cn

2.2.3spring-doc.cn

environmentVariables

应与用于运行应用程序的分叉进程关联的环境变量列表。spring-doc.cn

名字spring-doc.cn

environmentVariablesspring-doc.cn

类型spring-doc.cn

java.util.Mapspring-doc.cn

默认值spring-doc.cn

用户属性spring-doc.cn

因为spring-doc.cn

2.1.0spring-doc.cn

excludeGroupIds

要排除的 groupId 名称的逗号分隔列表(完全匹配)。spring-doc.cn

名字spring-doc.cn

excludeGroupIdsspring-doc.cn

类型spring-doc.cn

java.lang.Stringspring-doc.cn

默认值spring-doc.cn

用户属性spring-doc.cn

spring-boot.excludeGroupIdsspring-doc.cn

因为spring-doc.cn

1.1.0spring-doc.cn

excludes

要排除的项目定义的集合。该元素定义 mandatory 和 components 以及 optional component。当配置为属性时,值应使用冒号分隔的组件进行逗号分隔:ExcludegroupIdartifactIdclassifiergroupId:artifactId,groupId:artifactId:classifierspring-doc.cn

名字spring-doc.cn

excludesspring-doc.cn

类型spring-doc.cn

java.util.Listspring-doc.cn

默认值spring-doc.cn

用户属性spring-doc.cn

spring-boot.excludesspring-doc.cn

因为spring-doc.cn

1.1.0spring-doc.cn

includes

要包含的项目定义的集合。该元素定义 mandatory 和 components 以及 optional component。当配置为属性时,值应使用冒号分隔的组件进行逗号分隔:IncludegroupIdartifactIdclassifiergroupId:artifactId,groupId:artifactId:classifierspring-doc.cn

名字spring-doc.cn

includesspring-doc.cn

类型spring-doc.cn

java.util.Listspring-doc.cn

默认值spring-doc.cn

用户属性spring-doc.cn

spring-boot.includesspring-doc.cn

因为spring-doc.cn

1.2.0spring-doc.cn

jmxName

自动部署的 MBean 的 JMX 名称,用于管理 Spring 应用程序的生命周期。spring-doc.cn

名字spring-doc.cn

jmxNamespring-doc.cn

类型spring-doc.cn

java.lang.Stringspring-doc.cn

默认值spring-doc.cn

org.springframework.boot:type=Admin,name=SpringApplicationspring-doc.cn

用户属性spring-doc.cn

因为spring-doc.cn

jmxPort

用于公开平台 MBeanServer 的端口。spring-doc.cn

名字spring-doc.cn

jmxPortspring-doc.cn

类型spring-doc.cn

intspring-doc.cn

默认值spring-doc.cn

9001spring-doc.cn

用户属性spring-doc.cn

因为spring-doc.cn

jvmArguments

JVM 参数,这些参数应该与用于运行应用程序的分叉进程相关联。在命令行上,确保在引号之间将多个值括起来。spring-doc.cn

名字spring-doc.cn

jvmArgumentsspring-doc.cn

类型spring-doc.cn

java.lang.Stringspring-doc.cn

默认值spring-doc.cn

用户属性spring-doc.cn

spring-boot.run.jvmArgumentsspring-doc.cn

因为spring-doc.cn

1.1.0spring-doc.cn

mainClass

主类的名称。如果未指定,则将使用找到的第一个包含 'main' 方法的编译类。spring-doc.cn

名字spring-doc.cn

mainClassspring-doc.cn

类型spring-doc.cn

java.lang.Stringspring-doc.cn

默认值spring-doc.cn

用户属性spring-doc.cn

spring-boot.run.main-classspring-doc.cn

因为spring-doc.cn

1.0.0spring-doc.cn

maxAttempts

检查 spring 应用程序是否已准备就绪的最大尝试次数。结合 “wait” 参数,这将提供全局超时值(默认为 30 秒)spring-doc.cn

名字spring-doc.cn

maxAttemptsspring-doc.cn

类型spring-doc.cn

intspring-doc.cn

默认值spring-doc.cn

60spring-doc.cn

用户属性spring-doc.cn

spring-boot.start.maxAttemptsspring-doc.cn

因为spring-doc.cn

noverify

标记以表示代理需要 -noverify。spring-doc.cn

名字spring-doc.cn

noverifyspring-doc.cn

类型spring-doc.cn

booleanspring-doc.cn

默认值spring-doc.cn

用户属性spring-doc.cn

spring-boot.run.noverifyspring-doc.cn

因为spring-doc.cn

1.0.0spring-doc.cn

profiles

要激活的 Spring 轮廓。指定 'spring.profiles.active' 参数的便捷快捷方式。在命令行中,使用逗号分隔多个配置文件。spring-doc.cn

名字spring-doc.cn

profilesspring-doc.cn

类型spring-doc.cn

java.lang.String[]spring-doc.cn

默认值spring-doc.cn

用户属性spring-doc.cn

spring-boot.run.profilesspring-doc.cn

因为spring-doc.cn

1.3.0spring-doc.cn

skip

跳过执行。spring-doc.cn

名字spring-doc.cn

skipspring-doc.cn

类型spring-doc.cn

booleanspring-doc.cn

默认值spring-doc.cn

falsespring-doc.cn

用户属性spring-doc.cn

spring-boot.run.skipspring-doc.cn

因为spring-doc.cn

1.3.2spring-doc.cn

systemPropertyVariables

要传递给进程的 JVM 系统属性的列表。spring-doc.cn

名字spring-doc.cn

systemPropertyVariablesspring-doc.cn

类型spring-doc.cn

java.util.Mapspring-doc.cn

默认值spring-doc.cn

用户属性spring-doc.cn

因为spring-doc.cn

2.1.0spring-doc.cn

useTestClasspath

用于在运行时包含测试 Classpath 的标志。spring-doc.cn

名字spring-doc.cn

useTestClasspathspring-doc.cn

类型spring-doc.cn

java.lang.Booleanspring-doc.cn

默认值spring-doc.cn

falsespring-doc.cn

用户属性spring-doc.cn

spring-boot.run.useTestClasspathspring-doc.cn

因为spring-doc.cn

wait

每次尝试检查 spring 应用程序是否已准备就绪之间等待的毫秒数。spring-doc.cn

名字spring-doc.cn

waitspring-doc.cn

类型spring-doc.cn

longspring-doc.cn

默认值spring-doc.cn

500spring-doc.cn

用户属性spring-doc.cn

spring-boot.start.waitspring-doc.cn

因为spring-doc.cn

workingDirectory

用于应用程序的当前工作目录。如果未指定,将使用 basedir 。spring-doc.cn

名字spring-doc.cn

workingDirectoryspring-doc.cn

类型spring-doc.cn

java.io.Filespring-doc.cn

默认值spring-doc.cn

用户属性spring-doc.cn

spring-boot.run.workingDirectoryspring-doc.cn

因为spring-doc.cn

1.5.0spring-doc.cn

spring-boot:stop

org.springframework.boot:spring-boot-maven-plugin:3.4.0spring-doc.cn

停止已由 “start” 目标启动的应用程序。通常在测试套件完成后调用。spring-doc.cn

可选参数

名字 类型 违约

jmx名称spring-doc.cn

Stringspring-doc.cn

org.springframework.boot:type=Admin,name=SpringApplicationspring-doc.cn

jmx端口spring-doc.cn

intspring-doc.cn

9001spring-doc.cn

spring-doc.cn

booleanspring-doc.cn

falsespring-doc.cn

参数详情

jmxName

自动部署的 MBean 的 JMX 名称,用于管理应用程序的生命周期。spring-doc.cn

名字spring-doc.cn

jmxNamespring-doc.cn

类型spring-doc.cn

java.lang.Stringspring-doc.cn

默认值spring-doc.cn

org.springframework.boot:type=Admin,name=SpringApplicationspring-doc.cn

用户属性spring-doc.cn

因为spring-doc.cn

jmxPort

用于查找平台 MBeanServer 的端口。spring-doc.cn

名字spring-doc.cn

jmxPortspring-doc.cn

类型spring-doc.cn

intspring-doc.cn

默认值spring-doc.cn

9001spring-doc.cn

用户属性spring-doc.cn

因为spring-doc.cn

skip

跳过执行。spring-doc.cn

名字spring-doc.cn

skipspring-doc.cn

类型spring-doc.cn

booleanspring-doc.cn

默认值spring-doc.cn

falsespring-doc.cn

用户属性spring-doc.cn

spring-boot.stop.skipspring-doc.cn

因为spring-doc.cn

1.3.2spring-doc.cn

例子

用于集成测试的随机端口

Spring Boot 测试集成的一个不错的功能是它可以为 Web 应用程序分配一个空闲端口。 当使用插件的目标时, Spring Boot 应用程序是单独启动的,这使得很难将实际端口传递给集成测试本身。startspring-doc.cn

下面的示例展示了如何使用 Build Helper Maven 插件实现相同的功能:spring-doc.cn

<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>

现在,您可以在任何集成测试中检索 system 属性,以创建一个适合服务器的 Normal。test.server.portURLspring-doc.cn

自定义 JMX 端口

该属性允许自定义插件用于与 Spring Boot 应用程序通信的端口。jmxPortspring-doc.cn

此示例显示如何在已使用的情况下自定义端口:9001spring-doc.cn

<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 端口,请确保在全局配置中执行此操作,如上所示,以便两个目标共享它。

跳过集成测试

该属性允许完全跳过 Spring Boot maven 插件的执行。skipspring-doc.cn

此示例演示如何使用命令行属性跳过集成测试,但仍确保目标运行:repackagespring-doc.cn

<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>

默认情况下,集成测试将运行,但此设置允许您在命令行上轻松禁用它们,如下所示:spring-doc.cn

$ mvn verify -Dskip.it=true