zoukankan      html  css  js  c++  java
  • Maven捆绑TestNG实现测试自动化执行、部署和调度

    一、 需求介绍

        自动化测试,尤其是接口测试时,要写大量的测试用例,这些测试用例我们当然首选使用TesteNG编写,用例数量大,还涉及各种依赖包之类的问题,因此用Maven管理也是最方便最易实现的。

    面临的问题是:

        TestNG的模式,在IDE中运行很方便,这个做法在开发测试用例的时候是必走的步骤,因为对于测试用例本身的代码,我们也需要调试测试,让它没有BUG,才能用它测试别人的代码或者接口从命令行上运行TestNG,如果是个普通的Java工程,指定一个CLASSPATH,然后把所有的依赖JAR包放进去即可通过java -cp my_class_path org.testng.TestNG testng.xml运行,然而这种方式不能解决依赖项和版本冲突的问题,对于大团队多项目的情况并不适用在Maven工程中,我们如果将所有测试用例写到/src/test/java目录中,只需要使用mvn test命令就可以运行了,也使用Maven解决了各种依赖问题,但是这个时候如果要进行测试用例的转移交流,我们只能使用工程源代码,因为使用mvn package打出来的包中,是没有测试代码的,无法拿出去交流或者部署到命令行上以CLI的方式单独运行

    针对以上问题,我们只需要将TestNG和Maven进行深度捆绑,就可以轻松解决,同时我们引入ReportNG,让测试报告更加美观一些。

    完成这些过程,再将工程部署到Jenkins上去,就能同时实现手动调度、自动调度、任务触发、远程调度。而且,开发阶段在IDE中调试测试不影响,使用IDE的机制运行测试用例可以全部运行(在测试用例类上点击右键选择运行这种方式),使用Maven的机制可以使用testng.xml的所有配置策略(比如支付接口只测试幂等接口而不测试非幂等的)。所有问题全部解决。

     二、配置实现

    2.1 首先引入TestNG

    在pom.xml中加入对TestNG的依赖项,这个很简单了:

    1.  
      <dependency>
    2.  
      <groupId>org.testng</groupId>
    3.  
      <artifactId>testng</artifactId>
    4.  
      <version>6.10</version>
    5.  
      </dependency>

    2.2 完成Maven与TestNG的捆绑

    在pom.xml的build->plugins节点下添加下面的内容:

    1.  
      <plugin>
    2.  
      <groupId>org.apache.maven.plugins</groupId>
    3.  
      <artifactId>maven-surefire-plugin</artifactId>
    4.  
      <version>2.20.1</version>
    5.  
      <configuration>
    6.  
      <suiteXmlFiles>
    7.  
      <suiteXmlFile>testng.xml</suiteXmlFile>
    8.  
      </suiteXmlFiles>
    9.  
      </configuration>
    10.  
      </plugin>

    这样就可以实现Maven运行test命令时按照TestNG的testng.xml配置运行相应的测试用例,运行mvn test指令即可。

    2.3 引入ReportNG

    这一步是在第二步的基础上,但是要完成这一步,我们首先要在工程中加入对ReportNG的依赖:

    1.  
      <!-- 依赖velocity -->
    2.  
      <dependency>
    3.  
      <groupId>velocity</groupId>
    4.  
        <artifactId>velocity-dep</artifactId>
    5.  
        <version>1.4</version>
    6.  
      </dependency>
    7.  
       
    8.  
      <!-- 依赖Guice -->
    9.  
      <dependency>
    10.  
      <groupId>com.google.inject</groupId>
    11.  
          <artifactId>guice</artifactId>
    12.  
          <version>3.0</version>
    13.  
          <scope>test</scope>
    14.  
      </dependency>
    15.  
       
    16.  
      <!-- 依赖reportNg 关联testNg -->
    17.  
      <dependency>
    18.  
      <groupId>org.uncommons</groupId>
    19.  
          <artifactId>reportng</artifactId>
    20.  
          <version>1.1.5</version>
    21.  
          <scope>test</scope>
    22.  
          <exclusions>
    23.  
           <exclusion>
    24.  
               <groupId>org.testng</groupId>
    25.  
                  <artifactId>testng</artifactId>
    26.  
              </exclusion>
    27.  
           </exclusions>
    28.  
      </dependency>

    ReportNG官方提供的ReportNG JAR包从Maven中央仓库中是可以使用的,版本号是1.1.4(2013年之后没再更新了),但是它对报告中的中文处理有问题,会乱码,所以我改了它的源代码之后重新编译了(顺便改了它的groupId,以避免和官方的混淆不清,让别人误会以为官方又出新版本了呢),但是它是一个Ant工程而不是Maven工程,我编译完成之后没有上传到公司的Nuxus私服库,所以使用的是本地依赖,那么ReportNG本身又有对velocity和guice这两个东西有依赖,那就得一起加上吧。事实上如果不加,是会报错的。

    加入了工程对ReportNG的依赖之后,我们就使用它对已经与Maven捆绑的TestNG配置进行个性化,如下所示:

    1.  
      <plugin>
    2.  
      <groupId>org.apache.maven.plugins</groupId>
    3.  
      <artifactId>maven-surefire-plugin</artifactId>
    4.  
      <version>2.20.1</version>
    5.  
      <configuration>
    6.  
      <suiteXmlFiles>
    7.  
      <suiteXmlFile>testng.xml</suiteXmlFile>
    8.  
      </suiteXmlFiles>
    9.  
      <properties>
    10.  
             <!-- Setting ReportNG listeners -->
    11.  
             <property>
    12.  
                 <name>listener</name>
    13.  
                    <value>org.uncommons.reportng.HTMLReporter,
    14.  
      org.uncommons.reportng.JUnitXMLReporter
    15.  
      </value>
    16.  
      </property>
    17.  
      </properties>
    18.  
        </configuration>
    19.  
      </plugin>

    2.4 集成打包

    完成上面三步之后,我们就可以使用了,然而还有一个问题,就是这个Maven工程打包成Jar之后仍然不能直接在命令行上运行,必须依赖于Maven正确安装的情况下使用mvn test命令才能在命令行上运行,那么我们进一步改造它。

    其实很简单,只需要使用maven-shade-plugin这个插件就可以轻松实现,我们在pom.xml的build->plugins节点下添加下面的内容:

    这样的配置,是指定在调用mvn package指令的时候,就可以完成打包,打的包中包含了依赖项,可以独立运行,我是这样运行的:

    java -jar targetsinopec-lmk-1.0.1.jar testng.xml

    有一点需要强调一下:

    测试用例要写到/src/main/java目录下,如果写到/src/test/java下,是不起作用的。

    3. 附加信息

    3.1 对于Maven与TestNG捆绑,还有更详细的文档

    Maven官方给出的详细用法,文档链接:http://maven.apache.org/surefire/maven-surefire-plugin/examples/testng.html

    还有一篇文章对Maven与TestNG的用法也做了详细的介绍,文档链接:http://howtodoinjava.com/testng/how-to-execute-testng-tests-with-maven-build/

    3.2 maven-shade-plugin插件的应用

    Maven官方也给出了详细的用法介绍,文档链接:https://maven.apache.org/plugins/maven-shade-plugin/usage.html

    3.3 TestNG并发运行测试注意事项

    这几点是我在使用它的时候总结出来的,供大家参考:

    3.3.1 TestNG注解BeforeTest和BeforeClass的区别

    最开始使用的时候,我一直以为BeforeTest是运行测试方法之前执行,BeforeClass是加载测试类的时候执行,事实上不是的。

    BeforeTest是在TestNG启动测试任务之前执行,AfterTest是在TestNG完成测试任务之后执行。

    BeforeClass是在运行测试方法之前执行,AfterClass是在运行测试方法之后执行。

    3.3.2 线程数的控制及对测试的影响

    在testng.xml中,我们可以配置并行运行的策略,以及线程的数量,我经过多次尝试,发现parallel设置为classes是比较合理的,因为创建线程开销也很大,一个类一个线程已经比较奢侈了。

    另外启用并行运行测试时,建议设置preserve-order的值为false,也就是不按照预定顺序运行,会是乱序的,这有助于我们多次运行测试用例时发现不同的问题。

    还有,如果启用并行测试,BeforeTest和AfterTest是在主线程中运行的,而BeforeClass和AfterClass是在测试类所在的线程中运行的,这很重要

  • 相关阅读:
    git 删除所有提交下的某个文件
    Sublime Text 中文
    git 常用文件目录介绍
    设计模式之——单例模式
    Mysql系统知识梳理
    Spring系列之——使用了哪些设计模式
    JAVA基础之——三大特征、接口和抽象类区别、重载和重写区别、==和equals区别、JAVA自动装箱和拆箱
    集合系列问题
    做一个优秀的职场人才
    Spring系列之——Spring事务以及两大核心IOC和AOP
  • 原文地址:https://www.cnblogs.com/dong-dong-dong/p/9555940.html
Copyright © 2011-2022 走看看