七、使用maven进行测试

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

七、使用maven进行测试_第1张图片
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结尾的测试文件

    org.apache.maven.plugins
    maven-surefire-plugin
    2.7
    
        
            **/*Tests.java
        
    

上面通过includes包含Tests.java结尾的测试类

  1. 排除指定的测试类

    org.apache.maven.plugins
    maven-surefire-plugin
    2.7
    
        
            **/*Tests.java
            **/*TestCase.java
        
    

上面通过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中的具体配置,但是这种方式是不推荐的,因为如果长时间让项目跳过测试,那还要测试代码做什么呢?


    org.apache.maven.plugins
    maven-surefire-plugin
    2.7
    
        true
    

  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)支持
具体需要引入下面插件依赖:


    
        org.codehaus.mojo
        cobertura-maven-plugin
        2.7
    

当然可以通过maven-help-plugin插件查看cobertura插件有哪些目标
通过运行mvn cobertura:cobertura将会在target/site/cobertura目录下生成index.html

七、使用maven进行测试_第2张图片
test.png

在浏览器访问效果如下:
七、使用maven进行测试_第3张图片
test1.png

七、使用maven进行测试_第4张图片
test2.png

在上面的代码左侧显示了运行当前测试时测试执行的覆盖次数,需要注意的是,这里只有对主代码 (src/main/java)里面的类进行统计,如果将测试服务代码写入测试 (src/test/java)目录下则将无法进行覆盖率统计

testng测试

testng 是又一款流行的java测试框架,意为test next generation
使用testng需要去掉junit依赖,并添加testng依赖


    org.testng
    testng
    5.9
    jdk15

相比于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



    
        
            
        
    

修改测试代码注释

@Test(groups = {"test1", "test2"})
    public void sayHello() {
        HelloService helloService = new HelloServiceImpl();
        String hello = helloService.sayHello();
        System.out.println(hello);
    }

还需要借助maven-surefire-plugin来进行打包测试


    org.apache.maven.plugins
    maven-surefire-plugin
    2.20
    
        
        
            
        
        
        
            test1,test2
        
    

上面的代码通过@Test,groups指定当前测试方法属于test1,test2分组的,然后通过maven-surefire-plugin指定执行的测试分组test1,test2,于是测试代码就神奇的运行起来了

打包测试代码

通常情况下,我们通过maven打包项目代码是不会将测试代码一起打包出来的,为了做到这一点,需要使用maven-jar-plugin插件的test-jar打包目标



    org.apache.maven.plugins
    maven-jar-plugin
    2.6
    
        
            
                test-jar
            
        
    

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包呢?
不要惊慌,下面就给出答案
我们通过下面配置方式来引用被打包的测试代码:


    com.zheng.mvnstudy
    mvn-study
    1.0-SNAPSHOT
    test
    test-jar

需要注意上面引入的测试jar包依赖跟普通的依赖有点区别的地方在于scopetest域,表示在测试时使用,而typetest-jar

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

你可能感兴趣的:(七、使用maven进行测试)