maven本身并不是一个测试框架,在java世界里,测试框架为junit与testng,maven要执行测试,只是在特定的生命周期中绑定具体的插件并执行相应的目标来达到测试目的的
maven中进行测试的插件为maven-surefire-plugin
maven-surefire-plugin插件默认会自动执行测试源码包下面遵循
1.**/Test*.java
2.**/*Test.java
3.**/*TestCase.java
命名的java测试类
可以通过maven-help-plugin插件查看当前测试插件绑定的生命周期
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-surefire-plugin:2.7 -Ddetail
Name: Maven Surefire Plugin Description: Surefire is a test framework project. Group Id: org.apache.maven.plugins Artifact Id: maven-surefire-plugin Version: 2.7 Goal Prefix: surefire surefire:test Description: Run tests using Surefire. Implementation: org.apache.maven.plugin.surefire.SurefirePlugin Language: java Bound to phase: test |
从上面可以看出测试插件绑定的是default生命周期的test阶段
当然可以自定义具体的测试类(可以通过命令行方式和配置文件方式来指定具体要执行的测试)
动态指定测试类
命令行方式
需要注意的是命令行方式可以灵活指定需要运行的测试类,但是没有提供跳过指定测试类的方式,要实现跳过指定测试类这个功能,需要在配置文件中进行配置
指定具体类名
例如:mvn test -Dtest=RandomGenerateTest
这里是运行指定的测试类RandomGenerateTest
正则表达式
mvn test -Dtest=Random*Test
运行所有以Random开头,Test结尾的测试类
同时指定多个测试类
通过逗号","进行分隔
mvn test -Dtest=RandomGenerateTest,AccountCopyServiceTest
同时使用正则与多个测试类
mvn test -Dtest=Random*Test,AccountCaptuchaServiceTest
当使用命令mvn test -Dtest时如果没有指定测试类,则会报错,测试匹配模式是必填的
配置文件方式
maven提倡约定优于配置,所以用户应该尽量遵循测试类的命名,不要随意改变其结构
1.包含指定测试类
包含所有以Tests结尾的测试文件
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.7</version> <configuration> <includes> <include>**/*Tests.java</include> </includes> </configuration> </plugin> |
上面通过includes包含Tests.java结尾的测试类
2.排除指定的测试类
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.7</version> <configuration> <excludes> <exclude>**/*Tests.java</exclude> <exclude>**/*TestCase.java</exclude> </excludes> </configuration> </plugin> |
上面通过excludes排除以Tests.java、TestCase.java结尾的测试类
跳过测试
maven-surefire-plugin插件提供了两种逃过测试的方式
1.跳过测试,但仍然要对测试源码进行编译(skip/skipTests)
mvn package -Dtest=skipTests
[INFO] --- maven-surefire-plugin:2.20:test (default-test) @ mvn-study --- [INFO] Tests are skipped. [INFO] [INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ mvn-study --- [INFO] [INFO] --- maven-jar-plugin:2.6:test-jar (default) @ mvn-study --- [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.362 s [INFO] Finished at: 2017-07-26T21:24:40+08:00 [INFO] Final Memory: 11M/155M [INFO] ----------------------------------------------------------------------- |
上面的方式是命令行方式,下面给出在pom中的具体配置,但是这种方式是不推荐的,因为如果长时间让项目跳过测试,那还要测试代码做什么呢?
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.7</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> |
2.跳过测试,同时跳过测试代码的编译
mvn package -Dmaven.test.skip=true
基本测试报告
除了命令行输出,maven用户还可以以文件的方式生成更丰富的测试报告
默认情况下,maven-surefire-plugin会在target/surefire-reports目录下生成两种格式的错误报告:
1.简单文本格式(比如com.zheng.SayHelloTest.txt)
2.与junit兼容的xml格式(比如TEST-com.zheng.SayHelloTest.xml)
测试覆盖率(Cobertura插件)
要得到测试覆盖率,需要额外的插件(cobertura-maven-plugin)支持
具体需要引入下面插件依赖:
<plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>cobertura-maven-plugin</artifactId> <version>2.7</version> </plugin> </plugins> |
当然可以通过maven-help-plugin插件查看cobertura插件有哪些目标
通过运行mvn cobertura:cobertura将会在target/site/cobertura目录下生成index.html
test.png
在浏览器访问效果如下:
test1.png
test2.png
在上面的代码左侧显示了运行当前测试时测试执行的覆盖次数,需要注意的是,这里只有对主代码(src/main/java)里面的类进行统计,如果将测试服务代码写入测试(src/test/java)目录下则将无法进行覆盖率统计
testng测试
testng 是又一款流行的java测试框架,意为test next generation
使用testng需要去掉junit依赖,并添加testng依赖
<dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>5.9</version> <classifier>jdk15</classifier> </dependency> |
相比于junit,它的注解也是很好理解的
org.junit.Test org.testng.annotations.Test测试标记
org.junit.Assert org.testng.Assert 断言
org.junit.Before org.testng.annotations.BeforeMethod 测试方法之前
org.junit.After org.testng.annotations.AfterMethod 测试方法之后
org.junit.BeforeClass org.testng.annotations.BeforeClass所有测试之前
org.junit.AfterClass org.testng.annotations.AfterClass 所有测试之后
testng允许用户通过配置文件的方式来制定测试计划
需要在项目根目录下建立一个testng.xml
<?xml version="1.0" encoding="utf-8" ?> <suite name="suite1" verbose="1"> <test name="sayHello"> <classes> <class name="com.zheng.SayHelloTest"/> </classes> </test> </suite> |
修改测试代码注释
@Test(groups = {"test1", "test2"}) public void sayHello() { HelloService helloService = new HelloServiceImpl(); String hello = helloService.sayHello(); System.out.println(hello); } |
还需要借助maven-surefire-plugin来进行打包测试
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.20</version> <configuration> <!--以配置文件方式执行测试用例--> <!--<suiteXmlFiles>--> <!--testng.xml--> <!--</suiteXmlFiles>--> <!--以分组的方式执行测试用例--> <groups> test1,test2 </groups> </configuration> </plugin> |
上面的代码通过@Test,groups指定当前测试方法属于test1,test2分组的,然后通过maven-surefire-plugin指定执行的测试分组test1,test2,于是测试代码就神奇的运行起来了
打包测试代码
通常情况下,我们通过maven打包项目代码是不会将测试代码一起打包出来的,为了做到这一点,需要使用maven-jar-plugin插件的test-jar打包目标
<!--打包测试代码--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.6</version> <executions> <execution> <goals> <goal>test-jar</goal> </goals> </execution> </executions> </plugin> |
在maven-jar-plugin插件中提供了两个目标: jar和test-jar,前者默认绑定在package阶段上,而后者虽然默认也是在package阶段执行,但是并没有绑定,我们通过上面的配置显示的绑定了test-jar任务,于是当运行mvn test package的时候就会打包测试代码
通过运行mvn clean package命令就得到在target/生成的两个jar包
mvn-study-1.0-SNAPSHOT.jar
mvn-study-1.0-SNAPSHOT-tests.jar
如何使用测试jar包
通过上面的方式已经将测试代码打包成一个jar,那么我们要如何在其他项目模块中引用这个打包好的测试jar包呢?
不要惊慌,下面就给出答案
我们通过下面配置方式来引用被打包的测试代码:
<dependency> <groupId>com.zheng.mvnstudy</groupId> <artifactId>mvn-study</artifactId> <version>1.0-SNAPSHOT</version> <scope>test</scope> <type>test-jar</type> </dependency> |
需要注意上面引入的测试jar包依赖跟普通的依赖有点区别的地方在于scope是test域,表示在测试时使用,而type为test-jar
以上主要讲了maven插件maven-surefire-plugin结合junit和testng运行项目测试的知识,这一章的知识就到此完哒,在接下来我们将学习如何使用已经成熟的scm工具软件自动构建与部署我们自己的项目。