Maven的生命周期:

  讲解Maven测试篇之前将首先介绍一下Maven生命周期的相关概念,如果你熟知这部分概念可以略过此小节内容。
  通常,我们在构建一个项目的时候,不外乎是对其进行清理、编译、测试和部署等操作。对于大多数项目,我们每次都要重复这些必要的过程,而Maven正是对这些必要的构建过程进行了抽象,它以项目的清理、初始化、编译、测试、打包、部署等构建步骤作为项目生命周期的各个阶段。
   每个Maven项目,都有三个相互独立的生命周期,其中包括:
  • clean生命周期:负责项目的清理工作;
  • default生命周期:负责项目的部署;
  • site生命周期:负责创建项目的文档站点;
  其中各个生命周期又包含不同的阶段(如下图所示),例如clean生命周期下有pre-clean、clean和post-clean三个阶段,分别负责项目清理前的工作、清理上次构建的项目和项目清理后的工作,这些阶段是顺序执行的,也就是说,当你执行pre-clean阶段的时候,clean和post-clean阶段不会被执行,当你执行clean阶段的时候,pre-clean阶段和clean阶段会被执行,post-clean阶段不会被执行,当你执行post-clean阶段时候,pre-clean、clean和post-clean这三个阶段都会依次被执行。同理,default生命周期和site生命周期下也分为各个不同的阶段,这些阶段和clean生命周期下的各个阶段一样,后面阶段的执行依赖于前面的阶段执行。
 
                                  Maven生命周期及生命周期下的阶段示意图
  此时你可能认为,当执行default生命周期下的某个阶段时,clean生命周期下的所有阶段也会被执行,其实并非这样。正如之前所说,Maven项目的每个生命周期是相互独立的,执行某个生命周期下的某个阶段,不会对另外两个生命周期下的任何阶段产生影响。
如果要对Maven生命周期下的某个阶段进行调用,运行相应的Maven命令即可。例如,调用clean生命周期下的clean阶段,运行如下命令:
  1. mvn clean
此时clean 生命周期下的pre-clean和clean阶段将被执行。
如果要调用default 生命周期下的package阶段,运行如下命令: 
  1. mvn package
此时在default生命周期内,package阶段之前所有的阶段将被执行,package阶段也将被执行。
如果要对项目进行打包,在项目打包之前可能需要对项目上一次的构建进行删除清理,运行如下命令:
  1. mvn clean package
 此时在clean生命周期内,clean阶段之前所有的阶段将被执行,clean阶段也将被执行。default生命周期内package阶段之前所有的阶段和package阶段也将被执行。
如果要执行项目测试,运行如下命令:
  1. mvn test
此时在default生命周期内,test阶段之前所有的阶段将被执行,test阶段也将被执行。
  Maven的每个阶段都绑定了一个或多个插件,调用某个阶段时,具体任务将交由这个阶段所绑定的插件来完成。比如进行项目测试时,需要调用default生命周期下的test阶段,但具体任务将是交由“maven-surefire-plugin”插件完成的,因为test阶段与“maven-surefire-plngin”插件进行了绑定。这个“maven-surefire-plngin” 插件就是一个测试运行器,它与主流的测试框架(Junit3、Junit4和TestNG)进行了集成。

引用“maven-surefire-plngin”插件依赖

  因为“maven-surefire-plngin”插件是Maven内置绑定的,即使你不在“pom.xml”文件中对”maven-surefire-plngin”插件做相关配置,调用default生命周期的test阶段时,Maven也会使用“maven-surefire-plngin”插件执行相关任务。当然你还可以在“pom.xml”文件中自定义配置这个插件:
  1. <project>
  2. [...]
  3. <build>
  4. <pluginManagement>
  5. <plugins>
  6. <plugin>
  7. <groupId>org.apache.maven.plugins</groupId>
  8. <artifactId>maven-surefire-plugin</artifactId>
  9. <version>2.20</version>
  10. </plugin>
  11. </plugins>
  12. </pluginManagement>
  13. </build>
  14. [...]
  15. </project>

整合TestNG

  使用TestNG作为测试框架时,需要在Maven项目的“pom.xml”文件中配置TestNG依赖,这里需要在<scope/>元素中将TestNG的依赖范围配置为test。
  1. <dependencies>
  2. [...]
  3. <dependency>
  4. <groupId>org.testng</groupId>
  5. <artifactId>testng</artifactId>
  6. <version>6.9.8</version>
  7. <scope>test</scope>
  8. </dependency>
  9. [...]
  10. </dependencies>
  你还可以在项目路径下创建一个“testng.xml”文件,这个文件主要用来描述测试套件和测试执行相关参数的配置,但它不是TesgNG必须的配置文件,如果你没有创建“testng.xml”文件,也就不需要对“maven-surefire-plngin”插件做“testng.xml”文件的相关配置。
  1. <!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
  2. <suite name="testSuite">
  3. <test name="test">
  4. <classes>
  5. <class name=“ATest" />
  6. </classes>
  7. </test>
  8. </suite>
上面是以一份简要的“testng.xml”配置文件,它首先定义了一个名称为“testSuite”的测试套件,这个测试套件内包含一个测试名称为“test”的测试,这个测试指定了一个“ATest”测试类,“ATest”类是一个简单的TestNG测试类,清单如下:

  1. import org.testng.Assert;
  2. import org.testng.annotations.Test;
  3. public class ATest {
  4. @Test
  5. public void testIsTrue(){
  6. A a=new A();
  7. Assert.assertTrue(a.returnTrue());
  8. }
  9. }
在“maven-surefire-plngin”插件中引入“testng.xml”文件,只需要在“pom.xml”文件中添加如下配置:
  1. <project>
  2. [...]
  3. <build>
  4. <pluginManagement>
  5. <plugins>
  6. <plugin>
  7. <groupId>org.apache.maven.plugins</groupId>
  8. <artifactId>maven-surefire-plugin</artifactId>
  9. <version>2.20</version>
  10. <configuration>
  11. <suiteXmlFiles>
  12. <suiteXmlFile>testng.xml</suiteXmlFile>
  13. </suiteXmlFiles>
  14. </configuration>
  15. </plugin>
  16. </plugins>
  17. </pluginManagement>
  18. </build>
  19. […]
  20. </project>
这里主要介绍了Maven与TestNG的整合相关配置,有关TestNG更详细的教程请参阅官方文档。

约定优于配置:

  在默认情况下,“maven-surefire-plugin”插件将自动执行项目“src/test/java”路径下的测试类,但测试类需要遵从以下命名模式,Maven才能自动执行它们:  
  • Test*.java :以Test开头的Java类;
  • *Test.java :以Test结尾的Java类;
  • *TestCase.java:以TestCase结尾的Java类;
 跳过测试:
  如果要求Maven跳过测试,在Maven命令行中加入skipTests参数即可:
  1. mvn package -DskipTests
 执行以上命令之后,Maven会在构建日志中打印跳过测试执行的信息:
除了执行Maven 命令时指定参数来跳过测试,还可通过在“pom.xml”文件中通过配置“maven-surefire-plugin”插件来跳过测试: 
  1. <project>
  2. [...]
  3. <build>
  4. <plugins>
  5. <plugin>
  6. <groupId>org.apache.maven.plugins</groupId>
  7. <artifactId>maven-surefire-plugin</artifactId>
  8. <version>2.20</version>
  9. <configuration>
  10. <skipTests>true</skipTests>
  11. </configuration>
  12. </plugin>
  13. </plugins>
  14. </build>
  15. [...]
  16. </project>
再次通过“mvn package”命令对项目进行构建,打印日志如下:
如果不仅要跳过测试类的执行,还要临时性的跳过测试代码编译,可以执行以下命令:
  1. mvn package -Dmaven.test.skip=true
此时项目构建的日志中显示没有对测试代码进行编译,并且跳过了测试类的执行:
Dmaven.test.skip=true 参数控制了“maven-compiler-plugin” 和“maven-surefire-plugin” 两个插件的行为,在项目构建过程中跳过了测试代码的编译和测试。此外,还可以通过配置“pom.xml”文件,完成与上述执行Maven命令同样的效果: 
  1. <project>
  2. [...]
  3. <build>
  4. <plugins>
  5. <plugin>
  6. <groupId>org.apache.maven.plugins</groupId>
  7. <artifactId>maven-compiler-plugin</artifactId>
  8. <version>2.5.1</version>
  9. <configuration>
  10. <skip>true</skip>
  11. </configuration>
  12. </plugin>
  13. <plugin>
  14. <groupId>org.apache.maven.plugins</groupId>
  15. <artifactId>maven-surefire-plugin</artifactId>
  16. <version>2.20</version>
  17. <configuration>
  18. <skipTests>true</skipTests>
  19. </configuration>
  20. </plugin>
  21. </plugins>
  22. </build>
  23. [...]
  24. </project>

动态指定要运行的测试类:

在进行单元测试时,有时候不需要执行项目中所有的测试类,“maven-surefire-plugin”插件支持命令中设置Dtest参数,来执行指定的测试类。例如只执行“ATest” 测试类:
  1. mvn -Dtest=ATest test
  1. maven-surefire-plugin“插件还支持使用星号匹配测试类名的方式以指定运行特定的测试类,星号表示匹配零个或多个字符。例如只执行”A“开头的测试类:
  1. mvn -Dtest=A* test
  1. 除了使用星号匹配,还可以使用逗号指定多个测试类:
  1. mvn test -Dtest=ATest,BTest
  1. 同时匹配类名以A开头的测试类和类名为BTest的测试类:
  1. mvn -Dtest=A*,BTest test
  1. test命令通过参数匹配不到任何测试类时,项目将会构建失败。配置参数DfailIfNoTests=false可以在匹配不到测试类时依旧构建成功:
  1. mvn -Dtest=AATest -DfailIfNoTests=false test
  使用DfailIfNoTests=false参数也是另一种跳过测试的方法。“maven-surefire-plugin”插件并没有提供通过指定测试类的类名来跳过执行某个测试类的命令,但可以通过在“pom.xml”文件中进行排除指定的测试类。

包含与排除测试用例:

<include/>元素配置的测试类名将会被执行:
  1. <project>
  2. [...]
  3. <build>
  4. <plugins>
  5. <plugin>
  6. <groupId>org.apache.maven.plugins</groupId>
  7. <artifactId>maven-surefire-plugin</artifactId>
  8. <version>2.20</version>
  9. <configuration>
  10. <includes>
  11. <include>**/*Tests.java</include>
  12. </includes>
  13. </configuration>
  14. </plugin>
  15. </plugins>
  16. </build>
  17. [...]
  18. </project> 
其中“ **/*Tests.java”匹配以Tests结尾的Java类,其中两个星号用来表示匹配任意路径,一个星号用来匹配路径风格符除外的零个或多个字符。
使用<excludes/>元素中排除执行匹配到的测试类:
  1. <project>
  2. [...]
  3. <build>
  4. <plugins>
  5. <plugin>
  6. <groupId>org.apache.maven.plugins</groupId>
  7. <artifactId>maven-surefire-plugin</artifactId>
  8. <version>2.20</version>
  9. <configuration>
  10. <excludes>
  11. <exclude>**/CTest.java</exclude>
  12. <exclude>**/DTest.java</exclude>
  13. </excludes>
  14. </configuration>
  15. </plugin>
  16. </plugins>
  17. </build>
  18. [...]
  19. </project>

参考资料:

Maven文档:http://maven.apache.org/guides/

maven-surefire-plugin 文档:http://maven.apache.org/surefire/maven-surefire-plugin/

=====================================================================

 结束: 欢迎给我留言

Maven测试篇的更多相关文章

  1. Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例)

    这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...

  2. Apache Maven 入门篇 ( 上 )

    作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法. 这个入门篇分上下两篇.本文着重动手,用 mav ...

  3. [转]Apache Maven 入门篇 ( 上 )

    原文地址:Apache Maven 入门篇 ( 上 ) 作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这 ...

  4. IntelliJ IDEA使用心得之Maven项目篇(转)

    IntelliJ IDEA使用心得之Maven项目篇   今天和大家分享下,在IDEA中打开Maven项目的方法. 对于新版的IDEA可以直接打开Maven项目,但是对于旧版的IDEA需要使用Mave ...

  5. Maven——基础篇

    Maven--基础篇 Maven出现前的问题 一个项目就是一个工程,而工程内一般是通过package包来分模块,比较用户模块,订单模块等,如果项目过于庞大,通过包模块来划分就不太合适,而应该拆分为模块 ...

  6. Maven提高篇系列之(六)——编写自己的Plugin(本系列完)

    这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...

  7. Maven提高篇系列之(五)——处理依赖冲突

    这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...

  8. Maven提高篇系列之(四)——使用Profile

    这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...

  9. Maven提高篇系列之(三)——使用自己的Repository(Nexus)

    这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...

随机推荐

  1. html 压缩工具 html-minifier

    https://github.com/kangax/html-minifier#options-quick-reference 1.参数列表 option Description Default re ...

  2. WinForm中控件位置不随窗体大小的变化而改变

    背景:在窗体开发中使控件的位置不随窗体的大小改变而变化的问题?这是一个同事在开发时遇到的问题,在思考试错之后,写出如下代码. 声明成员: Point m_InitLocation; Size m_In ...

  3. React之key详解

    一个例子 有这样的一个场景如下图所示,有一组动态数量的input,可以增加和删除和重新排序,数组元素生成的组件用index作为key的值,例如下图生成的ui展示: 上面例子中的input组件渲染的代码 ...

  4. Java设置Excel单元格式

    XSSFWorkbook wb = new XSSFWorkbook(); CellStyle style = wb.createCellStyle(); style.setBorderRight(C ...

  5. 在jquery中each循环中,要用return false代替break,return true代替continue。

    在jquery中each循环中,要用return false代替break,return true代替continue. $.each(data, function (n, value) { if(v ...

  6. oracle 归档日志满 报错ORA-00257: archiver error. Connect internal only, until freed

    归档日志满导致无法用户无法登陆 具体处理办法 --用户登陆 Microsoft Windows [Version 6.1.7601] Copyright (c) Microsoft Corporati ...

  7. Java多线程中线程间的通信

    一.使用while方式来实现线程之间的通信 package com.ietree.multithread.sync; import java.util.ArrayList; import java.u ...

  8. linux性能之iostat

    在使用linux系统的过程中,总是可能需要当前io性能的状态信息是怎么样?这里就就是一下iostat,可以通过iostat来初步查看io的状态信息. 1.常用方式 iostat -xdk 1 10 或 ...

  9. NGINX中的proxy_pass和rewrite

    文章作者:luxianghao 文章来源:http://www.cnblogs.com/luxianghao/p/6807081.html 转载请注明,谢谢合作. 免责声明:文章内容仅代表个人观点,如 ...

  10. Mysql net start mysql启动,提示发生系统错误 5 拒绝访问,原因所在以及解决办法

    1,Mysql net start mysql启动,提示发生系统错误 5 拒绝访问 在dos下运行net  start MySQL 不能启动mysql!提示发生系统错误 5:拒绝访问!切换到管理员模式 ...