集成测试(Integration Test)简介
在很多项目的实际开发过程中,上线之前是需要做很多测试的,典型的有unit-test,function-test(有些项目不用),integration-test,E2E-test等,unit-test是代码粒度的测试,一般是伪造一些输入来测试函数粒度的功能,而integration-test往往需要系统部署后之后才能进行相应的测试,是系统级别输入的功能测试,所以我们在实际的代码打包过程就不能让integration-test提前执行,需要deploy新的代码,重启系统之后再执行integration-test,否则由于没有运行着的系统,integration-test是无法通过的
Maven生存期
Maven本身支持的命令(Goals)是有顺序的,越后面执行的命令,会将其前面的命令和其本身按顺序执行一遍,具体的顺序如下所示:
validate
initialize
generate-sources
process-sources
generate-resources
process-resources
compile
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources
test-compile
process-test-classes
test
prepare-package
package
pre-integration-test
integration-test
post-integration-test
verify
install
从上面maven的生存期可以看出,install命令是最复杂的goal,它会将所有的goals都执行一遍,最终生成项目包,并发布到本地的或者配置的.m2仓库中,那问题就来了,我们如何使其能够在install的时候不执行某些goals呢,比如我们的integration-test就是个例子。
配置POM.XML
实际上POM.XML提供了很强大的配置功能,这里利用一个maven的插件,叫maven-failsafe-plugin,具体配置如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.17</version>
<executions>
<execution>
<id>integration-tests</id>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<excludes>
<exclude>none</exclude>
</excludes>
<includes>
<include>**/*IT.java</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
这里创建了一个execution,当执行integration-test goal的时候,执行包括“IT.java”结尾的所有java文件,那如何跳过unit test,integration-test呢?看下面利用了另外一个插件,叫maven-surefire-plugin,如下配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.6</version>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
通过skip标签来指定跳过test的行为,默认是支持skipITs和skipTests,前者是跳过integration-test,后者是跳过所有的测试(稍微说明下,跳过测试方法有很多种,比如maven-failsafe-plugin本身也支持加入skip选项,只不过实现之后每个命令的含义就略微有不同了,大家选择自己最习惯的就好了).
Maven 命令
有了上面的配置,我们就可以执行相应的run commands了,具体每个命令的含义如下:
- 打包
mvn package
- 跳过所有测试(BTW, 测试文件还是会被编译的)
mvn package -DskipTests
- 推荐的测试目录结构
Unit Test Classes : src/test/java/**/**Test.java
Integration Test Classes : src/test/java/**/**IT.java
TestCases dependent files: src/test/resources/*
- 编译并且只运行unit test
mvn clean test
- 编译并且只运行integration-test
mvn failsafe:integration-test
- 运行unit test和integration-test
mvn clean integration-test
- 发布包并且不运行任何的测试
mvn install -DskipTests
- 发布包并且只运行unit-test
mvn clean install -DskipITs
- 发布包并且运行ut加it
mvn clean install