运行集成测试

虽然你可以非常轻松地直接从你的测试(或测试套件)中启动 Spring Boot 应用程序,但有时更希望在构建过程中处理这一点。 为了确保在集成测试前后正确管理 Spring Boot 应用程序的生命周期,你可以使用 startstop 目标,如下例所示:spring-doc.cadn.net.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.cadn.net.cn

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

你也可以配置一个更高级的设置,在设置了特定属性时跳过集成测试,参见专门的示例spring-doc.cadn.net.cn

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

Spring Boot 的父 POM spring-boot-starter-parent 将 Failsafe 的 <classesDirectory> 配置为 ${project.build.outputDirectory}。 如果没有此配置(该配置会使 Failsafe 使用编译后的 class 文件而非重新打包的 JAR 文件),Failsafe 将无法加载您的应用程序类。 如果您未使用父 POM,则应按照以下示例所示,以相同方式配置 Failsafe:spring-doc.cadn.net.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:4.0.4spring-doc.cadn.net.cn

启动一个 Spring 应用程序。与 run 目标不同,此操作不会阻塞,并允许其他目标对应用程序进行操作。该目标通常用于集成测试场景中,在测试套件运行前启动应用程序,并在测试结束后停止。spring-doc.cadn.net.cn

必需参数

姓名 类型 默认

类目录spring-doc.cadn.net.cn

Filespring-doc.cadn.net.cn

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

可选参数

姓名 类型 默认

addResourcesspring-doc.cadn.net.cn

booleanspring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

additionalClasspathElementsspring-doc.cadn.net.cn

String[]spring-doc.cadn.net.cn

代理spring-doc.cadn.net.cn

File[]spring-doc.cadn.net.cn

参数spring-doc.cadn.net.cn

String[]spring-doc.cadn.net.cn

命令行参数spring-doc.cadn.net.cn

Stringspring-doc.cadn.net.cn

环境变量spring-doc.cadn.net.cn

Mapspring-doc.cadn.net.cn

排除的 GroupId 列表spring-doc.cadn.net.cn

Stringspring-doc.cadn.net.cn

排除项spring-doc.cadn.net.cn

Listspring-doc.cadn.net.cn

包含spring-doc.cadn.net.cn

Listspring-doc.cadn.net.cn

jmx名称spring-doc.cadn.net.cn

Stringspring-doc.cadn.net.cn

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

jmx端口spring-doc.cadn.net.cn

intspring-doc.cadn.net.cn

9001spring-doc.cadn.net.cn

jvmArgumentsspring-doc.cadn.net.cn

Stringspring-doc.cadn.net.cn

主类spring-doc.cadn.net.cn

Stringspring-doc.cadn.net.cn

maxAttemptsspring-doc.cadn.net.cn

intspring-doc.cadn.net.cn

60spring-doc.cadn.net.cn

不验证spring-doc.cadn.net.cn

booleanspring-doc.cadn.net.cn

profilesspring-doc.cadn.net.cn

String[]spring-doc.cadn.net.cn

跳过spring-doc.cadn.net.cn

booleanspring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

systemPropertyVariablesspring-doc.cadn.net.cn

Mapspring-doc.cadn.net.cn

使用测试类路径spring-doc.cadn.net.cn

booleanspring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

等待spring-doc.cadn.net.cn

longspring-doc.cadn.net.cn

500spring-doc.cadn.net.cn

工作目录spring-doc.cadn.net.cn

Filespring-doc.cadn.net.cn

参数详情

addResources

直接将 Maven 资源添加到类路径中,这样就可以对资源进行实时原地编辑。重复的资源会从 target/classes 中移除,以防止在调用 ClassLoader.getResources() 时出现重复。建议您考虑将 spring-boot-devtools 添加到项目中,因为它不仅提供此功能,还包含许多其他特性。spring-doc.cadn.net.cn

姓名spring-doc.cadn.net.cn

addResourcesspring-doc.cadn.net.cn

类型spring-doc.cadn.net.cn

booleanspring-doc.cadn.net.cn

默认值spring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

用户属性spring-doc.cadn.net.cn

spring-boot.run.addResourcesspring-doc.cadn.net.cn

Sincespring-doc.cadn.net.cn

1.0.0spring-doc.cadn.net.cn

additionalClasspathElements

应添加到类路径中的额外类路径元素。一个元素可以是包含类和资源的目录,也可以是一个 JAR 文件。spring-doc.cadn.net.cn

姓名spring-doc.cadn.net.cn

additionalClasspathElementsspring-doc.cadn.net.cn

类型spring-doc.cadn.net.cn

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

默认值spring-doc.cadn.net.cn

用户属性spring-doc.cadn.net.cn

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

Sincespring-doc.cadn.net.cn

3.2.0spring-doc.cadn.net.cn

classesDirectory

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

姓名spring-doc.cadn.net.cn

classesDirectoryspring-doc.cadn.net.cn

类型spring-doc.cadn.net.cn

java.io.Filespring-doc.cadn.net.cn

默认值spring-doc.cadn.net.cn

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

用户属性spring-doc.cadn.net.cn

Sincespring-doc.cadn.net.cn

1.0.0spring-doc.cadn.net.cn

commandlineArguments

应传递给应用程序的命令行参数。使用空格分隔多个参数,并确保将包含多个值的参数用引号括起来。当指定此选项时,其优先级高于 #argumentsspring-doc.cadn.net.cn

姓名spring-doc.cadn.net.cn

commandlineArgumentsspring-doc.cadn.net.cn

类型spring-doc.cadn.net.cn

java.lang.Stringspring-doc.cadn.net.cn

默认值spring-doc.cadn.net.cn

用户属性spring-doc.cadn.net.cn

spring-boot.run.argumentsspring-doc.cadn.net.cn

Sincespring-doc.cadn.net.cn

2.2.3spring-doc.cadn.net.cn

environmentVariables

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

姓名spring-doc.cadn.net.cn

environmentVariablesspring-doc.cadn.net.cn

类型spring-doc.cadn.net.cn

java.util.Mapspring-doc.cadn.net.cn

默认值spring-doc.cadn.net.cn

用户属性spring-doc.cadn.net.cn

Sincespring-doc.cadn.net.cn

2.1.0spring-doc.cadn.net.cn

excludeGroupIds

要排除的 groupId 名称的逗号分隔列表(精确匹配)。spring-doc.cadn.net.cn

姓名spring-doc.cadn.net.cn

excludeGroupIdsspring-doc.cadn.net.cn

类型spring-doc.cadn.net.cn

java.lang.Stringspring-doc.cadn.net.cn

默认值spring-doc.cadn.net.cn

用户属性spring-doc.cadn.net.cn

spring-boot.excludeGroupIdsspring-doc.cadn.net.cn

Sincespring-doc.cadn.net.cn

1.1.0spring-doc.cadn.net.cn

excludes

要排除的构件定义集合。Exclude 元素定义了必需的 groupIdartifactId 组件,以及一个可选的 classifier 组件。当将其配置为属性时,值应以逗号分隔,各组件之间用冒号分隔: groupId:artifactId,groupId:artifactId:classifierspring-doc.cadn.net.cn

姓名spring-doc.cadn.net.cn

excludesspring-doc.cadn.net.cn

类型spring-doc.cadn.net.cn

java.util.Listspring-doc.cadn.net.cn

默认值spring-doc.cadn.net.cn

用户属性spring-doc.cadn.net.cn

spring-boot.excludesspring-doc.cadn.net.cn

Sincespring-doc.cadn.net.cn

1.1.0spring-doc.cadn.net.cn

includes

要包含的构件定义集合。Include 元素定义了必需的 groupIdartifactId 组件,以及一个可选的 classifier 组件。当配置为属性时,值应以逗号分隔,各组件之间用冒号分隔: groupId:artifactId,groupId:artifactId:classifierspring-doc.cadn.net.cn

姓名spring-doc.cadn.net.cn

includesspring-doc.cadn.net.cn

类型spring-doc.cadn.net.cn

java.util.Listspring-doc.cadn.net.cn

默认值spring-doc.cadn.net.cn

用户属性spring-doc.cadn.net.cn

spring-boot.includesspring-doc.cadn.net.cn

Sincespring-doc.cadn.net.cn

1.2.0spring-doc.cadn.net.cn

jmxName

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

姓名spring-doc.cadn.net.cn

jmxNamespring-doc.cadn.net.cn

类型spring-doc.cadn.net.cn

java.lang.Stringspring-doc.cadn.net.cn

默认值spring-doc.cadn.net.cn

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

用户属性spring-doc.cadn.net.cn

Sincespring-doc.cadn.net.cn

jvmArguments

应与用于运行应用程序的派生进程关联的 JVM 参数。在命令行中,请确保将多个值用引号括起来。spring-doc.cadn.net.cn

姓名spring-doc.cadn.net.cn

jvmArgumentsspring-doc.cadn.net.cn

类型spring-doc.cadn.net.cn

java.lang.Stringspring-doc.cadn.net.cn

默认值spring-doc.cadn.net.cn

用户属性spring-doc.cadn.net.cn

spring-boot.run.jvmArgumentsspring-doc.cadn.net.cn

Sincespring-doc.cadn.net.cn

1.1.0spring-doc.cadn.net.cn

mainClass

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

姓名spring-doc.cadn.net.cn

mainClassspring-doc.cadn.net.cn

类型spring-doc.cadn.net.cn

java.lang.Stringspring-doc.cadn.net.cn

默认值spring-doc.cadn.net.cn

用户属性spring-doc.cadn.net.cn

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

Sincespring-doc.cadn.net.cn

1.0.0spring-doc.cadn.net.cn

maxAttempts

检查 Spring 应用程序是否就绪的最大尝试次数。结合“wait”参数,可得出一个全局超时值(默认为 30 秒)。spring-doc.cadn.net.cn

姓名spring-doc.cadn.net.cn

maxAttemptsspring-doc.cadn.net.cn

类型spring-doc.cadn.net.cn

intspring-doc.cadn.net.cn

默认值spring-doc.cadn.net.cn

60spring-doc.cadn.net.cn

用户属性spring-doc.cadn.net.cn

spring-boot.start.maxAttemptsspring-doc.cadn.net.cn

Sincespring-doc.cadn.net.cn

noverify

用于标识该代理需要使用 -noverify 参数。spring-doc.cadn.net.cn

姓名spring-doc.cadn.net.cn

noverifyspring-doc.cadn.net.cn

类型spring-doc.cadn.net.cn

booleanspring-doc.cadn.net.cn

默认值spring-doc.cadn.net.cn

用户属性spring-doc.cadn.net.cn

spring-boot.run.noverifyspring-doc.cadn.net.cn

Sincespring-doc.cadn.net.cn

1.0.0spring-doc.cadn.net.cn

profiles

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

姓名spring-doc.cadn.net.cn

profilesspring-doc.cadn.net.cn

类型spring-doc.cadn.net.cn

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

默认值spring-doc.cadn.net.cn

用户属性spring-doc.cadn.net.cn

spring-boot.run.profilesspring-doc.cadn.net.cn

Sincespring-doc.cadn.net.cn

1.3.0spring-doc.cadn.net.cn

systemPropertyVariables

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

姓名spring-doc.cadn.net.cn

systemPropertyVariablesspring-doc.cadn.net.cn

类型spring-doc.cadn.net.cn

java.util.Mapspring-doc.cadn.net.cn

默认值spring-doc.cadn.net.cn

用户属性spring-doc.cadn.net.cn

Sincespring-doc.cadn.net.cn

2.1.0spring-doc.cadn.net.cn

useTestClasspath

运行时包含测试类路径的标志。spring-doc.cadn.net.cn

姓名spring-doc.cadn.net.cn

useTestClasspathspring-doc.cadn.net.cn

类型spring-doc.cadn.net.cn

booleanspring-doc.cadn.net.cn

默认值spring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

用户属性spring-doc.cadn.net.cn

spring-boot.run.useTestClasspathspring-doc.cadn.net.cn

Sincespring-doc.cadn.net.cn

wait

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

姓名spring-doc.cadn.net.cn

waitspring-doc.cadn.net.cn

类型spring-doc.cadn.net.cn

longspring-doc.cadn.net.cn

默认值spring-doc.cadn.net.cn

500spring-doc.cadn.net.cn

用户属性spring-doc.cadn.net.cn

spring-boot.start.waitspring-doc.cadn.net.cn

Sincespring-doc.cadn.net.cn

workingDirectory

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

姓名spring-doc.cadn.net.cn

workingDirectoryspring-doc.cadn.net.cn

类型spring-doc.cadn.net.cn

java.io.Filespring-doc.cadn.net.cn

默认值spring-doc.cadn.net.cn

用户属性spring-doc.cadn.net.cn

spring-boot.run.workingDirectoryspring-doc.cadn.net.cn

Sincespring-doc.cadn.net.cn

1.5.0spring-doc.cadn.net.cn

spring-boot:stop

org.springframework.boot:spring-boot-maven-plugin:4.0.4spring-doc.cadn.net.cn

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

参数详情

jmxName

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

姓名spring-doc.cadn.net.cn

jmxNamespring-doc.cadn.net.cn

类型spring-doc.cadn.net.cn

java.lang.Stringspring-doc.cadn.net.cn

默认值spring-doc.cadn.net.cn

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

用户属性spring-doc.cadn.net.cn

Sincespring-doc.cadn.net.cn

<h1>示例</h1>

用于集成测试的随机端口

Spring Boot 测试集成的一个很好的特性是,它可以为 Web 应用程序分配一个空闲端口。 当使用该插件的 start 目标时,Spring Boot 应用程序会单独启动,这使得很难将实际使用的端口传递给集成测试本身。spring-doc.cadn.net.cn

下面的示例展示了如何使用Build Helper Maven Plugin实现相同的功能:spring-doc.cadn.net.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>

你现在可以在任意集成测试中获取 test.server.port 系统属性,以构建指向服务器的正确 URLspring-doc.cadn.net.cn

自定义 JMX 端口

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

此示例展示了在端口 9001 已被占用的情况下,如何自定义端口:spring-doc.cadn.net.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 端口,请确保像上面所示那样在全局配置中进行设置,以便两个目标(goals)都能共享该配置。

跳过集成测试

skip 属性允许完全跳过 Spring Boot Maven 插件的执行。spring-doc.cadn.net.cn

此示例展示了如何通过命令行属性跳过集成测试,同时仍确保 repackage 目标得以执行:spring-doc.cadn.net.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.cadn.net.cn

$ mvn verify -Dskip.it=true