`

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就可以了。如:
Plain代码
  1. mvn package -DskipTests  

也可以在pom配置中提供该属性。
Html代码
  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 >   

有时候可能不仅仅需要跳过测试运行,还要跳过测试代码的编译:
Plain代码
  1. mvn package -Dmaven.test.skip=true  

也可以在pom中配置maven.test.skip:
Html代码
  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用户能够在命令行指定要运行的测试用例。如:
Plain代码
  1. mvn test -Dtest=RandomGeneratorTest  

也可以使用通配符:
Plain代码
  1. mvn test -Dtest=Random*Test  

或者也可以使用“,”号指定多个测试类:
Plain代码
  1. mvn test -Dtest=Random*Test,AccountCaptchaServiceTest  

如果没有指定测试类,那么会报错并导致构建失败。
Plain代码
  1. mvn test -Dtest  

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

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

4.包含与排除测试用例

如果由于历史原因,测试类不符合默认的三种命名模式,可以通过pom.xml设置maven-surefire-plugin插件添加命名模式或排除一些命名模式。
Html代码
  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项目生成测试覆盖率报告。运行下面命令生成报告:
Plain代码
  1. mvn cobertura:cobertura  

6.运行TestNG测试

TestNG是Java社区中除了JUnit之外另一个流行的单元测试框架。TestNG在JUnit的基础上增加了很多特性,其站点是http://testng.org/ .添加TestNG依赖:
Html代码
  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
Html代码
  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,如:
Html代码
  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的一大优势在于它支持测试组的概念。如可以在方法级别声明测试组:
Java代码
  1. @Test (groups={ "util" , "medium" })  

然后可以在pom中配置运行一个或多个测试组:
Html代码
  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将测试类打包,如:
Html代码
  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生成的测试代码包,可以如下配置:
Html代码
  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 >  
分享到:
评论

相关推荐

    maven常用命令以及以个测试项目

    - 在执行编译或打包时,如果不想运行测试,可以加上`-DskipTests`参数,如`mvn package -DskipTests`。 8. **更新依赖**: - `mvn dependency:update` 用来更新项目所有的依赖到最新版本。 9. **显示依赖树**: ...

    maven2 java项目管理 工具 测试 框架

    Maven 2 使用插件系统执行特定的任务,如编译代码、运行测试、打包应用等。每个插件都有一个或多个目标(goal),这些目标可以被绑定到生命周期的特定阶段。 **4. 配置与继承** POM 文件可以包含父POM引用,实现...

    基于maven install 没反应的解决方法

    在Java开发中,Maven是一个广泛使用的项目管理和自动化构建工具。它可以用来管理项目所需的各种依赖关系,并且可以执行项目的构建、测试和打包等生命周期管理工作。不过,在使用Maven时,开发者可能会遇到“maven ...

    Maven的Dependency测试

    Maven与Jenkins、Travis CI等持续集成工具兼容良好,可以在每次构建时自动执行测试,确保代码质量。 总之,Maven的Dependency测试是Java开发中至关重要的部分,通过合理地配置和管理依赖,可以保证项目的稳定性...

    maven测试HelloWorld

    运行Maven的测试命令`mvn test`,Maven会自动编译源代码,执行测试,并报告测试结果。如果一切顺利,你会看到测试通过的消息。 此外,Maven还有一些其他重要的生命周期阶段,比如`compile`用于编译源代码,`package...

    Maven跳过测试类打包

    Maven默认的生命周期中包含了多个阶段,其中一个重要的阶段是`test`阶段,该阶段主要用于运行项目的单元测试。Maven使用`s surefire-plugin`插件来执行Java应用程序的单元测试,这个插件提供了丰富的配置选项来控制...

    maven 自动发布更新本地和远程仓库

    当代码提交并推送后,可以通过持续集成工具(如Jenkins)触发构建流程,自动执行Maven的部署步骤。 7. **自动更新**: 在开发环境中,如果设置了自动拉取远程仓库的依赖,当项目被发布到远程仓库后,其他依赖该...

    maven的环境搭建、配置和测试

    - `mvn test`:运行测试。 - `mvn package`:打包项目,如生成jar或war文件。 - `mvn install`:将项目安装到本地仓库,供其他项目依赖。 - `mvn deploy`:将项目部署到远程仓库。 ### 五、Maven依赖管理 在`pom....

    maven cargo自动化部署tomcat7.pdf

    如果插件配置要求,它们将安装容器,创建本地独立配置,自动部署定义的部署单元到容器,并在父Maven实例退出时自动关闭容器。 通过以上知识点,可以看出在Maven下使用Cargo插件实现自动化部署Tomcat7的过程是相对...

    svn+maven+shell自动发布代码

    在自动部署中,Maven可以执行编译、测试、打包等任务,确保代码的质量符合部署要求。 **Shell脚本** 是Linux或Unix环境下的命令行脚本,可以执行一系列操作,如复制文件、运行程序、修改文件权限等。在自动部署过程...

    maven 使用入门第三章

    POM是Maven理解和操作项目的基础,通过解析POM,Maven能够执行各种构建任务,如编译源代码、运行测试、打包应用、生成文档等。 ### 构建生命周期 Maven的构建生命周期由一系列阶段组成,每个阶段代表构建过程中的...

    Maven3实战笔记04Maven的生命周期和插件

    当我们执行`mvn clean install`命令时,Maven将会按照以下顺序执行: 1. **clean**:执行Clean生命周期中的`clean`阶段,清理之前的构建结果。 2. **validate**:执行Default生命周期中的`validate`阶段,验证项目...

    详解maven的install的作用

    1. **maven install**:执行`install`命令,Maven会首先进行编译、测试(除非配置了跳过测试)和打包操作,然后将生成的工件(jar或war)安装到本地仓库。这意味着其他项目可以立即引用这个新版本的工件,而无需等待...

    全网最全Selenium3+Java+Maven+TestNG+ReportNG+SVN+Jenkins自动化测试环境搭建

    - **触发构建**: 设置定时任务或其他触发机制来自动执行构建和测试流程。 #### 总结 本文详细介绍了如何搭建基于Selenium3+Java+Maven+TestNG+ReportNG+SVN+Jenkins的自动化测试环境。通过这一系列的配置和设置,...

    Maven运行依赖实例

    4. **执行命令**:在Maven项目中,我们通常使用命令行工具执行`mvn clean compile`来清理、编译项目,`mvn test`来运行测试,`mvn package`来打包项目,以及`mvn install`将项目安装到本地仓库。 5. **源码分析**:...

    apache-maven-3.2.5

    通过插件,可以扩展Maven的功能,执行如Javadoc生成、单元测试、性能测试、代码覆盖率报告等多种任务。例如,`maven-jar-plugin` 用于打包Java应用为jar文件,而`maven-surefire-plugin` 则用于执行单元测试。 在...

    maven 3.6.3.zip

    5. **执行构建**:通过`mvn clean compile`命令清理并编译项目,`mvn test`运行单元测试,`mvn package`打包应用。 ** Maven的常用命令 ** - `mvn clean`:清除上一次构建生成的目标文件。 - `mvn compile`:编译...

    本地maven工程自动发布

    在本地进行Maven工程的自动发布,首先需要确保你的项目是一个有效的Maven项目,拥有正确的pom.xml配置,能通过命令行执行`mvn clean install`完成编译、测试和打包。 2. Maven打包:Maven的打包目标`package`会根据...

    maven制作本地宝1

    通过 Maven 可以自动化项目的构建过程,包括编译、测试、打包、部署等,并且能够管理项目的依赖关系,简化开发流程。 #### Maven 本地安装包制作 在给定的信息中,主要介绍了如何将 `alipay-sdk-java2010.jar` ...

Global site tag (gtag.js) - Google Analytics