如何使用maven进行测试

发表于:2017-8-28 15:20

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:小炼君    来源:51Testing软件测试网采编

  今天我们要讲的是maven测试相关的知识,主要是对测试时使用到的几个插件进行讲解
  maven本身并不是一个测试框架,在java世界里,测试框架为junit与testng,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结尾的测试类
  2.排除指定的测试类
  <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.java、TestCase.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>
  2.跳过测试,同时跳过测试代码的编译
  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插件中提供了两个目标: jar和test-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包依赖跟普通的依赖有点区别的地方在于scope是test域,表示在测试时使用,而type为test-jar
  以上主要讲了maven插件maven-surefire-plugin结合junit和testng运行项目测试的知识,这一章的知识就到此完哒,在接下来我们将学习如何使用已经成熟的scm工具软件自动构建与部署我们自己的项目。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号