非常感谢大家的支持和鼓励,我会一如既往的坚持下去,为了我自己,更为我爱的人向前冲刺^_^
今天我们要讲的是
maven
测试相关的知识,主要是对测试时使用到的几个插件进行讲解maven
本身并不是一个测试框架,在java
世界里,测试框架为junit
与testng
,maven
要执行测试,只是在特定的生命周期中绑定具体的插件并执行相应的目标来达到测试目的的maven
中进行测试的插件为maven-surefire-pluginmaven-surefire-plugin
插件默认会自动执行测试源码包下面遵循
**/Test*.java
**/*Test.java
-
**/*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
提倡约定优于配置,所以用户应该尽量遵循测试类的命名,不要随意改变其结构
- 包含指定测试类
包含所有以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
结尾的测试类
- 排除指定的测试类
<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
插件提供了两种逃过测试的方式
- 跳过测试,但仍然要对测试源码进行编译
(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>
- 跳过测试,同时跳过测试代码的编译
mvn package -Dmaven.test.skip=true
基本测试报告
除了命令行输出,maven
用户还可以以文件的方式生成更丰富的测试报告
默认情况下,maven-surefire-plugin
会在target/surefire-reports
目录下生成两种格式的错误报告:
- 简单文本格式(比如
com.zheng.SayHelloTest.txt
) - 与
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
在浏览器访问效果如下:
在上面的代码左侧显示了运行当前测试时测试执行的覆盖次数,需要注意的是,这里只有对主代码
(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工具软件自动构建与部署我们自己的项目