maven install时自动执行单元测试

1.maven-surefire-plugin简介

Maven本身并不是一个单元测试框架,它只是在构建执行到特定生命周期阶段的时候,通过插件来执行JUnit或者TestNG的测试用例。这个插 件就是maven-surefire-plugin,也可以称为测试运行器(Test Runner),它能兼容JUnit 3、JUnit 4以及TestNG。

在默认情况下,maven-surefire-plugin的test目标会自动执行测试源码路径(默认为src/test/java/)下所有符合一组命名模式的测试类。这组模式为:

  • **/Test*.java:任何子目录下所有命名以Test开关的Java类。
  • **/*Test.java:任何子目录下所有命名以Test结尾的Java类。
  • **/*TestCase.java:任何子目录下所有命名以TestCase结尾的Java类。

2.跳过测试

要想跳过测试,在命令行加入参数skipTests就可以了。如:
  1. mvn package -DskipTests

也可以在pom配置中提供该属性。

  1. < plugin >
  2. < groupId > org.apache.maven.plugins </ groupId >
  3. < artifactId > maven-surefire-plugin </ artifactId >
  4. < version > 2.5 </ version >
  5. < configuration >
  6. < skipTests > true </ skipTests >
  7. </ configuration >
  8. </ plugin >
 

有时候可能不仅仅需要跳过测试运行,还要跳过测试代码的编译:

  1. mvn package -Dmaven.test.skip=true

也可以在pom中配置maven.test.skip:

  1. < plugin >
  2. < groupId > org.apache.maven.plugin </ groupId >
  3. < artifactId > maven-compiler-plugin </ artifactId >
  4. < version > 2.1 </ version >
  5. < configuration >
  6. < skip > true </ skip >
  7. </ configuration >
  8. </ plugin >
  9. < plugin >
  10. < groupId > org.apache.maven.plugins </ groupId >
  11. < artifactId > maven-surefire-plugin </ artifactId >
  12. < version > 2.5 </ version >
  13. < configuration >
  14. < skip > true </ skip >
  15. </ configuration >
  16. </ plugin >

3.动态指定要运行的测试用例

maven-surefire-plugin提供了一个test参数让Maven用户能够在命令行指定要运行的测试用例。如:
  1. mvn test -Dtest=RandomGeneratorTest

也可以使用通配符:

  1. mvn test -Dtest=Random*Test

或者也可以使用“,”号指定多个测试类:

  1. mvn test -Dtest=Random*Test,AccountCaptchaServiceTest

如果没有指定测试类,那么会报错并导致构建失败。

  1. mvn test -Dtest

这时候可以添加-DfailIfNoTests=false参数告诉maven-surefire-plugin即使没有任何测试也不要报错。

  1. mvn test -Dtest -DfailIfNoTests=false

由此可见,命令行参数-Dtest -DfailIfNoTests=false是另外一种路过测试的方法

 

4.包含与排除测试用例

如果由于历史原因,测试类不符合默认的三种命名模式,可以通过pom.xml设置maven-surefire-plugin插件添加命名模式或排除一些命名模式。

  1. < plugin >
  2. < groupId > org.apache.maven.plugins </ groupId >
  3. < artifactId > maven-surefire-plugin </ artifactId >
  4. < version > 2.5 </ version >
  5. < configuration >
  6. < includes >
  7. < include > **/*Tests.java </ include >
  8. </ includes >
  9. < excludes >
  10. < exclude > **/*ServiceTest.java </ exclude >
  11. < exclude > **/TempDaoTest.java </ exclude >
  12. </ excludes >
  13. </ configuration >
  14. </ plugin >

5.生成测试报告

5.1基本测试报告

默认情况下,maven-surefire-plugin会在项目的target/surefire-reports目录下生成两种格式的错误报告。
  • 简单文本格式——内容十分简单,可以看出哪个测试项出错。
  • 与JUnit兼容的XML格式——XML格式已经成为了Java单元测试报告的事实标准,这个文件可以用其他的工具如IDE来查看。

5.2测试覆盖率报告

测试覆盖率是衡量项目代码质量的一个重要的参考指标。Cobertura是一个优秀的开源测试覆盖率统计工具(详见 http://cobertura.sourceforge.net/),Maven通过cobertura-maven-plugin与之集成,用户可 以使用简单的命令为Maven项目生成测试覆盖率报告。运行下面命令生成报告:

  1. mvn cobertura:cobertura

6.运行TestNG测试

TestNG是Java社区中除了JUnit之外另一个流行的单元测试框架。TestNG在JUnit的基础上增加了很多特性,其站点是http://testng.org/ .添加TestNG依赖:

  1. < dependency >
  2. < groupId > org.testng </ groupId >
  3. < artifactId > testng </ artifactId >
  4. < version > 5.9 </ version >
  5. < scope > test </ scope >
  6. < classifier > jdk15 </ classifier >
  7. </ dependency >
下面是JUnit和TestNG的常用类库对应关系
JUnit类 TestNG类 作用
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的文件来配置想要运行的测试集合。如在类路径上添加testng.xml文件,配置只运行RandomGeneratorTest
  1. <? xml   version = "1.0"   encoding = "UTF-8" ?>
  2. < suite   name = "Suite1"   verbose = "1" >
  3. < test   name = "Regression1" >
  4. < classes >
  5. < class   name = "com.juvenxu.mvnbook.account.captcha.RandomGeneratorTest"   />
  6. </ classes >
  7. </ test >
  8. </ suite >

同时再配置maven-surefire-plugin使用该testng.xml,如:

  1. < plugin >
  2. < groupId > org.apache.maven.plugins </ groupId >
  3. < artifactId > maven-surefire-plugin </ artifactId >
  4. < version > 2.5 </ version >
  5. < configuration >
  6. < suiteXmlFiles >
  7. < suiteXmlFile > testng.xml </ suiteXmlFile >
  8. </ suiteXmlFiles >
  9. </ configuration >
  10. </ plugin >
TestNG较JUnit的一大优势在于它支持测试组的概念。如可以在方法级别声明测试组:

  1. @Test (groups={ "util" , "medium" })
然后可以在pom中配置运行一个或多个测试组:
  1. < plugin >
  2. < groupId > org.apache.maven.plugins </ groupId >
  3. < artifactId > maven-surefire-plugin </ artifactId >
  4. < version > 2.5 </ version >
  5. < configuration >
  6. < groups > util,medium </ groups >
  7. </ configuration >
  8. </ plugin >

7.重用测试代码

当命令行运行mvn package的时候,Maven只会打包主代码及资源文件,并不会对测试代码打包。如果测试代码中有需要重用的代码,这时候就需要对测试代码打包了。
这时候需要配置maven-jar-plugin将测试类打包,如:

  1. < plugin >
  2. < groupId > org.apache.maven.plugins </ groupId >
  3. < artifactId > maven-jar-plugin </ artifactId >
  4. < version > 2.2 </ version >
  5. < executions >
  6. < execution >
  7. < goals >
  8. < goal > test-jar </ goal >
  9. </ goals >
  10. </ execution >
  11. </ executions >
  12. </ plugin >

maven-jar-plugin有两个目标,分别为jar和test-jar。这两个目标都默认绑定到default生命周期的package阶段运行,只是test-jar并没有在超级POM中配置,因此需要我们另外在pom中配置。

 
现在如要引用test-jar生成的测试代码包,可以如下配置:
  1. < dependency >
  2. < groupId > com.juvenxu.mvnbook.account </ groupId >
  3. < artifactId > account-captcha </ artifactId >
  4. < version > 1.0.0-SNAPSHOT </ version >
  5. < type > test-jar </ type >
  6. < scope > test </ scope >
  7. </ dependency >

转自:http://www.verydemo.com/demo_c290_i17360.html

maven install时自动施行单元测试的更多相关文章

  1. 今天maven install时碰到的两个问题(堆溢出和编译错误)

    问题1.maven install时出现,日志如下: 系统资源不足.有关详细信息,请参阅以下堆栈追踪. java.lang.OutOfMemoryError: Java heap space at c ...

  2. maven -- 问题解决(一)解决eclipse中maven项目配置过程和maven install时出现的问题

    问题一: 配置项目时出现的错误: error: Cannot change version of project facet Dynamic Web Module to 2.5. error: One ...

  3. maven打包时跳过单元测试

    运行mvn install时跳过Test <project> [...] <build> <plugins> <plugin> <groupId& ...

  4. Eclipse中Maven Install时发生错误

    问题描述 要把一个本地包保存进本地maven库中, 所以对该project执行了run as => Maven Install, 结果报下面的错误. 解决办法 1. 通过命令窗口手动创建这两个文 ...

  5. maven install时跳过测试

    xl_echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! - ...

  6. maven编译时如何忽略单元测试

    共有两种解决办法 1.通过在命令行设置:-Dmaven.test.skip=true 如:mvn clean install tomcat:run -Dmaven.test.skip=true 2.通 ...

  7. eclipse里maven install时,报错提示jdk为无效的目标版本:1.7

    http://blog.csdn.net/wabiaozia/article/details/51733372 ************************************ 报错提示: [ ...

  8. maven install 时 pom中skip test

    <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-suref ...

  9. maven install 时提示“程序包 javax.crypto不存在”

    但是javax.crypto是在jdk的jre\lib目录下的 解决方案: <compilerArguments> <bootclasspath>${java.home}/li ...

随机推荐

  1. Swap 2 Variables in Python

    In Python, it's concise, easy and faster to swap 2 variables compared in other Programming languages ...

  2. java HttpURLConnection 请求实例

    package app.works; import org.json.JSONObject; import java.io.BufferedReader; import java.io.InputSt ...

  3. 设计模式(五) 注解方式实现AOP

    1.1. Aop,  aspect object programming  面向切面编程 功能: 让关注点代码与业务代码分离! 关注点, 重复代码就叫做关注点: 切面, 关注点形成的类,就叫切面(类) ...

  4. python中定制类

    1.python中__str__和repr 如果要把一个类的实例变成 str,就需要实现特殊方法__str__(): class Person(object): def __init__(self, ...

  5. Sybase:循环调用存储过程

    Sybase:循环调用存储过程 一.日期循环 declare @c_count int declare @rq int --获取两个日期之间的天数 ,getdate()) begin ,),),),) ...

  6. CMD 配置静态IP与DNS

    配置静态IP与DNS # 修改IP netsh interface ip set address "网络连接" static IP地址 子网掩码 默认网关 # 修改DNS nets ...

  7. Windows 10 安装 到SSD硬盘

    1.更换SSD硬盘 2.安装windows 10 系统(升级太慢,建议全新安装) 3.全程不到1个小时个月安装完成. 4.这个分数惨不忍睹,但是速度还是蛮快. 5.挂载机械硬盘,安装驱动,window ...

  8. 项目中使用better-scroll实现移动端滚动,报错:Cannot read property 'children' of undefined better-scroll

    就是外面的盒子和要滚动的元素之间要有一层div, 插件挂载的元素是menuWrapper,可以滚动的元素是ul,在这两个元素之间加一个div元素即可解决问题.

  9. 【纯代码】Swift相册照片选择-支持单选或多选

    // // NAPublishAlbumTableViewController.swift //// // Created by on 2019/3/23. // Copyright © 2019年 ...

  10. react-native navigation的学习与使用

    在很久之前,RN中文网说推荐用react-navigation替代navigator作为新的导航库,从RN 0.43版本开始,官方就已经停止维护Navigator了,所以强烈建议大家迁移到新的reac ...