TestNG参数化测试之DataProvider用法

添加依赖

  <dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>6.8.8</version>
      <scope>test</scope>
  </dependency>

使用DataProvider提供数据有两种形式:

  1. 把测试代码和测试数据放在同一个类中;
  2. 把所有的数据提供都单独写在一个类里面,当测试数据比较多时,这种方法利于维护。

用法

1. 常规用法

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class ParamTestWithDataProvider1 {
    @DataProvider(name = "test1")
    public static Object[][] primeNumbers() {
        return new Object[][] { { 2, true ,"hi"}, { 6, false ,"test"}, { 19, true ,"good"},
                { 22, false ,"aha"}, { 23, true ,"loo"} };
    }
    
    //参数必须要一致
    @Test(dataProvider = "test1")
    public void testPrimeNumberChecker(Integer inputNumber,
                                       Boolean expectedResult, String test) {
        System.out.println(inputNumber + " " + expectedResult+" "+test);
    }
}

2. 带Method参数的DataProvider

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

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import java.lang.reflect.Method;

public class ParamTestWithDataProvider2 {
    @Test(dataProvider = "provider")
    public void getFirst(String name, int age) {
        System.out.println("第一组"+name);
    }
    
    @Test(dataProvider = "provider")
    public void getSecond(String name, int age) {
        System.out.println("第二组 " + name);
    }
    
    @DataProvider(name = "provider")
    public Object[][] provider(Method method) {
        Object[][] objects;
        if (method.getName().equals("getFirst")) {              //如果调用该DataProvider的函数是getFirst,那么就返回这个数组
            objects = new Object[][] { { "cq1", 20 }, { "cq2", 22 } };
        } else if (method.getName().equals("getSecond")) {//如果调用该DataProvider的函数是getSecond,那么就返回这个数组
            objects = new Object[][] { { "cq3", 20 }, { "cq4", 22 } };
        } else {                                                                    //如果调用该DataProvider的函数不是getFirst也不是getSecond,那么就返回这个数组
            objects = new Object[][] { {"cq5",33}, {"cq6",34} };
        }
        
        return objects;
    }
}

3. 通过DataProviderClass 把测试数据文件引过来

import org.testng.annotations.DataProvider;

public class DataProviderMethod {
    //无指定数据名称,默认使用方法名
    @DataProvider
    public static Object[][] NoNameMethod(){
        return new Object[][]{
                {"DataWithNoName1"},
                {"DataWithNoName2"},
                {"DataWithNoName3"}
        };
    }
    //指定名称1
    @DataProvider(name="dataprovider1")
    public static Object[][] dataProvider1(){
        return new Object[][]{
                {"dataprovider1-1"},
                {"dataprovider1-2"}
        };
    }
    //指定名称2
    @DataProvider(name="dataprovider2")
    public static Object[][] dataProvider2(){
        return new Object[][]{
                {"dataprovider2-1"},
                {"dataprovider2-2"}
        };
    }
}
import org.testng.annotations.Test;

public class ParamTestWithDataProvider3 {
    @Test(dataProvider="NoNameMethod",dataProviderClass=DataProviderMethod.class)
    public void doTestNG(String testdatas) {
        System.out.println("未指定名称,数据源名为方法名NoNameMethod:"+testdatas);
    }
    
    @
Test(dataProvider="dataprovider1",dataProviderClass=DataProviderMethod.class)
    public void doTestNG1(String testdatas){
        System.out.println("指定名称,数据源名称选择了dataprovider1:"+testdatas);
    }
    
    @Test(dataProvider="dataprovider2",dataProviderClass=DataProviderMethod.class)
    public void doTestNG2(String testdatas){
        System.out.println("指定名称,数据源名称选择了dataprovider2:"+testdatas);
    }
}

4. 带懒加载的数据驱动,@DataProvider标记的方法除了可以返回数组外,还可以返回一个Iterator,这样的好处是不用把所有的测试数据都加载到内存中,而是需要的时候就读一条。

参考

  1. https://www.cnblogs.com/beifucangqiong/p/11246988.html
  2. https://www.cnblogs.com/beifucangqiong/p/11266894.html
  3. https://www.cnblogs.com/lixiaowei395659729/p/8717992.html
  4. https://blog.csdn.net/wangjie0925/article/details/80653935
  5. https://blog.csdn.net/qq_30353203/article/details/77865040
posted @ 2021-03-02 09:20  zendwang  阅读(370)  评论(0编辑  收藏  举报