絮絮叨叨
-
在学习maven的生命周期和插件时,我们知道test阶段是与
maven-surefire-plugin:test
绑定的。 -
想要创建单元测试,必须添加junit依赖,并且依赖范围是test。
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
-
如果仔细想想,为啥其他的生命周期阶段不用引入依赖呢,比如package就没有说要引入一个具有打包功能的依赖啊
-
其实,这是因为
maven-surefire-plugin
插件并不是一个单元测试框架,而是在执行test阶段的任务时,主动调用其他单元测试框架(如junit)来执行测试用例。 -
因此,maven需要与其他单元测试框架集成,才能执行单元测试并生成丰富的测试报告。
-
这也是为什么,需要在pom文件中显式声明junit依赖的原因。
-
当然,除了junit,TestNG也是比较成熟的单元测试框架。maven能与junit和TestNG集成,从而实现单元测试。
1. 基于junit学习maven test
1.1 一些约定
执行mvn test
时,会自动执行src/test/java
目录下,所有满足以下命名的测试类:
**/Test*.java
: 任何子目录下、命名以Test开头的java类**/*Test.java
:任何子目录下、命名以Test结尾的java类**/*TestCase.java
:任何子目录下、命名以TestCase结尾的java类
- 这也是为什么我之前喜欢使用
Test*
命名的测试类,仍然能正常执行单元测试的原因
养成习惯,执行测试时,加上clean !!!
-
加上
clean
,会清除target目录的class和resource数据,重新进行代码编译 -
虽然maven会智能检测是否存在代码变化,为了保险起见,还是手动加上
clean
比较好 -
所以使用maven进行测试时,基础的命令为
mvn clean test
1.2 跳过测试
- 我们在执行项目打包或安装时,总有各种各样的理由跳过单元测试。
- 跳过测试有三种方法:
-DskipTests
-
在执行包含test阶段的maven命令时,可以通过添加
-DskipTests
来跳过单元测试。 -
更准确的说,是跳过
test
阶段,但testCompile
阶段仍会执行。[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ maven-tests --- ... [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ maven-tests --- [INFO] Tests are skipped. [INFO]
-Dmaven.test.skip=true
-
之前在介绍如何查看插件信息时,以
maven-surefire-plugin
插件的test目标为例,介绍了插件目标的参数skip
,包括该参数对应的命令行参数maven.test.skip
-
该参数不仅会跳过
test
阶段,还会跳过testCompile
阶段[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ maven-tests --- [INFO] Not compiling test sources [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ maven-tests --- [INFO] Tests are skipped.
-Dtest + -DfailIfNoTests=false
-Dtest
和-DfailIfNoTests
选项结合使用,可以达到跳过单元测试的目的
-Dtest选项
-
-Dtest
选项用于指定测试类型,且需要指定至少一个测试类。 -
-Dtest
用法一:指定一个或多个测试类# 指定一个测试类 mvn clean test -Dtest=HelloTest # 指定多个测试类,测试类之间使用逗号分隔 mvn test -Dtest=HelloTest,PrintTest
-
-Dtest
用法二:使用正则表达式,灵活指定测试类mvn clean test -Dtest=Random*Test
-
-Dtest
用法三:正则表达式和明确指定相结合mvn clean test -Dtest=Random*Test,HelloTest
-
如果使用
-Dtest
,却不为其指定任何测试类,执行会报错mvn clean test -Dtest
-
报错信息如下,提示使用
-DfailIfNoTests=false
来忽略No tests were executed!
错误
巧妙跳过测试
-
这时我们可以通过
-DfailIfNoTests=false
配置,让maven在无测试类时不报错,这样也就可以跳过test阶段了mvn clean test -Dtest -DfailIfNoTests=false
-
成功完成测试,并未执行任何测试类
-
当然,这种跳过不像前两种方式是真正的跳过,而是说在test阶段没有需要测试的类,却不抛出
No tests were executed!
错误 -
这是跳过测试的曲线救国 方法 😂
1.3 如何在pom中包含或排除测试用例
-
有时,已有的测试类命名并不符合默认规范,但我们又想执行这些测试类
-
这时,可以在pom文件中通过配置
maven-surefire-plugin
来实现包含这些测试类 -
包含指定命名规范的测试类:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <configuration> <includes> <include>**/*Tests.java</include> </includes> </configuration> </plugin> </plugins> </build>
-
有时,有可能不想执行具有某测试类,则配置
maven-surefire-plugin
来实现排除这些测试类<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <configuration> <excludes> <exclude>**/*Tests.java</exclude> <exclude>**/HelloTest.java</exclude> </excludes> </configuration> </plugin> </plugins> </build>
1.4 测试报告
-
maven在测试阶段会生成两个测试报告:
① 简单的txt格式的测试报告
② 详细的、与junit兼容的xml格式的测试报告 -
目录是
target/surefire-reports
:
-
测试成功,这些测试报告其实用处不大。 真正的用处是在测试失败是,根据失败信息快速实现代码修复
-
书中还介绍了,测试覆盖率报告,需要执行以下命令:
mvn cobertura:cobertura
-
它会在
target/site/cobertura
目录下生成名为index.html的测试覆盖率报告
1.5 重用测试代码
-
我们对项目进行打包时,默认打包的是主代码。
-
但我们可能这样的需求:项目的测试代码中,积累了很多优秀的、供测试类继承的抽象类。若干这些类,可以在其他项目中使用,这样能能大大减少我们复制或重新开发的工作。
-
因此,我们需要将测试代码也打包
-
package阶段默认绑定的是
maven-jar-plugin:jar
,用于将主代码打包 -
maven-jar-plugin:test-jar
,可以将测试代码打包。 -
在pom文件将
maven-jar-plugin:test-jar
目标与package阶段绑定,由于默认阶段是package,因此未指定阶段。<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <goals> <goal>test-jar</goal> </goals> </execution> </executions> </plugin>
2. TestNG
- 自己并没有使用过TestNG框架,书中对TestNG框架的介绍非常少
- 与junit不同的是:指定测试集合或测试组
3. 总结
- 本篇博客,主要与maven的test生命阶段有关
maven-surefire-plugin
插件实质是一个测试运行器,并非单元测试框架- 跳过单元测试的三种方法、如何在pom文件中包含或排除测试类
- 测试报告、测试覆盖率
- 如何打包测试代码