一、為什么要使用DataProvider
- DataProvider可以實現類似Factory的數據驅動的測試,而且使用DataProvider的時候,被測試方法所在的類只被創建一次,只是方法被調用多次,所以比較省時省力
- DataProvider還可以實現懶加載,在需要測試大量數據的時候可以一條一條的加載數據,而不需要一次性把數據加載到內存中,避免了內存的浪費,和可能的內存不夠用的危險
二、DataProvider的常規用法
- 定義一個函數,函數名隨意取,使用@DataProvider注解,注解中用name給這個provider起名字,該函數返回一個二維數組
- 該函數返回的二維數組每一行就代表一次測試的參數,每一行的元素跟Test中需要的參數一一對應(通常情況下數組類型是Object,但是可以用其他自定義類型代替)
- 在需要使用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插件或報告中的方法名后面會顯示參數值,這樣當運行出現問題后就可以知道哪組參數導致程序出現了異常。