七、使用maven进行测试

非常感谢大家的支持和鼓励,我会一如既往的坚持下去,为了我自己,更为我爱的人向前冲刺^_^

love.jpg

今天我们要讲的是maven测试相关的知识,主要是对测试时使用到的几个插件进行讲解
maven本身并不是一个测试框架,在java世界里,测试框架为junittestng,maven要执行测试,只是在特定的生命周期中绑定具体的插件并执行相应的目标来达到测试目的的
maven中进行测试的插件为maven-surefire-plugin
maven-surefire-plugin插件默认会自动执行测试源码包下面遵循

  1. **/Test*.java
  2. **/*Test.java
  3. **/*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提倡约定优于配置,所以用户应该尽量遵循测试类的命名,不要随意改变其结构

  1. 包含指定测试类
    包含所有以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结尾的测试类

  1. 排除指定的测试类
<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.javaTestCase.java结尾的测试类

跳过测试

maven-surefire-plugin插件提供了两种逃过测试的方式

  1. 跳过测试,但仍然要对测试源码进行编译(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>
  1. 跳过测试,同时跳过测试代码的编译
    mvn package -Dmaven.test.skip=true

基本测试报告

除了命令行输出,maven用户还可以以文件的方式生成更丰富的测试报告
默认情况下,maven-surefire-plugin会在target/surefire-reports目录下生成两种格式的错误报告:

  1. 简单文本格式(比如com.zheng.SayHelloTest.txt
  2. 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

test.png

在浏览器访问效果如下:
test1.png

test2.png

在上面的代码左侧显示了运行当前测试时测试执行的覆盖次数,需要注意的是,这里只有对主代码(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插件中提供了两个目标: jartest-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包依赖跟普通的依赖有点区别的地方在于scopetest域,表示在测试时使用,而typetest-jar

以上主要讲了maven插件maven-surefire-plugin结合junittestng运行项目测试的知识,这一章的知识就到此完哒,在接下来我们将学习如何使用已经成熟的scm工具软件自动构建与部署我们自己的项目

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 自动化单元测试,通过maven-surefire-plugin于主流单元测试框架junit3,junit4及Tes...
    JarvisTH阅读 582评论 0 1
  • 使用指导 如何添加外部依赖jar包 在Maven工程中添加依赖jar包,很简单,只要在POM文件中引入对应的<de...
    静默虚空阅读 2,788评论 0 13
  • 前言 在Java项目开发中,项目的编译、测试、打包等是比较繁琐的,属于重复劳动的工作,浪费人力和时间成本。以往开发...
    JourWon阅读 1,117评论 0 1
  • 我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编...
    付鹏丶阅读 1,620评论 0 15
  • Maven简介 maven这个词可以翻译为“知识的积累”或者“专家”。 Maven能帮我们做的事: 项目构建:Ma...
    快给我饭吃阅读 531评论 0 0