一、 需求介绍

自动化测试,尤其是接口测试时,要写大量的测试用例,这些测试用例我们当然首选使用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. oracle数据库用户删除及表空间删除

    以system用户登录,查找需要删除的用户: --查找用户 select  * from dba_users; --查找工作空间的路径select * from dba_data_files; --删 ...

  2. 关于SQL 导出脚本失败 及SQL 的重装

    说点题外话 最近跳到一家新公司 薪资比较客观 但是技术可能不太尽如人意 而且对.Net方向的开发好像不是很友好  自己也不知道该怎么办 一个人大老远跑这边来 附近也没有什么.net的公司和职位 房子租 ...

  3. Java8 之stream

    总概述:Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggregate operation),或者大批量数据操 ...

  4. Java基础(命令行操作、注释及API、)

    一.常用的dos命令. dir:列出当前目录下的文件及文件夹 md:创建目录 rd:删除目录 cd:进入到指定目录 cd..:退出到上一级目录 cd\:退出到根目录 del:删除文件 exit:退出d ...

  5. material palette

    https://www.materialpalette.com/

  6. laravel 模型操作

    1. 简介 2. 创建模型 //模型文件默认创建在app目录下,也可以指定创建在某个文件夹下,如Model/Goods 1. php artisan make:model Goods 2. 这种方式会 ...

  7. pwnable.kr-passcode-witeup

    进入远端运行, 废话不多说,下载下来分析. 根据提示,编译一下子. 知道问题了. 想象着,输入的值到了passcode1和passcode2的值作为地址的地方,passcode1处刚输入值时,程序终止 ...

  8. intelliJ idea如何安装、配置

    https://www.cnblogs.com/jajian/p/7989032.html

  9. Java多线程02(线程安全、线程同步、等待唤醒机制)

    Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...

  10. struts2各个功能详解(1)----参数自动封装和类型自动转换

    struts2里面的各个功能,现在确实都不清楚,完全属于新学! 通过前面的例子,有时就会疑问,这些jsp中的数据信息是怎么传送给action的?例如: <form action = " ...