章节十六6-xml参数化and并行case

Posted luohuasheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了章节十六6-xml参数化and并行case相关的知识,希望对你有一定的参考价值。

一、读取xml文件中参数

1、案例演示---》创建一个需要读取数据的类

 1 package testclasses;
 2 
 3 import org.testng.annotations.Test;
 4 
 5 import org.testng.annotations.BeforeClass;
 6 import org.testng.annotations.Parameters;
 7 import org.testng.annotations.AfterClass;
 8 
 9 public class TestNG_Parameters 
10     
11     @BeforeClass
12 //    @Parameters备注表示此次需要读取xml中的参数,需要导入(import org.testng.annotations.Parameters;)包
13     @Parameters("browser","platform")
14 //    为了能够接收xml文件中的value,因此在方法中我们需要定义两个变量
15     public void setUp(String browse,String platform) 
16         System.out.println("TestNG_Parameters -> Steup");
17         System.out.println("1. Parameters value from xml file:"+browse);
18         System.out.println("2. Parameters value from xml file:"+platform);
19     
20     
21   @Test
22   @Parameters("response")
23   public void testMethod1(String response) 
24         System.out.println("TestNG_Parameters -> testMethod1"+response);
25         System.out.println("Response from xml file:");
26   
27 
28   @AfterClass
29   public void afterClass() 
30   
31 

配置xml文件

 1 <!-- 没有此行配置运行时可能会报错 -->
 2 <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
 3 <suite name="Parameters TestSuite">
 4     <test name="Test 1">
 5     <!-- 在此处配置参数,用于在测试的时候读取数据,value中表示具体的赋值 -->
 6     <parameter name="browser" value="firefox"></parameter>
 7     <parameter name="platform" value="windows"></parameter>
 8     <parameter name="response" value="201"></parameter>
 9         <classes>
10             <class name="testclasses.TestNG_Parameters"></class>
11         </classes>
12     </test>
13 </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配置:

 1 <!-- 没有此行配置运行时可能会报错 -->
 2 <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
 3 <suite name="Parameters TestSuite">
 4     <test name="Test 1">
 5     <!-- 在此处配置参数,用于在测试的时候读取数据,value中表示具体的赋值 -->
 6     <parameter name="browser" value="firefox"></parameter>
 7     <parameter name="platform" value="windows"></parameter>
 8     <!-- 201是字符串类型的,如果想变为数值类型需要在java类中进行强制转换 -->
 9     <parameter name="response" value="201"></parameter>
10     <!-- 如果有多个值,我们可以拆分为数值,读取其中指定位置的值 -->
11     <parameter name="response" value="201,202"></parameter>
12         <classes>
13             <class name="testclasses.TestNG_Parameters"></class>
14         </classes>
15     </test>
16 </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>

运行结果:

技术图片

 

 

三、场景结合实例演示

 1 package testclasses1;
 2 
 3 import java.util.concurrent.TimeUnit;
 4 
 5 import org.openqa.selenium.By;
 6 import org.openqa.selenium.WebDriver;
 7 import org.openqa.selenium.WebElement;
 8 import org.openqa.selenium.chrome.ChromeDriver;
 9 import org.openqa.selenium.ie.InternetExplorerDriver;
10 import org.testng.annotations.AfterClass;
11 import org.testng.annotations.BeforeClass;
12 import org.testng.annotations.Parameters;
13 import org.testng.annotations.Test;
14 
15 /*场景:
16 *    1. 打开网站:https://www.migang.com
17 *    2. 找到登录链接并且点击它
18 *    3. 找到用户名和密码文本框
19 *    4. 在用户名和密码文本框输入值
20 *    5. 点击登录按钮
21 *    6. 在 IE 和 chrome 上并行执行这个用例*/
22 
23 public class TestNG_SeleniumParametersParallelExample 
24     
25     WebDriver driver;
26     String url;
27  
28      @BeforeClass
29      @Parameters("baseurl","browse")
30       public void beforeClass(String baseurl,String browse) 
31 //         .equalsIgnoreCase:该方法判断是否相等,忽略大小写
32          if(browse.equalsIgnoreCase("IE")) 
33               driver = new InternetExplorerDriver();
34          else if(browse.equalsIgnoreCase("Chrome"))
35               driver = new ChromeDriver();
36          
37           driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
38           driver.manage().window().maximize();
39           driver.get(baseurl);
40       
41      
42      @Test
43       @Parameters("login","username","password","dlan","yfm","mm")
44       public void Chrome(String login,String username,String password,String dlan,String yfm,String mm) 
45           WebElement denglu = driver.findElement(By.className(login));
46               denglu.click();
47           WebElement name = driver.findElement(By.name(username));
48             name.sendKeys(yfm);
49           WebElement pasord = driver.findElement(By.name(password));
50               pasord.sendKeys(mm);
51           WebElement button = driver.findElement(By.name(dlan));
52               button.click();
53       
54      
55      @AfterClass
56       public void afterClass() throws InterruptedException 
57           Thread.sleep(6000);
58           driver.quit();
59       
60 

xml配置:

 1 <!-- 没有此行配置运行时可能会报错 -->
 2 <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
 3 <suite name="Parameters" parallel="tests" thread-count="2">
 4     <test name = "IE Parameters" >
 5         <parameter name="browse" value="IE"></parameter>
 6         <parameter name="baseurl" value="https://www.migang.com"></parameter>
 7         <parameter name="login" value="login"></parameter>
 8         <parameter name="username" value="username"></parameter>
 9         <parameter name="password" value="password"></parameter>
10         <parameter name="dlan" value="loginnow"></parameter>
11         <parameter name="yfm" value="1111111111"></parameter>
12         <parameter name="mm" value="111111"></parameter>
13         <classes>
14             <class name="testclasses1.TestNG_SeleniumParametersParallelExample"></class>
15         </classes>
16     </test>
17     <test name = "Chrome Parameters">
18         <parameter name="browse" value="Chrome"></parameter>
19         <parameter name="baseurl" value="https://www.migang.com"></parameter>
20         <parameter name="login" value="login"></parameter>
21         <parameter name="username" value="username"></parameter>
22         <parameter name="password" value="password"></parameter>
23         <parameter name="dlan" value="loginnow"></parameter>
24         <parameter name="yfm" value="1111111111"></parameter>
25         <parameter name="mm" value="111111"></parameter>
26         <classes>
27             <class name="testclasses1.TestNG_SeleniumParametersParallelExample"></class>
28         </classes>
29     </test>
30 </suite>

 

 

 

如果有不明白的小伙伴可以加群“555191854”问我,群里都是软件行业的小伙伴相互一起学习。

内容具有连惯性,未标注的地方可以看前面的博客,这是一整套关于ava+selenium自动化的内容,从java基础开始。

欢迎关注,转载请注明来源。

以上是关于章节十六6-xml参数化and并行case的主要内容,如果未能解决你的问题,请参考以下文章

unittest参数化

jmeter(四十六)参数化与断言实战

如何并行化具有多个参数的简单 python def [重复]

unittest的参数化(parameterized模块)

使用 Joblib 将类对象实例作为输入参数的并行化函数

Python学习笔记10--unittest参数化