51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1370|回复: 0
打印 上一主题 下一主题

[转贴] Maven Surefire Plugin 做测试用例基础执行管理

[复制链接]
  • TA的每日心情
    无聊
    4 天前
  • 签到天数: 1050 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-12-1 13:55:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     一、需求
      在测试工作场景中,经常会遇到下面的问题:
      1、执行自动化测试用例的时候,只想指定某个测试类,或者某个方法,又或者某一类用例等,怎么办?
      2、想要和 Jenkins 一起进行持续集成,可是用例又不可能在 IDE 里面执行,怎么办?
      这个时候就需要 Maven 登场了,利用 Maven 的Maven-Surefire-Plugin插件可以帮助我们完成上述的目标!它可以通过命令行的形式来管理我们要执行的用例。
      二、环境
      2.1 环境要求

      · Maven 3.x +
      · JDK 1.7 +
      2.2 支持框架
      对于我们测试来说,常接触的几个用例管理框架都支持(这里指 Java 技术栈)
      · Using TestNG
      · Using JUnit 5 Platform
      · Using JUnit
      2.3 相关依赖
      本文将以 Junit5 为例进行研究学习,所以下面的依赖添加也以 Junit5 为准。
      常用到的 Junit5 相关依赖:
    1.    <dependency>
    2.          <groupId>org.junit.platform</groupId>
    3.           <artifactId>junit-platform-launcher</artifactId>
    4.           <version>1.6.2</version>
    5.           <scope>test</scope>
    6.       </dependency>
    7.       <dependency>
    8.           <groupId>org.junit.platform</groupId>
    9.           <artifactId>junit-platform-runner</artifactId>
    10.           <version>1.5.1</version>
    11.           <scope>test</scope>
    12.       </dependency>
    13.       <dependency>
    14.           <groupId>org.junit.jupiter</groupId>
    15.           <artifactId>junit-jupiter-engine</artifactId>
    16.           <version>5.6.2</version>
    17.           <scope>test</scope>
    18.       </dependency>
    19.       <dependency>
    20.           <groupId>org.junit.vintage</groupId>
    21.           <artifactId>junit-vintage-engine</artifactId>
    22.           <version>5.6.2</version>
    23.           <scope>test</scope>
    24.       </dependency>
    复制代码
    Maven-Surefire-Plugin:

    1.  <build>
    2.      <plugins>
    3.          <plugin>
    4.              <groupId>org.apache.maven.plugins</groupId>
    5.              <artifactId>maven-surefire-plugin</artifactId>
    6.              <version>2.22.0</version>
    7.          </plugin>
    8.          <plugin>
    9.              <groupId>org.apache.maven.plugins</groupId>
    10.              <artifactId>maven-compiler-plugin</artifactId>
    11.              <version>3.8.1</version>
    12.              <configuration>
    13.                  <source>8</source>
    14.                  <target>8</target>
    15.              </configuration>
    16.               </plugin>
    17.      </plugins>
    18.   </build>
    复制代码
    指定编译 JDK 版本:
    1. <properties>
    2.       <aspectj.version>1.8.10</aspectj.version>
    3.       <maven.compiler.source>1.8</maven.compiler.source>
    4.       <maven.compiler.target>1.8</maven.compiler.target>
    5.   </properties>
    复制代码
    三、指定测试类
      现有如下结构的测试类,在此基础上进行演示:

    3.1 mvn test
      使用 mvn test 命令可以一次性执行所有的用例,执行完之后可以看到控制台中的结果:

    执行完之后我们打开 target,所有 maven 执行完的结果都会在 target 目录下的 surefire-reports 下:

     其中:
      · xml:可用于 Jenkins 解析,文件与测试类对应,里面的内容代表了测试用例的执行情况。
      · txt:测试结果的命令行输出。
      3.2 mvn -Dtest=${TestClass} test
      使用 mvn -Dtest=${TestClass} 命令可以指定运行测试类,例如:
      我这里要运行 MavenDemo1Test 下的用例,就可以使用 mvn -Dtest=MavenDemo1Test test:
     import org.junit.jupiter.api.Test; ¨K31K
    执行测试:

      $ mvn -Dtest=MavenDemo1Test test
    测试结果:

     3.3 mvn -Dtest=${TestClass1},${TestClass2} test
      我们还可以以 逗号 分隔指定多个测试类执行,例如这里我想执行 MavenDemo1Test 和 MavenDemo2Test:
    mvn -Dtest=MavenDemo1Test,MavenDemo2Test test
     测试结果:

     3.4 mvn -Dtest=${TestCi*le} test
      我们可以使用通配符来匹配要执行的测试类,例如这里我利用通配符同时指定测试类 MavenDemo1Test 和 MavenDemo2Test:
     $ mvn -Dtest=MavenDemo*Test test
    测试结果:

    3.5 mvn -Dtest=${TestCi*le},${TestClass} test
      当然,上述的测试方式组合起来也是可以的,例如这里利用通配符执行 MavenDemo1Test 和 MavenDemo2Test,再精确指定执行 MavenPackageDemoTest:
    $ mvn -Dtest=MavenDemo*Test,MavenPackageDemoTest test
     测试结果:

    四、指定测试方法
      4.1 mvn -Dtest=TestCircle#mytest test
      除了可以指定执行测试类,还可以指定测试方法,测试类 和 测试方法 之间用 # 隔开即可例如这个我想要指定执行 MavenDemo1Test 中的 test2 方法:
    $ mvn -Dtest=MavenDemo1Test#test2 test
    测试结果:

    4.2 mvn -Dtest=TestCircle#test* test
      方法依然可以使用通配符,例如这里要执行 MavenPackageDemoTest 中的方法 MavenPackageTest,可以匹配以 Test 结尾:
    $ mvn -Dtest=MavenPackageDemoTest#*Test test
     测试结果:

     4.3 mvn -Dtest=TestCircle#testOne+testTwo test
      mvn 也可以指定某个测试类下面的多个方法,使用+号分隔方法,例如指定 MavenDemo1Test 下的方法 test1() 和 test2()。
    1. $ mvn -Dtest=MavenDemo1Test#test1+test2 test
    复制代码


    五、失败重试
      mvn 还提供了失败重试,设置失败重试的次数,当用例执行时直到用例成功或者失败次数达到上限,命令如下:
    1. mvn -Dsurefire.rerunFailingTestsCount=2 test
    复制代码
    可是遗憾的是,此功能只支持 Junit4,官网给出的说明如下:

    六、套件运行
      在 Junit5 中,我们其实是可以利用 @RunWith(JUnitPlatform.class) 运行测试套件的,具体内容可参考文章:[Junit5简介、构成、新特性及基本使用-常用注解、套件执行] 。
      然而当我们使用mvn来执行套件时,套件:
    1.     import MavenTestPackage1.MavenPackageDemoTest;
    2.       import org.junit.platform.runner.JUnitPlatform;
    3.       import org.junit.platform.suite.api.SelectClasses;
    4.       import org.junit.platform.suite.api.SuiteDisplayName;
    5.       import org.junit.runner.RunWith;
    6.       @RunWith(JUnitPlatform.class)
    7.       @SuiteDisplayName("测试套件")
    8.       @SelectClasses({
    9.               MavenPackageDemoTest.class,MavenDemo1Test.class
    10.       }
    11.       )
    12.       public class TestSuite {
    13.       }
    复制代码
    mvn 命令:

      mvn -Dtest=TestSuite test
    会出现如下报错:

    据说是因为 surefire 插件的版本问题,当切换到 2.19 版本的时候,套件执行成功了,可是 mvn test 命令又失败了,这显然不是我们想要的结果,于是乎开始了 Google 之路。。。
      最终找到了一个相对合理的解释!抱歉,又要失望了,Google 到别人的解释如下(已翻译完成~):

    简单的说就是 surefire 插件暂时还不支持在 Junit5 下执行继承至 Junit4 的 @RunWith,所以还是需要有心人出来解决这个问题才行了~~
      六、Pom 中指定默认执行
      除了使用命令行,我们还可以在 pom 中指定我们默认需要执行的类或者不需要执行的类。
      例如这里我默认只想执行 MavenPackageDemoTest ,而另外两个 MavenDemo 开头的测试类我都不想执行,这个时候可以在 pom 中做如下配置,在 surefire 插件下添加 configuration:
    1. <plugin>
    2.          <groupId>org.apache.maven.plugins</groupId>
    3.          <artifactId>maven-surefire-plugin</artifactId>
    4.          <version>3.0.0-M3</version>
    5.          <configuration>
    6.              <includes>
    7.                  <include>MavenPackageDemoTest.java</include>
    8.              </includes>
    9.              <excludes>
    10.                  <exclude>MavenDemo*.java</exclude>
    11.              </excludes>
    12.          </configuration>
    13.       </plugin>
    复制代码
    执行 mvn test ,查看结果:

    从结果中可以看到仅仅执行了我们默认指定的 MavenPackageDemoTest 中的 case,其余以 MavenDemo 开头的测试类均未被执行。
      七、写在最后
      这里介绍了 maven-surefire-plugin 插件在测试执行中的一些常见用法,还有很多其他的用法,例如:
      · 使用很复杂的格式匹配
      · 控制在不同级别上的多线程和多进程执行

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-25 06:44 , Processed in 0.066511 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表