一、 需求介绍

自动化测试,尤其是接口测试时,要写大量的测试用例,这些测试用例我们当然首选使用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 target\sinopec-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是在测试类所在的线程中运行的,这很重要

Maven捆绑TestNG实现测试自动化执行、部署和调度的更多相关文章

  1. testng入门教程2用TestNG编写测试及执行测试

    编写TestNG测试基本上包括以下步骤: 测试和编写业务逻辑,在代码中插入TestNG的注解.. 添加一个testng.xml文件或build.xml中在测试信息(例如类名,您想要运行的组,等..) ...

  2. Java+Selenium 3.x 实现Web自动化 - Maven打包TestNG,利用jenkins执行测试

    1. Jenkins本地执行测试 or 服务器端执行测试 测试代码计划通过jenkins执行时,通过网上查询各种教程,大多数为本地执行测试,由此可见,本地执行是大多数人的选择. 经过探讨,最终决定采用 ...

  3. testNG设置测试的执行顺序

    在java类中,设置Test的执行顺序可以使用priority,或者enabled等属性.但是在testng.xml中,需要设置它的 preserve-order="true" 另 ...

  4. dokcer自动化构建部署java web 基于jenkins+maven+nuxus容器

    # dokcer自动化构建部署java web 基于jenkins+maven+nuxus容器 #环境centos 7.4 docker 18.03.0-ce # nuxus,创建maven本地源(可 ...

  5. Jenkins +svn +maven +tomcat+ ansible 自动化批量部署

    Jenkins +svn +maven +tomcat+ ansible 自动化批量部署 一.部署svn yum install subversion 先创建目录 mkdir /home/svn 创建 ...

  6. SpringBoot项目构建、测试、热部署、配置原理、执行流程

    SpringBoot项目构建.测试.热部署.配置原理.执行流程 一.项目构建 二.测试和热部署 三.配置原理 四.执行流程

  7. TestNG之测试执行后没有生成默认测试报告(IDEA)

    使用IDEA+TestNG进行测试,没有生成 测试报告,是因为没有勾选监听器使用默认报告,具体操作如下: “Run” -> "Edit Configurations" -&g ...

  8. 学习笔记——Maven实战(五)自动化Web应用集成测试

    自动化集成测试的角色 本专栏的上一篇文章讲述了Maven与持续集成的一些关系及具体实践,我们都知道,自动化测试是持续集成必不可少的一部分,基本上,没有自动化测试的持续集成,都很难称之为真正的持续集成. ...

  9. 基于maven+java+TestNG+httpclient+poi+jsonpath+ExtentReport的接口自动化测试框架

    接口自动化框架 项目说明 本框架是一套基于maven+java+TestNG+httpclient+poi+jsonpath+ExtentReport而设计的数据驱动接口自动化测试框架,TestNG ...

随机推荐

  1. list.sort和内置方法sorted的区别

    1.list.sort会直接修改list,不会把原来的列表复制一份,直接修改list,所以list.sort的返回值为None; 2.sorted(list)的返回值就修改之后的list,原来的lis ...

  2. fair scheduler配置

    <property>    <name>yarn.resourcemanager.scheduler.class</name>    <value>or ...

  3. icons 在线网站

    icons https://www.iconfinder.com/ http://v3.bootcss.com/components/ http://fontawesome.io/icons/ htt ...

  4. LinkedHashMap 根据PUT顺序排序Map

    最近工程里面报表需要合计 , 因为所有的项都是动态的,所以只能动态添加. 思路是使用Map,初始化所有Map,然后在Map中合计并且覆盖. 使用HashMap , 初始化后所有动态项的顺序都乱了. M ...

  5. java实现将包含多个<REC>的文件拆成若干只包含一个<REC>的文件

    遍历文件夹里的文件,将包含多个<REC>的文件拆成若干只包含一个<REC>的文件 package com.prepub; import java.io.BufferedRead ...

  6. “菜”鸟理解.NET Framework(CLI,CLS,CTS,CLR,FCL,BCL)

    既然要学.NET,就要先认识认识她,我不喜欢大段大段文字的东西,自己通过理解,画个图,来看看.NET的沉鱼落雁,闭月羞花之容. 最下层蓝色部分是.NET Framework的基础,也是所有应用软件的基 ...

  7. RFID概述

    自动识别技术的本质在于利用被识别物理对象的一些具有辨识度的特征来对物理对象进行区分和识别.因此,这些具有辨识度的特征可以是物理对象自带的特征,如指纹,人脸,语言,视网膜,心跳等,也可以是通过第三方赋予 ...

  8. TZOJ 2289 Help Bob(状压DP)

    描述 Bob loves Pizza but is always out of money. One day he reads in the newspapers that his favorite ...

  9. nodejs前端接口与状态转换调试

    和UI无关的逻辑用browser 调有时不太方便,配置 node 命令行调试环境方法如下: cnpm install @babel/core @babel/cli @babel/register @b ...

  10. BundleConfig某js文件 全部打包

    var server = HttpContext.Current.Server; var jsFiles = System.IO.Directory.GetFiles(server.MapPath(& ...