zoukankan      html  css  js  c++  java
  • TestNG中DataProvider的用法

    一、为什么要使用DataProvider

    1. DataProvider可以实现类似Factory的数据驱动的测试,而且使用DataProvider的时候,被测试方法所在的类只被创建一次,只是方法被调用多次,所以比较省时省力
    2. DataProvider还可以实现懒加载,在需要测试大量数据的时候可以一条一条的加载数据,而不需要一次性把数据加载到内存中,避免了内存的浪费,和可能的内存不够用的危险

    二、DataProvider的常规用法

    1. 定义一个函数,函数名随意取,使用@DataProvider注解,注解中用name给这个provider起名字,该函数返回一个二维数组
    2. 该函数返回的二维数组每一行就代表一次测试的参数,每一行的元素跟Test中需要的参数一一对应(通常情况下数组类型是Object,但是可以用其他自定义类型代替)
    3. 在需要使用provider的方法的Test注解上,用provider属性指向上面的DataProvider
    public class TestDataProvider {
    
            @DataProvider(name="provider")
    	public Object[][] provider(){
    		Object [][] provider = new Object [5][2];
    		for (int i = 0; i < provider.length; i++) {
    			provider[i][0] = "name"+i;
    			provider[i][1] = i+10;
    		}
    		
    		return provider;
    	}
    	
    	@Test(dataProvider="provider")
    	public void getName(String name,int age){
    		System.out.println(name+"_"+age);
    		
    	}	
    }
    

      输出

    [TestNG] Running:
      C:UsersAdministratorAppDataLocalTemp	estng-eclipse-1631420346	estng-customsuite.xml
    
    name0_10
    name1_11
    name2_12
    name3_13
    name4_14
    PASSED: getName("name0", 10)
    PASSED: getName("name1", 11)
    PASSED: getName("name2", 12)
    PASSED: getName("name3", 13)
    PASSED: getName("name4", 14)
    
    ===============================================
        Default test
        Tests run: 5, Failures: 0, Skips: 0
    ===============================================
    

      

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

    三、带Method参数的DataProvider

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

    @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;
    }        
    

      

    这里根据调用DataProvider的函数名,返回了不同的参数。
    由于没有指定运行顺序,所以Test会按照字母顺序执行,先执行getFirst,然后getSecond。
    执行getFirst时发现有两组参数,就先把第一组参数传进去执行一遍,再把第二组参数传进去执行一遍。
    执行getSecond时也是同样的顺序,所以最后的执行顺序是
    ①getFirst输入第一组参数
    ②getFirst输入第二组参数
    ③getSecond输入第一组参数
    ④getSecond输入第二组参数

    四、带ITestContext的DataProvider

    在Dataprovider中可以带一个ITestContext 参数,从这个参数中可以获取该方法执行时的一些上下文信息,比如context.getIncludeGroups就可以得到这个测试执行的分组,这样在不同的分组中就可以可以向测试执行类传递不同的参数了。

    五、DataProvider的其他位置

    在@Test标签中使用dataProvider属性时还可以额外指定一个dataProviderClass属性,这个属性可以定义dataProvider函数的位置类,如果不指定这个属性就会在@Test所在的类中寻找dataProvider,如果指定了就会在指定的类中寻找dataProvider。指定类中的dataProvider必须是static方法。

    Tips:dataProvider调用后的方法,在TestNG插件或报告中的方法名后面会显示参数值,这样当运行出现问题后就可以知道哪组参数导致程序出现了异常。

    转自:https://i-beta.cnblogs.com/posts/edit

  • 相关阅读:
    Luogu3118:[USACO15JAN]Moovie Mooving
    Luogu4137:Rmq Problem/mex
    Luogu3092:[USACO13NOV]No Change
    BZOJ4321: queue2
    BZOJ4650 : [NOI2016]优秀的拆分
    webpack
    sublime eslint setup
    Sublime themes/ lint themes setup
    sublime text 3
    React
  • 原文地址:https://www.cnblogs.com/banml/p/12574779.html
Copyright © 2011-2022 走看看