zoukankan      html  css  js  c++  java
  • TestNG 参数化测试

    一、前言

      在自动化测试项目中,参数化是必不可少的,以下将会介绍TestNG中的参数化测试运用。

      TestNG可以通过两种不同的方式将参数直接传递给测试方法:

    • 使用testng.xml
    • 使用数据提供者

    二、使用testng.xml传送参数

    1、示例代码如下:

    package com.tech.design;
    
    import org.testng.annotations.Parameters;
    import org.testng.annotations.Test;
    
    public class Case {
        @Test
        @Parameters({"username","password"})
        public void Login(String username, String password){
            System.out.println("您的用户名是:"+username);
            System.out.println("您的密码是:"+password);
        }
    }

    2、xml配置如下:

    <!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
    
    <suite name="Suite1" verbose="1" >
        <test name="param">
            <parameter name="username" value="李白"></parameter>
            <parameter name="password" value="123456"></parameter>
            <classes>
                <class name="com.tech.design.Case"></class>
            </classes>
        </test>
    </suite>

    3、运行xml,结果如下:

    三、使用@DataProvider传递参数

      如果需要传递复杂的参数或java创建的对象(复杂对象、从属性文件或数据库读取数据等),通过testng.xml文件的方式可能不太适合。这种情况可以使用数据驱动的方式为你的测试提供数据。数据库驱动是在类中定义一个方法,返回一组数据对象。该方法使用@DataProvider注解。

      此处需要注意,传参的类型必须要一致,且带有@DataProvider注解的函数返回的必然是Object[][],此处需要注意。

      通过DataProvider,返回值分别是Object[][]和Iterator<Object[]>

    1、返回值是Object[][],代码如下:

    package com.tech.design;
    
    import org.testng.annotations.DataProvider;
    import org.testng.annotations.Parameters;
    import org.testng.annotations.Test;
    
    public class Case {
    
        @DataProvider(name = "data")
        public Object[][] provideData(){
            return new Object[][] { {"李白",100},{"杜甫",110},{"鲁班",210} };
        }
      //若调用者和提供在不同的类,则写法如下
      //
    @Test(dataProvider = "data",dataProviderClass = Case.class)
        @Test(dataProvider = "data")
        public void Test(String par1, int par2){
            System.out.println("姓名:"+par1+","+"年龄:"+par2);
        }
    
    }

    2、返回值是Iterator<Object[]>,代码如下:

      输出:

      4

      5

    package com.tech.design;
    
    import org.testng.annotations.DataProvider;
    import org.testng.annotations.Parameters;
    import org.testng.annotations.Test;
    
    import java.util.HashSet;
    import java.util.Iterator;
    
    public class Case {
        @DataProvider(name="testdp")
        public static Iterator<Object[]> createData() {
            HashSet<Integer> set = new HashSet<Integer>();
            set.add(Integer.valueOf(4));
            set.add(Integer.valueOf(5));
    
            HashSet<Object[]> so = new HashSet<Object[]>();
            for(Integer intg:set){
                so.add(new Object[]{intg});
            }
    
            return so.iterator();
        }
    
        @Test(dataProvider="testdp")
        public void login(Integer caseNum) {
            System.out.println(caseNum);
        }
    
    }

    3、dataProvider方法可接受 的参数:Method method, ITestContext context

      参数可以传其中一个,也可以两个一起传入,这里只演示Method参数,

      用处:当多个测试方法使用同一个@DataProvider提供的测试数据,并希望不同的测试方法返回不同的值时,这是很有用的方式

      示例:定义1个数据提供方法和2个测试方法。

    package com.tech.design;
    import org.testng.annotations.DataProvider;
    import org.testng.annotations.Test;
    
    import java.lang.reflect.Method;public class Case {
        @DataProvider(name = "datapro")
        public Object[][] Data(Method method){
            System.out.println("当前测试方法为:"+method.getName());
            Object[] S1 = new Object[]{"李白"};
            Object[] S2 = new Object[]{"张楚"};
            if(method.getName().equals("Test2")){
                return new Object[][] {S1};
            }else {
                return new Object[][] {S2};
            }
        }
    
        @Test(dataProvider = "datapro")
        public void Test1(String s){
            System.out.println(s);
        }
        @Test(dataProvider = "datapro")
        public void Test2(String s){
            System.out.println(s);
        }
    
    }

  • 相关阅读:
    剑指offer--50.滑动窗口的最大值
    剑指offer--49.矩阵中的路径
    剑指offer--48.机器人的运动范围
    剑指offer--47.数据流中的中位数
    剑指offer--46.字符流中第一个不重复的字符
    剑指offer--45.二叉树的深度
    剑指offer--44.两个链表的第一个公共结点
    剑指offer--43.连续子数组的最大和
    海盗分宝石问题
    C++数组名退化指针实例
  • 原文地址:https://www.cnblogs.com/Chilam007/p/15613213.html
Copyright © 2011-2022 走看看