参数化一般有两种,从testng.xml读取数据 or 通过 注解实现
1、从testng.xml读取数据
修改测试类如下:
package org.example;
//import static org.junit.Assert.assertTrue;
import org.testng.Assert;
import org.testng.annotations.*;
public class AppTest
{
// 表示我要引用这两个参数,这两个参数在testng.xml中设置,分别对应测试函数里面的参数
@Parameters({"name", "age"})
@Test
public void test01(String name, String age){
Assert.assertEquals(name, "tom");
Assert.assertEquals(Integer.parseInt(age), 18);
}
}
xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="All Test Suite">
<test verbose="2" preserve-order="true" name="D:/testngDemo">
<parameter name="name" value="tom"/>
<parameter name="age" value="18"/>
<classes>
<class name="org.example.AppTest"/>
</classes>
</test>
</suite>
在testng.xml中,既可以定义在中也可以定义在中,如果有同名的,会以的覆盖。
注意testng.xml参数化只有运行testng.xml才有效,运行测试类是不起作用的
运行测试类会出现如下报错
org.testng.TestNGException:
Parameter 'name' is required by @Test on method test01 but has not been marked @Optional or defined
2、@DataProvider
第一种参数化方式其实比较鸡肋,第二种方式才是TestNG参数化的灵魂,用到了@DataProvider,它会返回一个二维数组:
package org.example;
//import static org.junit.Assert.assertTrue;
import org.testng.Assert;
import org.testng.annotations.*;
public class AppTest {
// 定义一个数据提供器,叫test01,返回二维数组
@DataProvider(name = "test01")
public Object[][] data() {
return new Object[][] {
{"tom", 18},
{"jack", 20}
};
}
// 引用这个数据提供器
@Test(dataProvider = "test01")
public void test01(String name, int age){
System.out.println(name + ": " + age);
}
}
切记:
- @DataProvider用于生产数据,name是唯一标识。
- 在@Test中通过dataProvider属性指定name。
- 测试方法的入参跟数组中元素一一对应。
@DataProvider的返回值(参数类型)除了已经提到的Object[][],还可以是Iterator,它不会一次性生成所有数据,而是每调用一次生成一次,节约内存,比如:
package org.example;
//import static org.junit.Assert.assertTrue;
import org.testng.Assert;
import org.testng.annotations.*;
import java.util.Arrays;
import java.util.Iterator;
public class AppTest {
@DataProvider(name = "test01")
public Iterator<Object[]> data() {
Object[][] myObject = new Object[][] {
{"tom", 18},
{"jack", 20}
};
return Arrays.asList(myObject).iterator();
}
@Test(dataProvider = "test01")
public void test01(String name, int age){
System.out.println(name + ": " + age);
}
}
总的来说,DataProvider支持数组,迭代器