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:\Users\Administrator\AppData\Local\Temp\testng-eclipse-1631420346\testng-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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM