TestNG參數化測試-數據提供程序 @DataProvider方式


在 testng.xml 中指定參數可能會有如下的不足:
1.如果你壓根不用 testng.xml.
2.你需要傳遞復雜的參數,或者從Java中創建參數(復雜對象,對象從屬性文件或者數據庫中讀取的etc...)
這樣的話,你就可以使用Data Provider來給需要的測試提供參數。

所謂數據提供者,就是一個能返回對象數組的數組的方法,並且這個方法被@DataProvider注解標注:

Java代碼:

DataProvider的定義如下:
@DataProvider(name = "range-provider")
public Object[][] rangeData() {
int lower = 5;
int upper = 10;
return new Object[][] {
{ lower-1, lower, upper, false },
{ lower, lower, upper, true },
{ lower+1, lower, upper, true },
{ upper, lower, upper, true},
{ upper+1, lower, upper, false },
};
}
調用DataProvider的方式如下:
@Test(dataProvider = "range-provider")
public void testIsBetween(int n, int lower,int upper, boolean expected)
{
println("Received " + n + " " + lower + "-"+ upper + " expected: " + expected);
Assert.assertEquals(expected, isBetween(n, lower, upper));
}

1. 被@Test標注的方法通過dataProvider屬性指明其數據提供商。這個名字必須與@DataProvider(name="...") 中的名字相一致。

2. DataProvider返回的是一個Object的二維數組,二維數組中的每個一維數組都會傳遞給調用函數,作為參數使用。運行的時候,會發現, @Test標識的test method被執行的次數和object[][]包含的一維數組的個數是一致的,而@Test標識的函數的參數個數,也和object內一維數組內的元素數是一致的。

3. 運行后的輸出結果如下
Received 4 5-10 expected: false
Received 5 5-10 expected: true
Received 6 5-10 expected: true
Received 10 5-10 expected: true
Received 11 5-10 expected: false
 
===============================================
Parameter Suite
Total tests run: 5, Failures: 0, Skips: 0
===============================================
 
DataProviders擴展
默認的情況下,數據提供者會查找當前的測試類或者測試類的基類。如果你希望它能夠被其他的類所使用,可以專門創建數據提供者類, 並且通過測試方法的 dataProviderClass 屬性指定要使用的數據提供者類:
public static class  TestDataProvider {
   @DataProvider(name = "create")
  public static Object[][] createData() {
    return new Object[][] {
      { new Integer(42) },
    { new Integer(92) }
    }
  }
}
 
public class MyTest {
   @Test(dataProvider = "create", dataProviderClass = TestDataProvider.class)
  public void test(Integer n) {
    // ...
  }
}
 
Data Provider方法可以返回如下兩種類型中的一種:
1.含有多個對象的數組 (Object[][]),其中第一個下標指明了測試方法要調用的次數,第二個下標則完全與測試方法中的參數類型和個數相匹配。上面的例子已經說明。
2.另外一個是迭代器 Iterator<Object[]>。二者的區別是迭代器允許你延遲創建自己的測試數據。TestNG會調用迭代器,之后測試方法會一個接一個的調用由迭代器返回的值。在你需要傳遞很多參數組給測試組的時候,這樣你無須提前創建一堆值。
 
下面是使用JDK5 的例子 (注意 JDK 1.4 的例子不適用泛型):
public Iterator createData() {
  return new MyIterator(DATA);
)
@DataProvider(name = "test1")
public Iterator
 
如果你聲明的 @DataProvider 使用 java.lang.reflect.Method 作為第一個參數,TestNG 會把當前的測試方法當成參數傳給第一個參數。這一點在你的多個測試方法使用相同的@DataProvider的時候,並且你想要依據具體的測試方法返回不同的值時,特別有用。
例如,下面的代碼它內部的 @DataProvider 中的測試方法的名字:
@DataProvider(name = "dp")
public Object[][] createData(Method m) {
  System.out.println(m.getName());  
  return new Object[][] { new Object[] { "Cedric" }};
}
 
@Test(dataProvider = "dp")
public void test1(String s) {
}
@Test(dataProvider = "dp")
public void test2(String s) {
}
所以會顯示:
test1 
test2
 
Data provider可以通過屬性 parallel實現並行運行:
@DataProvider(parallel = true)
// ...
使用XML文件運行的data provider享有相同的線程池,默認的大小是10.你可以通過修改該在 <suite> 標簽中的值來更改:
<suite name="Suite1" data-provider-thread-count="20" >
... 
如果你需要讓指定的幾個data provider運行在不同的線程中,那么就必須通過不同的xml文件來運行。


免責聲明!

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



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