美文网首页
Testng注解之dataprovider(参数化)

Testng注解之dataprovider(参数化)

作者: 明小五 | 来源:发表于2020-09-09 10:10 被阅读0次

    数据驱动是最常见的自动化测试框架模式之一,TestNG亦支持数据驱动,常用的有@Parameters和@DataProvider两种注解。这次主要是记录dataprovider的用法。
    使用DataProvider提供数据有两种形式:

    第一种:测试代码和测试数据放在同一个类中;

    定义一个函数,函数名随意取,使用@DataProvider注解,注解中用name给这个provider起名字,该函数返回一个二维数组。

    package BaseTestCast;
    
    import org.testng.annotations.DataProvider;
    import org.testng.annotations.Test;
    
    public class Testdemo {
       @DataProvider(name = "data")
        public Object[][] createData1() {
            return new Object[][] {
                    { "zhangsan", 36},
                    { "lisi",20},
                    { "wanger",20} };
        }
    //定义了属性name时,提取数据时可以使用name,没有定义name时,提取数据时直接使用方法名称。
        @Test(dataProvider = "data") 
        public void testProvider(String n1, Integer n2) {//参数必须和DataProvider返回的一致
            System.out.println(n1 + " " + n2);
        }
    }
    
    运行结果:

    可以看到该测试方法运行了3次,每一次都把一个DataProvider提供的数组作为自己的参数输入然后执行了测试。

    第二种:把所有的数据提供都单独写在一个类里面,当测试数据比较多时,这种方法利于维护。

    这种方式需通过dataProviderClass属性来指定@DataProvider类位置,并且@DataProvider注解的方法保持静态(static)。示例:

    //数据类:
    public class dataProviderDemo {
        @DataProvider(name = "data")
        public static Object[][] createData1() {
            return new Object[][] {
                    { "zhangsan", 36 },
                    { "lisi",20},
                    { "wanger",20}
            };
        }
    }
    
    //test类:
    public class Testdemo {
        @Test(dataProvider = "data",dataProviderClass = dataProviderDemo.class)
        public void testProvider(String n1, Integer n2) {
            System.out.println(n1 +","+ n2);
        }
    }
    

    运行test后,结果:

    zhangsan,36
    lisi,20
    wanger,20
    

    除了上述的return Object[][],@DataProvider注解的方法也允许使用迭代器,区别是迭代器允许你延迟创建自己的测试数据,TestNG会调用迭代器,之后测试方法会一个接一个的调用由迭代器返回的值。在你需要传递很多参数组给测试方法的时候,无须提前创建一堆值。

    package BaseTestCast;
    
    import org.testng.annotations.DataProvider;
    import org.testng.annotations.Test;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class Testdemo {
        @DataProvider
        public Iterator<Object[]> providerString() {
            List<Object> item = new ArrayList<>();
            for (int i = 0; i < 5; i++) {
                item.add(String.valueOf(i));
            }
    
            List<Object[]> users = new ArrayList<>();
            for (Object u : item) {
                users.add(new Object[]{u});
            } 
            return users.iterator();
        }
        @Test(dataProvider = "providerString")
        public void testmethod(String param) {
            System.out.println("method received:" + param);
        }
    }
    
    运行结果:
    • 1、使用二维数组作为参数输出,每一个单元作为参数输出
    • 2、使用迭代类型作为参数输出,每一个迭代作为参数输出

    带Method参数的DataProvider

    如果希望DataProvider对不同的Test方法使用不同的dataprovider,那么在DataProvider中可以使用Method参数。

    package BaseTestCast;
    
    import org.testng.annotations.DataProvider;
    import org.testng.annotations.Test;
    
    import java.lang.reflect.Method;
    
    public class Testdemo {
    
        @Test(dataProvider = "data")
        public void getFirst(String name, int age) {
            System.out.println("print第一组"+name+";"+age);
        }
    
        @Test(dataProvider = "data")
        public void getSecond(String name, int age) {
            System.out.println("print第二组 " + name +";"+age);
        }
        @Test(dataProvider = "data")
        public void getthird(String name, int age) {
            System.out.println("print第三组 " + name +";"+age);
        }
    
        @DataProvider(name = "data")
        public Object[][] provider(Method method) {
            Object[][] objects;
            if (method.getName().equals("getFirst")) {              //如果调用该DataProvider的函数是getFirst,那么就返回这个数组
                objects = new Object[][] { { "test11", 11 }, { "test12", 12 } };
            } else if (method.getName().equals("getSecond")) {//如果调用该DataProvider的函数是getSecond,那么就返回这个数组
                objects = new Object[][] { { "test21", 21 }, { "test22", 22 } };
            } else {                                                                    //如果调用该DataProvider的函数不是getFirst也不是getSecond,那么就返回这个数组
                objects = new Object[][] { {"test31",31}, {"test32",32} };
            }
    
            return objects;
        }
    
    }
    
    运行结果:

    这里根据调用DataProvider的函数名,返回了不同的参数。
    由于没有指定运行顺序,所以Test会按照字母顺序执行,先执行getFirst,然后getSecond..

    参考文档:
    1、https://my.oschina.net/771328074/blog/832423
    2、https://www.cnblogs.com/lixiaowei395659729/p/8717992.html
    3、https://www.cnblogs.com/beifucangqiong/p/11246988.html

    相关文章

      网友评论

          本文标题:Testng注解之dataprovider(参数化)

          本文链接:https://www.haomeiwen.com/subject/bzpdektx.html