一、前言
在自动化测试项目中,参数化是必不可少的,以下将会介绍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); } }