章节十六、6-xml参数化and并行case
一、读取xml文件中参数
1、案例演示---》创建一个需要读取数据的类
package testclasses; import org.testng.annotations.Test; import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
import org.testng.annotations.AfterClass; public class TestNG_Parameters { @BeforeClass
// @Parameters备注表示此次需要读取xml中的参数,需要导入(import org.testng.annotations.Parameters;)包
@Parameters({"browser","platform"})
// 为了能够接收xml文件中的value,因此在方法中我们需要定义两个变量
public void setUp(String browse,String platform) {
System.out.println("TestNG_Parameters -> Steup");
System.out.println("1. Parameters value from xml file:"+browse);
System.out.println("2. Parameters value from xml file:"+platform);
} @Test
@Parameters({"response"})
public void testMethod1(String response) {
System.out.println("TestNG_Parameters -> testMethod1"+response);
System.out.println("Response from xml file:");
} @AfterClass
public void afterClass() {
}
}
配置xml文件
<!-- 没有此行配置运行时可能会报错 -->
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Parameters TestSuite">
<test name="Test 1">
<!-- 在此处配置参数,用于在测试的时候读取数据,value中表示具体的赋值 -->
<parameter name="browser" value="firefox"></parameter>
<parameter name="platform" value="windows"></parameter>
<parameter name="response" value="201"></parameter>
<classes>
<class name="testclasses.TestNG_Parameters"></class>
</classes>
</test>
</suite>
运行结果

2、当xml中通一个parameter 中有多个值,而我们只需要读取其中一个,那么就可以将它拆分为一个数组,然后进行读取。
package testclasses; import org.testng.annotations.Test; import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
import org.testng.annotations.AfterClass; public class TestNG_Parameters { @BeforeClass
// @Parameters备注表示此次需要读取xml中的参数,需要导入(import org.testng.annotations.Parameters;)包
@Parameters({"browser","platform"})
// 为了能够接收xml文件中的value,因此在方法中我们需要定义两个变量
public void setUp(String browse,String platform) {
System.out.println("TestNG_Parameters -> Steup");
System.out.println("1. Parameters value from xml file:"+browse);
System.out.println("2. Parameters value from xml file:"+platform);
} @Test
@Parameters({"response"})
public void testMethod1(String response) {
// 将多个xml中的值拆分为数值
// split该方法可以按照指定的规则将值进行拆分,此处我们规定每个逗号间隔的为一个数组的值
String[] StringArray = response.split(",");
System.out.println("TestNG_Parameters -> testMethod1");
System.out.println("Response from xml file:"+response);
// 读取第二个位上的值,预期结果为“202”,索引从0开始
System.out.println("Response from xml StringArray[1] file:"+StringArray[1]);
}
}
xml配置:
<!-- 没有此行配置运行时可能会报错 -->
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Parameters TestSuite">
<test name="Test 1">
<!-- 在此处配置参数,用于在测试的时候读取数据,value中表示具体的赋值 -->
<parameter name="browser" value="firefox"></parameter>
<parameter name="platform" value="windows"></parameter>
<!-- 201是字符串类型的,如果想变为数值类型需要在java类中进行强制转换 -->
<parameter name="response" value="201"></parameter>
<!-- 如果有多个值,我们可以拆分为数值,读取其中指定位置的值 -->
<parameter name="response" value="201,202"></parameter>
<classes>
<class name="testclasses.TestNG_Parameters"></class>
</classes>
</test>
</suite>
运行结果为:

注:xml中的参数都是字符类型的,如果我们在代码中需要int类型,那么就进行强制转换。

二、 用testNG并行执行case
testNG在执行case时,默认按照先后顺序每次只执行一个case,如果我们需要多个case同时执行,那么就需要在xml中对suite标签进行如下配置。
场景演示---》例如我们有两个test类需要并行执行:
第一个类
package testclasses1; import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test; public class TestNG_Parallel1 { @Test
public void testMethond1() throws InterruptedException {
System.out.println("TestNG_Parallel1 -> testMethond1");
Thread.sleep(6000);
System.out.println("TestNG_Parallel1 -> testMethond1 -> More Steps");
} @Test
public void testMethond2() throws InterruptedException {
System.out.println("TestNG_Parallel1 -> testMethond2");
Thread.sleep(6000);
System.out.println("TestNG_Parallel1 -> testMethond2 -> More Steps");
}
}
第二个类
package testclasses1; import org.testng.annotations.Test; public class TestNG_Parallel2 { @Test
public void testMethond1() throws InterruptedException {
System.out.println("TestNG_Parallel2 -> testMethond1");
Thread.sleep(6000);
System.out.println("TestNG_Parallel2 -> testMethond1 -> More Steps");
} @Test
public void testMethond2() throws InterruptedException {
System.out.println("TestNG_Parallel2 -> testMethond2");
Thread.sleep(6000);
System.out.println("TestNG_Parallel2 -> testMethond2 -> More Steps");
}
}
配置xml文件:
<!-- 没有此行配置运行时可能会报错 -->
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<!-- parallel="tests"用于指定那一类标签能够并行执行,此处填写为“tests”,表示tests会并行执行,也可以填写设置classes或者class、methods等并行执行 -->
<!-- thread-count="2"表示设置并发数为2 -->
<suite name="Parallel TestSuite" parallel="tests" thread-count="2">
<test name="Test 1">
<classes>
<class name="testclasses1.TestNG_Parallel1"></class>
</classes>
</test>
<test name="Test 2">
<classes>
<class name="testclasses1.TestNG_Parallel2"></class>
</classes>
</test>
</suite>
运行结果:

三、场景结合实例演示
package testclasses1; import java.util.concurrent.TimeUnit; 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.ie.InternetExplorerDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test; /*场景:
* 1. 打开网站:https://www.migang.com
* 2. 找到登录链接并且点击它
* 3. 找到用户名和密码文本框
* 4. 在用户名和密码文本框输入值
* 5. 点击登录按钮
* 6. 在 IE 和 chrome 上并行执行这个用例*/ public class TestNG_SeleniumParametersParallelExample { WebDriver driver;
String url; @BeforeClass
@Parameters({"baseurl","browse"})
public void beforeClass(String baseurl,String browse) {
// .equalsIgnoreCase:该方法判断是否相等,忽略大小写
if(browse.equalsIgnoreCase("IE")) {
driver = new InternetExplorerDriver();
}else if(browse.equalsIgnoreCase("Chrome")){
driver = new ChromeDriver();
}
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
driver.manage().window().maximize();
driver.get(baseurl);
} @Test
@Parameters({"login","username","password","dlan","yfm","mm"})
public void Chrome(String login,String username,String password,String dlan,String yfm,String mm) {
WebElement denglu = driver.findElement(By.className(login));
denglu.click();
WebElement name = driver.findElement(By.name(username));
name.sendKeys(yfm);
WebElement pasord = driver.findElement(By.name(password));
pasord.sendKeys(mm);
WebElement button = driver.findElement(By.name(dlan));
button.click();
} @AfterClass
public void afterClass() throws InterruptedException {
Thread.sleep(6000);
driver.quit();
}
}
xml配置:
<!-- 没有此行配置运行时可能会报错 -->
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Parameters" parallel="tests" thread-count="2">
<test name = "IE Parameters" >
<parameter name="browse" value="IE"></parameter>
<parameter name="baseurl" value="https://www.migang.com"></parameter>
<parameter name="login" value="login"></parameter>
<parameter name="username" value="username"></parameter>
<parameter name="password" value="password"></parameter>
<parameter name="dlan" value="loginnow"></parameter>
<parameter name="yfm" value="1111111111"></parameter>
<parameter name="mm" value="111111"></parameter>
<classes>
<class name="testclasses1.TestNG_SeleniumParametersParallelExample"></class>
</classes>
</test>
<test name = "Chrome Parameters">
<parameter name="browse" value="Chrome"></parameter>
<parameter name="baseurl" value="https://www.migang.com"></parameter>
<parameter name="login" value="login"></parameter>
<parameter name="username" value="username"></parameter>
<parameter name="password" value="password"></parameter>
<parameter name="dlan" value="loginnow"></parameter>
<parameter name="yfm" value="1111111111"></parameter>
<parameter name="mm" value="111111"></parameter>
<classes>
<class name="testclasses1.TestNG_SeleniumParametersParallelExample"></class>
</classes>
</test>
</suite>
如果有不明白的小伙伴可以加群“555191854”问我,群里都是软件行业的小伙伴相互一起学习。
内容具有连惯性,未标注的地方可以看前面的博客,这是一整套关于ava+selenium自动化的内容,从java基础开始。
欢迎关注,转载请注明来源。
章节十六、6-xml参数化and并行case的更多相关文章
- 章节十六、1-TestNG简介
一.TestNG 介绍 1.TestNG 是一个来自 JUnit 和 NUnit 的测试框架,它具拥有更多的功能,提高了 执行的效率. 2.TestNG 是一个开源的自动化测试框架 去除了老框架的大部 ...
- 章节十六、3-TestNG方法和类注解
一.Test Suite(测试套件) 我们通常认为一个testcase就是一个测试方法,但是会有很多的testcase,所以我们不可能把所有的testcase放到同一个测试类中,假如需要测试的页面有1 ...
- Python之路(第十六篇)xml模块、datetime模块
一.xml模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单, xml比较早,早期许多软件都是用xml,至今很多传统公司如金融行业的很多系统的接口还主要 ...
- 章节十六、4-TestNG高级功能--把测试方法分优先级、分组执行
一. 把测试方法分优先级执行----->(priority=索引) 1.新建一个testng方法 package testclasses; import org.testng.annotatio ...
- 章节十六、5-TestNG高级功能--Part2
一.测试用例的依赖关系--->(dependsOnMethods = {"依赖方法名"}) 1.在实现自动化的过程中,有些测试用例必须在其它测试用例执行之后才能运行,两者之间 ...
- 章节十六、9-Listeners监听器
一.IInokedMethodListener 1.实现一个类来监听testcase的运行情况. package listenerspackage; import org.testng.IInvoke ...
- 章节十六、10-TestNG报告和日志
一.在进行自动化的过程中,日志一般采用log4j 2进行日志记录,但TestNG自己本身也带有日志记录功能(reporter),它的好处在于日志中记录的内容都是testng自动生成的. package ...
- 章节十六、2-TestNG注解和断言
一.TestNG注解的testcease不是自上而下运行的,而是按照方法名的字母排序或数字的大小顺序运行的. 二.断言:判断返回的结果与我们的预期结果是否一致. 1.Assert.assertTrue ...
- 章节十六、7-DataProviders
一.当我们的同一个test有多套数据需要进行测试,那么我们就需要用到-->DataProviders package testclasses1; import org.testng.annota ...
随机推荐
- Netty源码解析—客户端启动
Netty源码解析-客户端启动 Bootstrap示例 public final class EchoClient { static final boolean SSL = System.getPro ...
- 浅谈 ASCII、Unicode、UTF-8,一目了然
对于ASCII.Unicode.UTF-8这三种编码方式我们经常用到,也经常挂到嘴边,但他们是怎么来的,为什么要存在,具体是怎么个规则,我们并没有做深入了解,下面,就带你看一下他们到底是怎么回事吧…… ...
- S2:类的构造函数
类的构造函数构造函数名与类名形同,不返回任何值,主要完成对象的初始化工作. (1)在构造函数中,可以给属性设置默认值(2)this只带当前对象 (3)如果不给属性赋初始值,则会以默认值来填充.(4)如 ...
- 理解nodejs中的stream(流)
阅读目录 一:nodeJS中的stream(流)的概念及作用? 二:fs.createReadStream() 可读流 三:fs.createWriteStream() 可写流 回到顶部 一:node ...
- 使用 OpenSSL为WindowsServer远程桌面(RDP)创建自签名证书 (Self-signed SSL certificate)
前言 笔者查阅很多资料,才写成此文章,如有错误,请读者们及时提出. 一般大家使用远程桌面(Remote Desktop)连接Windows Server时,总会有一个警告提示,如图1 图1 出现此警告 ...
- vue-cli中的跨域之proxytable
为什么会有跨域? 浏览器有一个叫做同源策略的东西.同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互.这是一个用于隔离潜在恶意文件的重要安全机制. 同源策略规定了如果两个页面的协 ...
- ASP.NET Core MVC 之过滤器(Filter)
ASP.NET MVC 中的过滤器允许在执行管道中的特定阶段之前或之后运行代码.可以对全局,也可以对每个控制器或每个操作配置过滤器. 1.过滤器如何工作 不同的过滤器类型在管道中的不同阶段执行,因此具 ...
- 读取某个目录下的所有图片并显示到pictureBox
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- lumen错误 NotFoundHttpException in RoutesRequests.php line 442:
解决:进入 public/index.PHP 将 $app->run(); 修改成下面的: $request = Illuminate\Http\Request::capture(); $app ...
- 项目启动会(project initiating meeting)与项目开工会(kick-off meeting)区别
一.项目启动会initiating meeting 召开时间:是启动阶段结束时召开的会议:主要任务:发布项目章程,并任命项目经理,赋予项目经理动用组织资源的权力:注意事项:(1)会议召开前已经对干系人 ...