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

1.首先安装testNG

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

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

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

 package testNGSelenium.testNGDemo;

 import org.testng.annotations.Test;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Parameters; import java.util.Date;
import java.util.concurrent.TimeUnit; import org.apache.bcel.generic.NEW;
import org.apache.commons.collections.map.StaticBucketMap;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.AfterTest; public class NewTest {
//声明一个全局变量
private WebDriver driver; @Test
@Parameters({"keyWord"})
public void f(String keywords) {
final By input1 = By.id("kw");
final By button1 = By.id("su"); //智能等待页面的输入框加载出来
try { (new WebDriverWait(driver, 3)).until(new ExpectedCondition<Boolean>() { public Boolean apply(WebDriver input) {
WebElement element = input.findElement(input1);
System.out.println(new Date());
return element!= null;
}
}); } catch (Exception e) {
System.out.println("输入框3S还没加载出来!!!");
e.printStackTrace();
} //智能等待页面的搜索按钮加载出来
try {
(new WebDriverWait(driver, 3)).until(new ExpectedCondition<Boolean>() { public Boolean apply(WebDriver input) {
WebElement element = input.findElement(button1);
System.out.println(new Date());
return element!= null;
}
});
} catch (Exception e) {
System.out.println("搜索按钮等待了3秒还未加载出来");
e.printStackTrace();
} driver.findElement(input1).sendKeys(keywords);
driver.findElement(button1).click(); //等待10S,便于观察结果
try {
Thread.sleep(10000);
} catch (InterruptedException e) { e.printStackTrace();
} }
@BeforeTest
public void beforeTest() {
driver = new ChromeDriver();
//窗口最大化
driver.manage().window().maximize(); //加载页面
driver.get("http://www.baidu.com"); //设置页面完全加载时间为3秒,第二个参数TimeUnit.SECONDS是指定时间单位
driver.manage().timeouts().pageLoadTimeout(3, TimeUnit.SECONDS); } @AfterTest
public void afterTest() {
driver.quit();
} }

上面代码中用到了参数化,是需要在xml文件中设置的:

注意:

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 {
@Test
public void f1() {
System.out.println("这里是方法1,执行该方法的当前线程ID为"+ Thread.currentThread().getId()); } @Test
public void f2() {
System.out.println("这里是方法2,执行该方法的当前线程ID为"+ Thread.currentThread().getId());
} @BeforeMethod
public void beforeMethod() {
System.out.println("这里是before,执行该方法的当前线程ID为"+ Thread.currentThread().getId()); } @AfterMethod
public 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 { @Test
public void f() {
System.out.println("test1" + Thread.currentThread().getId());
} @BeforeClass
public void beforeClass() {
System.out.println("beforeClass1" + Thread.currentThread().getId());
} @AfterClass
public 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 {
@Test
public void f() {
System.out.println("test2" + Thread.currentThread().getId());
} @BeforeClass
public void beforeClass() {
System.out.println("beforeClass2" + Thread.currentThread().getId());
} @AfterClass
public 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());
} @BeforeMethod
public void beforeMethod() {
System.out.println("beforeMethod---thread" + Thread.currentThread().getId());
} @AfterMethod
public void afterMethod() {
System.out.println("afterMethod---thread" + Thread.currentThread().getId());
} /* @DataProvider
public Object[][] dp() {
return new Object[][] { new Object[] { 1, "a" }, new Object[] { 2, "b" }, };
}*/ @BeforeClass
public void beforeClass() {
System.out.println("beforeClass---thread" + Thread.currentThread().getId());
} @AfterClass
public void afterClass() {
System.out.println("afterClass---thread" + Thread.currentThread().getId());
} @BeforeTest
public void beforeTest() {
System.out.println("beforeTest---thread" + Thread.currentThread().getId());
} @AfterTest
public void afterTest() {
System.out.println("afterTest---thread" + Thread.currentThread().getId());
} @BeforeSuite
public void beforeSuite() {
System.out.println("beforeSuite---thread" + Thread.currentThread().getId());
} @AfterSuite
public 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());
} @BeforeTest
public void beforeTest() {
} @AfterTest
public 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的并发

https://www.cnblogs.com/znicy/p/6534893.html

自动化测试--testNG的更多相关文章

  1. APP接口自动化测试JAVA+TestNG(三)之HTTP接口测试实例

    前言     前两篇普及相关基础知识后,本篇主要对举例对国家气象局接口自动化测试进行讲解(Get请求及结果断言),以达到自动化测试入门目的,除了前两篇的一些了解外,需要有一定的JAVA知识(HTTP相 ...

  2. APP接口自动化测试JAVA+TestNG(二)之TestNG简介与基础实例

    前言 继上篇环境篇后,本篇主要对TestNG进行介绍,给出最最基础的两个实例,通过本文后,学会并掌握TestNG测试用例的编写与运行,以及生成美化后的报告.下一篇为HTTP接口实战(国家气象局接口自动 ...

  3. TestNG测试框架在基于Selenium进行的web自动化测试中的应用

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ TestNG+Selenium+Ant TestNG这个测试框架可以很好的和基于Selenium的 ...

  4. (转)接口自动化测试 – Java+TestNG 测试 Restful Web Service

    本文主要介绍如何用Java针对Restful web service 做接口自动化测试(数据驱动),相比UI自动化,接口自动化稳定性可靠性高,实施难易程度低,做自动化性价比高.所用到的工具或类库有 T ...

  5. 零成本实现接口自动化测试 – Java+TestNG 测试Restful service

    接口自动化测试 – Java+TestNG 测试 Restful Web Service 关键词:基于Rest的Web服务,接口自动化测试,数据驱动测试,测试Restful Web Service, ...

  6. Selenium终极自动化测试环境搭建(一) Selenium+Eclipse+Junit+TestNG

    Selenium终极自动化测试环境搭建(一)Selenium+Eclipse+Junit+TestNG 第一步 安装JDK JDk1.7. 下载地址:http://www.oracle.com/tec ...

  7. Jenkins,Maven及TestNG在自动化测试的应用(转)

    转自:http://qa.blog.163.com/blog/static/190147002201581634549893/ 希望实现的场景:Jenkins中的Job可针对不同浏览器,不同环境,运行 ...

  8. jenkins、ant、selenium、testng搭建自动化测试框架

    如果在你的理解中自动化测试就是在eclipse里面讲webdriver的包引入,然后写一些测试脚本,这就是你所说的自动化测试,其实这个还不能算是真正的自动化测试,你见过每次需要运行的时候还需要打开ec ...

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

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

随机推荐

  1. GPU CUDA编程中threadIdx, blockIdx, blockDim, gridDim之间的区别与联系

    前期写代码的时候都会困惑这个实际的threadIdx(tid,实际的线程id)到底是多少,自己写出来的对不对,今天经过自己一些小例子的推敲,以及找到官网的相关介绍,总算自己弄清楚了. 在启动kerne ...

  2. redis的事务、主从复制、持久化

    redis事务 和其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制.在Redis中, MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的基石.Redis中事务 ...

  3. js 3秒后跳转页面的实现代码

    隔多少秒后自动跳转到其它页(js脚本) 方法一: $(function(){ Load(URL); }) var secs = 3; //倒计时的秒数 var URL = "<?= u ...

  4. Unity3d获得Android和ios设备的唯一标识

    android为mac地址,ios为advertisingIdentifier 函数都比较简单,网上也搜得到,我也就不多说了,主要是对于我们没做过安卓和IOS开发的人来说,整合进工程有各种的问题. 我 ...

  5. Restframework介绍

    1.REST介绍 REST与技术无关,它代表的是一种软件架构风格,全称Representational State Transfer,中文翻译为“表征状态转移” REST从资源的角度类审视整个网络,它 ...

  6. java之递归学习

    递归思想(2018-10-22): 递归就是方法里调用自身 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口 递归算法代码显得很简洁,但递归算法解题的运行效率较低.所以不提倡用递归设计程序 ...

  7. js替换字符串中的空格,换行符\r\n或\n替换成<br>

    为了让回车换行符正确显示,需要将 \n 或 \r\n 替换成 <br>.同样地,将空格替换存  .这里我们通过正则表达式来替换. 一.替换所有的空格.回车换行符 //原始字符串 var s ...

  8. 通过Ambari2.2.2部署HDP大数据服务

    node1 amari-server   node2 amari-agent namenode1,datanode,resourcemanager,zk node3 amari-agent namen ...

  9. ECSHOP和SHOPEX快递单号查询EMS插件V8.6专版

    发布ECSHOP说明: ECSHOP快递物流单号查询插件特色 本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅 ...

  10. ruby 操作csv

    1.读取csv 文件中读取:一次读入全部(设置headers使  CSV#shift()  以CSV::Row对象返回而不是数组:使  CSV#read()  返回 CSV::Table 对象而不是数 ...