该文章主要介绍 testNG(testing next generation,下一代测试技术)框架的使用。

1.首先安装testNG




2.安装完成后,创建maven项目,导入TESTNG和selenium依赖。


3.此时就可以直接创建testNG的测试类了




4.下面通过 百度页面打开、输入关键字、进行搜索,来简单演示一下testNG的使用


注意:

1.如果使用了参数化,则必须在XML文件上run as TestNG,否则会提示得不到参数的。

2.运行完成后,我们可以在项目目录中看到多了一个test-output

对其中的emailable-report.html右键—open with—web browser,就可以打开如下的测试报告:


关于配置文件的简单介绍:


通过上面的配置文件介绍,你可能会问,如果parallelism设置为true,是不是就可以跑多线程了??

是的!!!激不激动,开不开心!这个多线程可以支持我们做两件事:

1.多个线程来跑同一套件中的不同方法、不同类、不同组件---------------------这样,当我们的测试代码很庞大的时候,会非常节省运行时间

2.用来测试多线程同步问题。举个栗子-----------当有段代码涉及到:不同线程访问同一对象,并且会对该对象作出修改的时候,我们就可以针对这段代码来设计:多个线程同时跑这段代码,来测试下开发的线程同步是不是已经处理好啦。

下面来介绍下TestNG提供的多线程测试的不同使用方法,为了便于理解,这里使用的都是笔者写的最简单的demo:

一:并行的执行某方法

package testNGSelenium.testMethodParallelism;import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;public class MethodParallelismTest {@Testpublic void f1() {System.out.println("这里是方法1,执行该方法的当前线程ID为"+ Thread.currentThread().getId());}@Testpublic void f2() {System.out.println("这里是方法2,执行该方法的当前线程ID为"+ Thread.currentThread().getId());}@BeforeMethodpublic void beforeMethod() {System.out.println("这里是before,执行该方法的当前线程ID为"+ Thread.currentThread().getId());}@AfterMethodpublic void afterMethod() {System.out.println("这里是after,执行该方法的当前线程ID为"+ Thread.currentThread().getId());}}

对应修改XML文件为:

该代码的执行结果为:


二:并行的执行同一套间下同一组件中的不同class

package testNGSelenium.testClassesParallelism;import org.testng.annotations.Test;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;public class ClassesParallelism1 {@Testpublic void f() {System.out.println("test1" + Thread.currentThread().getId());}@BeforeClasspublic void beforeClass() {System.out.println("beforeClass1" + Thread.currentThread().getId());}@AfterClasspublic void afterClass() {System.out.println("afterClass2" + Thread.currentThread().getId());}}
package testNGSelenium.testClassesParallelism;import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;public class ClassesParallelism2 {@Testpublic void f() {System.out.println("test2" + Thread.currentThread().getId());}@BeforeClasspublic void beforeClass() {System.out.println("beforeClass2" + Thread.currentThread().getId());}@AfterClasspublic void afterClass() {System.out.println("afterClass2" + Thread.currentThread().getId());}}

对应XML的设置:

该代码的执行结果为:


三:同一套间中的不同组件并行

package testOneSuitTwoTest;import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Parameters;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.AfterSuite;public class OneSuitTwoModuleTest {@Test@Parameters({"location"})public void f(String p) {System.out.println(p);System.out.println("Test---thread" + Thread.currentThread().getId());}@BeforeMethodpublic void beforeMethod() {System.out.println("beforeMethod---thread" + Thread.currentThread().getId());}@AfterMethodpublic void afterMethod() {System.out.println("afterMethod---thread" + Thread.currentThread().getId());}/*    @DataProviderpublic Object[][] dp() {return new Object[][] { new Object[] { 1, "a" }, new Object[] { 2, "b" }, };}*/@BeforeClasspublic void beforeClass() {System.out.println("beforeClass---thread" + Thread.currentThread().getId());}@AfterClasspublic void afterClass() {System.out.println("afterClass---thread" + Thread.currentThread().getId());}@BeforeTestpublic void beforeTest() {System.out.println("beforeTest---thread" + Thread.currentThread().getId());}@AfterTestpublic void afterTest() {System.out.println("afterTest---thread" + Thread.currentThread().getId());}@BeforeSuitepublic void beforeSuite() {System.out.println("beforeSuite---thread" + Thread.currentThread().getId());}@AfterSuitepublic void afterSuite() {System.out.println("afterSuite---thread" + Thread.currentThread().getId());}}

对应的XML设置为:

上面代码的执行结果为;


四:多线程执行某方法

package testNGSelenium.moreThreadTest;import org.testng.annotations.Test;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;public class MoreThreadTest {//这里代表 启动三个线程,该方法总共执行9遍,设置整个测试方法的超时时间为2S@Test(threadPoolSize=3,invocationCount=9,timeOut=2000)public void f() {System.out.println("Test---threadId:"+Thread.currentThread().getId());}@BeforeTestpublic void beforeTest() {}@AfterTestpublic void afterTest() {}}

对应的XML文件并没有特别设置啥参数。

执行结果为:

注意点:

1.如果有童鞋在运行TESTNG套件的时候,遇到了ElementTravelsal找不到的问题,则在自己的pom.xml文件中引入依赖包:xml-apis

<!-- https://mvnrepository.com/artifact/xml-apis/xml-apis -->
<dependency>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
<version>1.4.01</version>
</dependency>

2.如果遇到运行程序之后,在console窗口遇到了乱码:

请打开eclipse.ini文件,并添加: -Dfile.encoding=UTF-8

3.一个xml中间,只能有一个suite标签;

一个suite可以有多个test,test名称必须不同(否则报错:Two tests in the same suite cannot have the same name);

一个test中间可以包含多个class,

一个class里面可以包含多个方法

4.在testNg的 suite file中,添加上

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

相当于标签控制,只有合法标签才能输入。否则报错。

5.如果读者使用的开发工具是IDEA,那么久不需要安装testNG的插件了。IDEA是自带了testNG的插件的。只要在maven中添加testNg的包就可以了。

6.老的版本中

<suite name="suitname1" parallel="true" thread-count="2">

parallel的值是没有“true”的。
分为tests,classes,methods级别

tests:不同test tag下的用例可以在不同的线程执行,相同test tag下的用例只能在同一个线程中执行

classes:不同class tag下的用例可以在不同的线程执行,相同class tag下的用例只能在同一个线程中执行。

methods:所有用例都可以在不同的线程去执行。

7.关于dataprovider的并发

自动化测试--testNG相关推荐

  1. JAVA 使用WinAppDriver对QT桌面软件进行自动化测试

    JAVA 使用WinAppDriver对QT桌面软件进行自动化测试 一.前置条件 1. 准备工具 工具名称 描述 下载地址 WinAppDriver.exe 支持桌面软件UI自动化测试的服务 http ...

  2. 微服务项目后台技术栈

    微服务项目后台相关技术整理 主要技术 ORM框架-Mybatis Plus Mybatis Plus核心功能 MyBatis Plus与SpringBoot集成 MyBatis Plus集成Sprin ...

  3. 你要知道的测试面试题

    1.自我介绍和介绍 这一般是面试的第一个问题,记住每个人的简历都不一样,但是jd只有一份.所以要研究这个岗位的jd,再来定制自我介绍,去掉无关的,强调相关的,着重突出能给你加分的.所以一般都有这个套路 ...

  4. 测试开发工程师常见面试题

    1. CPU 和 GPU的区别 CPU 力气大啥P事都能干,还要协调. GPU 上面那家伙的小弟,老大让他处理图形,这方面处理简单,但是量大,老大虽然能处理,可是老大只有那么几个兄弟,所以不如交给小弟 ...

  5. 自动化测试框架cucumber_基于Cucumber和Testng的WebUI自动化测试方法与流程

    本发明涉及计算机技术领域,具体的说是基于Cucumber和Testng的WebUI自动化测试方法. 背景技术: 行为驱动测试方法已经在敏捷开发模式中普遍使用,通过使用标准化的语言将客户需求人员.开发人 ...

  6. testng 定时构建_Jenkins使用安装:持续集成自动化方案 | Web自动化测试方案

    相信每一个测试都会碰到过新功能上线时,需要对其它相关功能进行回归的情况:或者出现一些线上bug,而我们没能够及时发现的情况.jenkins+selenium+ant+testng架构实现了线上功能的监 ...

  7. 基于TestNG 与Selenium 的自动化测试设计与实施

    1.引言 软件测试是关系到软件开发和维护成本的重要环节.任何软件产品在正式发布之前都必须经过严格的测试.随着计算机技术的迅速发展,软件的结构越来越复杂,同业竞争越来越激烈.为了保证软件产品的高度可靠性 ...

  8. 基于Selenium2和TestNG的自动化测试

    为什么80%的码农都做不了架构师?>>>    [IT168 技术]Selenium是时下很流行的面向web的自动化测试工具,它以执行效率高,覆盖的浏览器广泛等优点得到了很多人的亲睐 ...

  9. TestNG 自动化测试入门教程--典型示例

    TestNG介绍 TestNG是Java中的一个测试框架, 类似于JUnit 和NUnit,   功能都差不多, 只是功能更加强大,使用也更方便 Java中已经有一个JUnit的测试框架了.  Tes ...

最新文章

  1. Metasploit发布了版本5.0.76
  2. Struts2请求参数合法性校验机制
  3. 深度学习(十八)基于R-CNN的物体检测-CVPR 2014-未完待续
  4. 网页全终端视频流媒体视频直播/点播播放器EasyPlayer.js实现WEB播放H265/HEVC视频方案介绍
  5. ASP.NET的Page.IsPostBack 属性详细说明(转)
  6. Java 调用树莓派硬件资源
  7. 九个console命令调试JS
  8. 宝宝的成长脚印6/15
  9. 云服务器带宽如何计算,云服务器怎么选择带宽
  10. centos7 mysql8.0.15_Centos7 安装MySQL8.0.15
  11. Unity3D 下载与安装
  12. 新浪微博开放平台_Xweibo,修改设置…
  13. zTree插件setting配置详解
  14. 反激电源电路电磁干扰原理
  15. 2018年第九届蓝桥杯JAVA A组国赛 —— 第二题:阅兵方阵(暴力)
  16. 【安卓】设置应用的开机启动
  17. 如何利用社交媒体进行跨境电商营销—扬帆际海
  18. Git之深入解析如何借助Git的配置方法和钩子机制来自定义Git需求
  19. 【Java应用程序开发】【期末复习题】【2022秋】【答案仅供参考】
  20. 复现Dense Extreme Inception Network(pytorch)

热门文章

  1. QT4.7.3在dm6446平台上的移植[转]--make[1]: *** [assistant_cs.qm] Error 2
  2. 爱情是碗 不开盖的红烧肉----转载
  3. ipc-rpc-xmlrpc
  4. 史上最全的开发和设计资源大全
  5. 初步了解关于js跨域问题
  6. 写了个数码照片的自动分类整理工具
  7. link 和 style 元素在 HTML 文档中的位置
  8. IBM 启动网格项目 -- “全球社区网格”,招募志愿者
  9. 基于Go语言实现高并发推荐系统架构设计
  10. 【报告分享】2021年数字化浪潮在中国的发展和实践.pdf(附下载链接)