一、前言
在自動化測試項目中,參數化是必不可少的,以下將會介紹TestNG中的參數化測試運用。
TestNG可以通過兩種不同的方式將參數直接傳遞給測試方法:
- 使用testng.xml
- 使用數據提供者
二、使用testng.xml傳送參數
1、示例代碼如下:
package com.tech.design; import org.testng.annotations.Parameters; import org.testng.annotations.Test; public class Case { @Test @Parameters({"username","password"}) public void Login(String username, String password){ System.out.println("您的用戶名是:"+username); System.out.println("您的密碼是:"+password); } }
2、xml配置如下:
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" > <suite name="Suite1" verbose="1" > <test name="param"> <parameter name="username" value="李白"></parameter> <parameter name="password" value="123456"></parameter> <classes> <class name="com.tech.design.Case"></class> </classes> </test> </suite>
3、運行xml,結果如下:
三、使用@DataProvider
傳遞參數
如果需要傳遞複雜的參數或java創建的對象(複雜對象、從屬性文件或數據庫讀取數據等),通過testng.xml文件的方式可能不太適合。這種情況可以使用數據驅動的方式爲你的測試提供數據。數據庫驅動是在類中定義一個方法,返回一組數據對象。該方法使用@DataProvider註解。
此處需要注意,傳參的類型必須要一致,且帶有@DataProvider
註解的函數返回的必然是Object[][]
,此處需要注意。
通過DataProvider,返回值分別是Object[][]和Iterator<Object[]>
1、返回值是Object[][],代碼如下:
package com.tech.design; import org.testng.annotations.DataProvider; import org.testng.annotations.Parameters; import org.testng.annotations.Test; public class Case { @DataProvider(name = "data") public Object[][] provideData(){ return new Object[][] { {"李白",100},{"杜甫",110},{"魯班",210} }; }
//若調用者和提供在不同的類,則寫法如下
//@Test(dataProvider = "data",dataProviderClass = Case.class)
@Test(dataProvider = "data") public void Test(String par1, int par2){ System.out.println("姓名:"+par1+","+"年齡:"+par2); } }
2、返回值是Iterator<Object[]>,代碼如下:
輸出:
4
5
package com.tech.design; import org.testng.annotations.DataProvider; import org.testng.annotations.Parameters; import org.testng.annotations.Test; import java.util.HashSet; import java.util.Iterator; public class Case { @DataProvider(name="testdp") public static Iterator<Object[]> createData() { HashSet<Integer> set = new HashSet<Integer>(); set.add(Integer.valueOf(4)); set.add(Integer.valueOf(5)); HashSet<Object[]> so = new HashSet<Object[]>(); for(Integer intg:set){ so.add(new Object[]{intg}); } return so.iterator(); } @Test(dataProvider="testdp") public void login(Integer caseNum) { System.out.println(caseNum); } }
3、dataProvider方法可接受 的參數:Method method, ITestContext context
參數可以傳其中一個,也可以兩個一起傳入,這裏只演示Method參數,
用處:當多個測試方法使用同一個@DataProvider提供的測試數據,並希望不同的測試方法返回不同的值時,這是很有用的方式
示例:定義1個數據提供方法和2個測試方法。
package com.tech.design; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.lang.reflect.Method;public class Case { @DataProvider(name = "datapro") public Object[][] Data(Method method){ System.out.println("當前測試方法爲:"+method.getName()); Object[] S1 = new Object[]{"李白"}; Object[] S2 = new Object[]{"張楚"}; if(method.getName().equals("Test2")){ return new Object[][] {S1}; }else { return new Object[][] {S2}; } } @Test(dataProvider = "datapro") public void Test1(String s){ System.out.println(s); } @Test(dataProvider = "datapro") public void Test2(String s){ System.out.println(s); } }