TestNG---参数化之DataProvider

前言 
测试参数化能让测试大量的数据集变为可能,也大大方便数据的修改和测试脚本的编写,测试参数化让数据和脚本分离开来,方便后续的维护。 
这一篇先来说说数据提供者DataProvider

数据提供者@DataProvider 
注解@DataProvider在参数化测试中起到重要的作用,该注解下的函数返回数据类型需要时Object[][],看例子如何实现:

1、简单使用

    @DataProvider(name = "testcase")
    public Object[][] dataProvider(){
        return new Object[][]{
                {"小李"},
                {"小赵"},
                {"小明"},
                {"小周"}
        };
    }


@Test测试用例,属性dataProvider需要指定对应的数据提供者名称

    @Test(dataProvider = "testcase")
    public void testcase(String name){
        System.out.println(name);
    }


执行结果

create test :com.testproj.Demo.TestDataProvider@38bc8ab5
[TestNG] Running:
  E:\OPPO\JavaProject\TestNGProj\res\testNG.xml
小李
小赵
小明
小周
 
2、@DataProvider函数插入参数使用 
@DataProvider函数可以插入Method和ITestContext类型参数,这两个参数里面可以获取很多有用的信息,看如何使用:

@DataProvider函数

    @DataProvider(name = "methodITestContext")
    public Object[][] dataProvider(Method method, ITestContext context){
        System.out.println("#############"+context.getName());
        System.out.println("*************"+method.getName());

        return new Object[][]{
                {"金"},
                {"木"},
                {"水"},
                {"火"},
                {"土"},
        };

    }


@Test测试执行脚本

    @Test(dataProvider = "methodITestContext")
    public void testcase5(String name){
        System.out.println(name);
    }


执行结果

create test :com.testproj.Demo.TestDataProvider@5bb21b69
[TestNG] Running:
  E:\OPPO\JavaProject\TestNGProj\res\testNG.xml
#############testDemo1
*************testcase5





 
3、延迟数据提供者 
有时候我们需要大量参数进行读取的话,比如参数提供是从读取数据库获取的话,数据达到百万等级都会有,这样遍历所有信息时,就会导致内存溢出,有个简单方法可以解决这个问题:当我们获取了一个数据,对它执行测试方法,然后就废弃这个数据对象,再测试下一个对象。这个原则是延迟初始化,这个思想就是当你真正需要一个对象时才创建它,而不是提前创建它。 
为了实现这种方法,TestNG允许我们从数据提供者返回一个Iterator对象,而不是一个二维对象数组。 
Iterator是java.util包中的一个接口,它的方法签名如下:

public interface Iterator<E> {

    boolean hasNext();
    E next();
    default void remove();

 }


它可以通过next调用下一组数据,这样就有机会在最后一刻实例化相应的对象,即刚好在需要在这些参数的测试方法被调用之前。 
下面例子是重写后的例子,我们实现了一个Iterator,它将返回4个带有不同ID的对象;

    class AccoutIterator implements Iterator {

        private int index =0;
       static private final int MAX  =4;
        @Override
        public boolean hasNext() {
            return index<MAX;
        }

        @Override
        public Object next() {
            return new Object[]{
                    //这里就是放入要实现的对象或者一组数据
                    "你好!"+(index++)
            };
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException("remove");
        }
    }


@DataProvider函数调用

   @DataProvider(name = "iterator")
    public Iterator<Object[]> iteratorDataProvider(){
        return new AccoutIterator();

    }


@Test测试运行函数

    @Test(dataProvider = "iterator")
    public void testcase2(String name){
        System.out.println(name);
    }


运行结果

create test :com.testproj.Demo.TestDataProvider@38bc8ab5
[TestNG] Running:
  E:\OPPO\JavaProject\TestNGProj\res\testNG.xml
你好!0
你好!1
你好!2
你好!3
 
4、提供数据方式

我们可以从哪些方面获取数据呢 
有以下方式,看各位的需求了

 

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值