Maven单元测试

分类: maven  2012-05-09 15:17  1986人阅读  评论(1)  收藏  举报
maven 测试 junit 单元测试 java random

目录(?)[-]

  1. maven-surefire-plugin简介
  2. 跳过测试
  3. 动态指定要运行的测试用例
  4. 包含与排除测试用例
  5. 生成测试报告
    1. 基本测试报告
    2. 测试覆盖率报告
  6. 运行TestNG测试
  7. 重用测试代码

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]  view plain copy print ?
  1. mvn package -DskipTests

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

[html]  view plain copy print ?
  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]  view plain copy print ?
  1. mvn package -Dmaven.test.skip=true

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

[html]  view plain copy print ?
  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]  view plain copy print ?
  1. mvn test -Dtest=RandomGeneratorTest

也可以使用通配符:

[plain]  view plain copy print ?
  1. mvn test -Dtest=Random*Test

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

[plain]  view plain copy print ?
  1. mvn test -Dtest=Random*Test,AccountCaptchaServiceTest

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

[plain]  view plain copy print ?
  1. mvn test -Dtest

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

[plain]  view plain copy print ?
  1. mvn test -Dtest -DfailIfNoTests=false

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

4.包含与排除测试用例

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

[html]  view plain copy print ?
  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]  view plain copy print ?
  1. mvn cobertura:cobertura

6.运行TestNG测试

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

[html]  view plain copy print ?
  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]  view plain copy print ?
  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]  view plain copy print ?
  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]  view plain copy print ?
  1. @Test(groups={"util","medium"})

然后可以在pom中配置运行一个或多个测试组:
[html]  view plain copy print ?
  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]  view plain copy print ?
  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]  view plain copy print ?
  1. <dependency>
  2. <groupId>com.juvenxu.mvnbook.account</groupId>

转载于:https://www.cnblogs.com/zhangchuan210/p/3445046.html

Maven运行JUnit测试(http://www.360doc.com/content/13/0927/15/7304817_317455642.shtml)相关推荐

  1. junit 循环测试_重复运行JUnit测试而没有循环

    junit 循环测试 最近,我遇到了一个问题,我不得不编写一种方法的测试,该方法需要计算在一定可能性范围内的随机分布值1 . 更准确地说,如果您假设签名看起来像 interface RandomRan ...

  2. 重复运行JUnit测试而没有循环

    最近,我遇到了一个问题,我不得不编写一种方法的测试,该方法需要计算在一定可能性范围内的随机分布值1 . 更准确地说,如果您假设签名看起来像 interface RandomRangeValueCalc ...

  3. http://www.360doc.com/content/18/0406/16/15102180_743316618.shtml

    http://www.360doc.com/content/18/0406/16/15102180_743316618.shtml 转载于:https://www.cnblogs.com/xiongw ...

  4. http://www.360doc.com/content/07/0103/19/16773_317325.shtml

    http://www.360doc.com/content/07/0103/19/16773_317325.shtml

  5. http://www.360doc.com/content/10/0307/00/45806_17835784.shtml

    http://www.360doc.com/content/10/0307/00/45806_17835784.shtml

  6. http://www.360doc.com/content/14/1112/10/597197_424477810.shtml

    http://www.360doc.com/content/14/1112/10/597197_424477810.shtml

  7. Android项目运行junit测试类时出现错误Internal Error (classFileParser.cpp:3494)的解决办法...

    以前的项目运行好好的,升级了ADT后,进行junit测试时出现错误: # # A fatal error has been detected by the Java Runtime Environme ...

  8. ant接口自动化 junit_Jenkins + Ant自动运行Junit测试

    自动化测试脚本需要频繁执行,也可能需要定时执行,执行的方法可能有很多种,下面我们来讲讲怎么使用Jenkins+Ant的方式来执行用例. 一.使用工具 Jenkins Ant Junit 二.Ant T ...

  9. maven进行junit测试时报错(二)

    2019独角兽企业重金招聘Python工程师标准>>> 错误描述:[ERROR] Failed to execute goal org.apache.maven.plugins:ma ...

最新文章

  1. 这老哥把GPU当暖气用,省钱了!
  2. Twitter团队最新研究:快速高效的可扩展图神经网络SIGN
  3. Notification 浏览器右下角弹出提示消息
  4. vue截取一个字符串_vue如何截取字符串
  5. geometry-api-java 学习笔记(七)拓扑运算之cut
  6. vue加百度统计代码(亲测有效)
  7. JDBC8.0 URL配置
  8. webpack那些事儿
  9. Domain Socket本地进程间通信
  10. 链路层基本问题 : 封装成帧、差错检测、流量控制
  11. 最in的一期,来自大厂的邀请|C课有道
  12. 获取http地址如何从上面抓取图片_用 Python 自动抓取妹子图
  13. 理论基础 —— 二叉树 —— 树、森林、二叉树的转换
  14. 数据湖存储格式Hudi原理与实践
  15. 1万字说清楚Receiver Operating curve(ROC) 受试者操作特征曲线
  16. 电脑中了MEMZ病毒怎么办
  17. NLPIR/ICTCLAS中文分词系统 java相关api文档总结
  18. rog主板php,华硕主板有哪些系列 华硕主板各系列区别对比
  19. 计算机上自带的打字游戏,完美运行金山打字通2016(包括自带的小游戏)
  20. ckfinder的使用

热门文章

  1. 真的很棒!看道翰天琼认知智能机器人哇塞表现 (3)
  2. 【狂神】Mysql学习(代码)
  3. 测试驱动开发(TDD)前端篇
  4. Python简史:开发者的小副业如何成为全球最热编程语言?
  5. 关于成像中的flicker原理
  6. 达梦数据库分区表的使用
  7. 接口测试基础--柠檬不萌!
  8. java读取共享文件_使用文件流,读写网络共享盘
  9. phaser.js前端游戏引擎
  10. Android之启动奔溃提示异常java.lang.SecurityException: Permission Denial: startForeground