一、數據驅動測試的應用場景
在實際的測試工作中,我們經常會遇到如此場景:同樣的測試操作步驟,由於多組不同的輸入數據,需要執行多次測試操作。在自動化測試用例中,針對這種情況,我們可以使用TestNG中的DataProvider注解來輕松實現這種操作。
二、TestNG中DataProvider的基礎使用方法
可以用一個有着@DataProvider注解的方法作為提供測試數據的容器。同時在對應的測試執行方法的@Test注解中,注明測試數據的來源,可以見代碼示例:
1 public class TestDataDriven { 2 3 4 @DataProvider(name="testData") //在DataProvider注解中為dataprovider命名 5 public Object[][] dataProvider(){ 6 return new Object[][]{{1,2},{2,3},{3,4}}; 7 } 8 9 @Test(dataProvider="testData")//在Test注解中指定dataProvider獲取數據的來源 10 public void testDataDriven(int a, int b){ 11 System.out.println("this is : "+(a+b)); 12 } 13 14 } 15 16 public class TestDataDriven { 17 18 19 @DataProvider 20 public Object[][] dataProvider(){ 21 return new Object[][]{{1,2},{2,3},{3,4}}; 22 } 23 24 @Test(dataProvider="dataProvider") 25 public void testDataDriven(int a, int b){ 26 System.out.println("this is : "+(a+b)); 27 } 28 29 }
把測試執行方法與數據提供方法進行對應的方式有兩種:
1、在數據提供方法的@DataProvider注解中指定name,如 @DataProvider(name="testData"),然后在對應的測試執行方法的@Test注解中填寫dataProvider的來源時,指定@DataProvider注解中的name,如 @Test(dataProvider="testData")
2、不在數據提供方法的@DataProvider注解中指定name,在對應的測試執行方法的@Test注解中填寫dataProvider的來源時,直接填寫數據提供的方法名稱。
三、將數據提供方法在一個單獨的類中進行存放
在實際的工作中,我們發現將數據提供方法和測試執行方法放在同一個類中,對代碼的可讀性、維護性都會帶來負面的影響。因此可以專門建立一個類來作為存放數據提供方法的容器。同時在對應的測試執行方法的@Test注解中填寫dataProvider的來源時,加上對數據提供類名的描述。代碼如下:
1 import org.testng.annotations.DataProvider;
2
3 public class TestDataProvider { 4 5 @DataProvider 6 public static Object[][] DataMethodNoName(){ 7 return new Object[][]{ 8 {"data with no name 1"}, 9 {"data with no name 2"}, 10 {"data with no name 3"} 11 }; 12 } 13 14 15 @DataProvider(name = "datamethodwithname") 16 public static Object[][] DataMethodWithName(){ 17 return new Object[][]{ 18 {"data with name 1"}, 19 {"data with name 2"}, 20 {"data with name 3"} 21 }; 22 } 23 24 }
同時在對應的測試執行方法的@Test注解中填寫dataProvider的來源時,加上對數據提供類名的描述,
dataProviderClass=com.testnglearn.TestDataProvider.class。代碼如下:
1 @Test(dataProvider="datamethodwithname",dataProviderClass=com.testnglearn.TestDataProvider.class) 2 3 public void testDataDriven_1(String a){ 4 System.out.println("this is : "+a); 5 }