1. 程式人生 >實用技巧 >其它 >TestNG學習-引數的使用

TestNG學習-引數的使用


技術標籤:testng恰飯程式人生其他軟體測試白箱測試

測試方法也可以藉助使用一些引數。可以在每種測試方法上使用任意數量的引數,並指示TestNG使用@Parameters註解來傳遞正確的引數。

有兩種設定這些引數的方法:使用testng.xml 或 程式設計方式。

1. 使用testng.xml

如果引數是比較簡單的值,則可以在testng.xml中指定它們:

@Parameters({ "first-name" })@Testpublic void testSingleString(String firstName) {  System.out.println("Invoked testString " + firstName);  assert "Cedric".equals(firstName);}

在上面的程式碼中,我們指定Java方法的引數firstName應接收稱為first-name的XML引數的值。XML引數在testng.xml中定義:​​​​​​​

<suite name="My suite">  <parameter name="first-name"  value="Cedric"/>  <test name="Simple example"><--...-->

同樣也可以用在@Before/After 和@Factory註解中:​​​​​​​

@Parameters({ "datasource", "jdbcDriver" })@BeforeMethodpublic void beforeTest(String ds, String driver) {m_dataSource=...;//具體datasource的值  m_jdbcDriver = driver;}

上面程式碼中,兩個Java引數ds和driver將分別收到賦予屬性datasource和jdbc-driver的值。

還可以使用Optional註解將引數宣告為可選,相當於設定預設值:​​​​​​​

@Parameters("db")@TestpublicvoidtestNonExistentParameter(@Optional("Mysql")Stringdb){...}

如果在testng.xml檔案中找不到名為“ db”的引數,則測試方法將收到@Optional註解內指定的預設值:“ mysql”。

@Parameters註解可以放的位置:

  • 已經有@Before/After 和@Factory註解的方法上。

  • 最多用在測試類的一個建構函式上。在這種情況下,每當需要例項化測試類時,TestNG就會使用初始化為testng.xml中指定的值的引數來呼叫此特定的建構函式。此功能可用於將類中的欄位初始化為將由測試方法使用的值。

    • 注:

      • XML引數以與在批註中找到的順序相同的順序對映到Java引數,如果數字不匹配,則TestNG將發出錯誤。

      • 引數是作用域的。在testng.xml中,可以在<suite>標記下或在<test>下宣告它們。如果兩個引數具有相同的名稱,則選擇<test>中定義的優先順序。如果需要指定一個適用於所有測試的引數並且僅對某些測試覆蓋其值,這將非常方便。

2. 使用DataProviders的引數

如果需要傳遞複雜的引數或需要從Java建立的引數(複雜物件,從屬性檔案或資料庫讀取的物件等),則在testng.xml中指定引數可能不夠。在這種情況下,可以使用資料提供程式來提供需要測試的值。資料提供程式是類上的一種方法,它返回物件陣列的陣列。此方法使用@DataProvider註解:​​​​​​​

//This method will provide data to any test method that declares that its Data Provider//is named "test1"@DataProvider(name = "test1")public Object[][] createData1() { return new Object[][] {   { "Cedric", new Integer(36) },   { "Anne", new Integer(37)}, };} //This test method declares that its data should be supplied by the Data Provider//named "test1"@Test(dataProvider = "test1")public void verifyData1(String n1, Integer n2) { System.out.println(n1 + " " + n2);}

輸出結果:​​​​​​​

Cedric 36Anne37

@Test方法使用dataProvider屬性指定其資料提供程式。名稱必須與使用@DataProvider(name =“ ...”)註解且名稱匹配的同一類上的方法相對應。

預設情況下,將在當前測試類或其基類之一中查詢資料提供者。如果要將資料提供程式放在不同的類中,則它必須是靜態方法或具有no-arg建構函式的類,並在dataProviderClass屬性中指定可在其中找到的類:​​​​​​​

public class StaticProvider {  @DataProvider(name = "create")  public static Object[][] createData() {    return new Object[][] {      new Object[] { new Integer(42) }    };  }} public class MyTest {  @Test(dataProvider = "create", dataProviderClass = StaticProvider.class)  public void test(Integer n) {    // ...  }}

資料提供者也支援注入。TestNG將使用測試上下文進行注入。資料提供程式方法可以返回以下型別之一:

  • 物件陣列(Object[][])的陣列,其中第一維的大小是將呼叫測試方法的次數,第二維的大小包含必須與測試的引數型別相容的物件的陣列方法。如上圖程式碼。

  • Iterator <Object[]>。與Object[][]的唯一區別是,迭代器使您可以延遲建立測試資料。TestNG將依次呼叫迭代器,然後呼叫帶有該迭代器返回的引數的測試方法。如果您有很多要傳遞給該方法的引數集而又不想預先建立所有引數集,則此功能特別有用。

    • 物件陣列(Object[])。這類似於Iterator <Object[]>,會對源陣列的每個元素呼叫一次測試方法。

    • Iterator <Object >。Object[]的惰性替代方法。對迭代器的每個元素呼叫一次測試方法。

返回型別不僅限於Object,MyCustomData[][]或Iterator <Supplier>也是可以的。唯一的限制是,在使用迭代器的情況下,其引數型別本身無法明確地引數化。如下示例:​​​​​​​

@DataProvider(name = "test1")public Iterator<Object[]> createData() {  return new MyIterator(DATA);}

使用MyCustomData[]作為返回值:​​​​​​​

@DataProvider(name = "test1")public MyCustomData[] createData() {  return new MyCustomData[]{ new MyCustomData() };}

或其Iterator <MyCustomData>的惰性選項:​​​​​​​

@DataProvider(name = "test1")public Iterator<MyCustomData> createData() {  return Arrays.asList(new MyCustomData()).iterator();}

無法明確引數化Iterator的引數型別(Stream):​​​​​​​

@DataProvider(name = "test1")public Iterator<Stream> createData() {  return Arrays.asList(Stream.of("a", "b", "c")).iterator();}

如果宣告@DataProvider以java.lang.reflect.Method作為第一個引數,則TestNG將通過當前測試方法作為第一個引數。當幾種測試方法使用相同的@DataProvider並且希望它根據為其提供資料的測試方法返回不同的值時,此功能特別有用。

例如,以下程式碼在其@DataProvider中列印測試方法的名稱:​​​​​​​

@DataProvider(name = "dp")public Object[][] createData(Method m) {  System.out.println(m.getName());  // print test method name  return new Object[][] { new Object[] { "Cedric" }};} @Test(dataProvider = "dp")public void test1(String s) {} @Test(dataProvider = "dp")public void test2(String s) {}

結果:​​​​​​​

test1test2

@DataProvider也可以指定並行執行的方式:

@DataProvider(parallel=true)

從XML檔案執行的並行資料提供程式共享相同的執行緒池,預設情況下,執行緒池的大小為10。可以在XML檔案的<suite>標記中修改此值:

<suitename="Suite1"data-provider-thread-count="20">

如果要在其他執行緒池中執行一些特定的資料提供程式,則需要從其他XML檔案執行它們。

3.測試報告中的引數

可以將引數呼叫嵌入測試報告來使用,下面是一個簡單的示例:

TestNG學習-引數的使用

歡迎關注我的公眾號【測試備忘錄】 一起分享交流~