Parameters
测试方法不需要参数。你可以在每个测试方法里使用任意数量的参数,可以通过TestNG的@Parameters标注来传递正确的参数。
有两种方式来设置参数:使用testng.xml或者编程方式
Test methods don't have to be parameterless. You can use an arbitrary number of parameters on each of your test method, and you instruct TestNG to pass you the correct parameters with the @Parameters annotation.
There are two ways to set these parameters: with testng.xml or programmatically.(官方文档)
使用testng.xml
示例如下,ParametersTestng.java
public class ParametersTestng {
@Parameters({"first-name"})
@Test
public void test(String name){
System.out.println(name);
}
@Parameters({"first-name","second-name"})
@Test
public void test2(String name1,String name2){
System.out.println("full name:"+name1+" "+name2);
}
}
testng.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1">
<test name="Test">
<parameter name="first-name" value="Cedric" />
<parameter name="second-name" value="David"/>
<classes>
<class name="com.exp.testng.parmeters.ParametersTestng"/>
</classes>
</test>
</suite>
执行testng.xml,执行结果:

使用DataProvider
Data Provider 是一个能返回数组或数组对象的方法,这个方法使用@DataProvider注解。
Data Provider可以返回两种类型Object[][]和Iterator<Object[]>。
1、含有多个对象的数组(Object[][])
第一个下标表明了测试方法要调用的次数,第二个下标则完全与测试方法中的参数类型和个数相匹配
An array of array of objects (Object[][]) where the first dimension's size is the number of times the test method will be invoked and the second dimension size contains an array of objects that must be compatible with the parameter types of the test method(官方文档)
2、迭代器(Iterator<Object[]>)
迭代器与Object[][]唯一不同的地方就是迭代器允许你延迟创建自己的测试数据。TestNG会调用迭代器,之后测试方法会一个接一个的调用由迭代器返回的值。在你需要传递很多参数组给测试组的时候,这样你无须提前创建一堆值。
An Iterator<Object[]>. The only difference with Object[][] is that an Iterator lets you create your test data lazily. TestNG will invoke the iterator and then the test method with the parameters returned by this iterator one by one. This is particularly useful if you have a lot of parameter sets to pass to the method and you don't want to create all of them upfront.(官方文档)
代码中提供数据
返回含有多个对象的数组(Object[][])
实例如下
public class WithJavaCode {
@Test(dataProvider = "javaCode")
public void test(String n1,int n2){
System.out.println(n1 + " "+ n2);
}
@DataProvider(name = "javaCode")
public Object[][] createData(){
return new Object[][]{
{"Cedric", 36},
{"Anne",37}
};
}
}
另外,外部引用data provider时,需要将data provider声明为static,且外部引用的方法前需要标注:dataProviderClass
实例如下:
ParametersJavaCode.java
public class ParametersJavaCode {
//外部类引用时,createData必须是静态的
@DataProvider(name = "javaCode")
public static Object[][] createData(){
return new Object[][]{
{"Cedric", 36},
{"Anne",37}
};
}
}
WithJavaCodeDifferentClass.java
public class WithJavaCodeDifferentClass {
@Test(dataProvider = "javaCode",dataProviderClass = ParametersJavaCode.class)
public void test(String n1,int n2){
System.out.println(n1 + " "+ n2);
}
}
返回迭代器(Iterator<Object[]>)
实例如下:
IteratorTest.java
public class IteratorTest {
@Test(dataProvider = "iterator")
public void test(UserInfo userInfo){
System.out.println("userInfo:"+userInfo.getUsername()+" password:"+userInfo.getPassword());
}
@DataProvider(name = "iterator")
public Iterator<Object[]> iteratorDataProvider(){
List<Object> item = new ArrayList<Object>();
UserInfo user1 = new UserInfo();
user1.setUsername("user1");
user1.setPassword("password1");
item.add(user1);
UserInfo user2 = new UserInfo();
user2.setUsername("user2");
user2.setPassword("password2");
item.add(user2);
List<Object[]> users = new ArrayList<Object[]>();
for(Object u : item){
users.add(new Object[]{u});
}
return users.iterator();
}
}
UserInfo.java
public class UserInfo {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Excel中获取数据
首先需要引入以下几个jar包,这里我是使用的maven管理jar包,在pom文件中添加:
<properties>
<poi.version>3.13</poi.version>
</properties>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>com.github.cloudecho</groupId>
<artifactId>xmlbean</artifactId>
<version>1.5.5</version>
</dependency>
excel文件名:testdata.xlsx,文件内容如下:

获取excel表格中的数据并转为Object[][]的代码如下,保存为DataProviderExcel.java:
public class DataProviderExcel {
@SuppressWarnings("resource")
public static Object[][] getExcelData(String filePath, String fileName,
String sheetName) throws Exception {
Workbook workbook = null;
File file = new File(filePath + "/" + fileName);
FileInputStream fis = new FileInputStream(file);
String type = fileName.substring(fileName.indexOf("."));
// Excel2007 以后的格式为.xlsx的Excel文件,需要调用XSSFWorkbook
// Excel2007以前版本的格式为.xls的Excel文件,需要调用HSSFWorkbook
if (type.equals(".xlsx")) {
workbook = new XSSFWorkbook(fis);
} else if (type.equals(".xls")) {
workbook = new HSSFWorkbook(fis);
}
Sheet sheet = null;
if (workbook != null) {
sheet = workbook.getSheet(sheetName);
}
// 获得最后一行的行数
int lastRowCount = 0;
if (sheet != null) {
lastRowCount = sheet.getLastRowNum();
}
// 获得第一行的行数
int firstRowCount = 0;
if (sheet != null) {
firstRowCount = sheet.getFirstRowNum();
}
// Excel行数从第0行开始
int sumRowCount = lastRowCount - firstRowCount + 1;
List<Object[]> list = new ArrayList<Object[]>();
DataFormatter formatter = new DataFormatter();
// 获取每行的行对象,第一行为信息栏,不计入,所以从1开始
for (int i = 1; i < sumRowCount; i++) {
Row row = sheet.getRow(i);
// 获得一行中最后单元格的count
int lastCellCount = row.getLastCellNum();
// 定义一个数组来存放cell中值,根据cell的长度来定义数组的长度
String[] fileds = new String[lastCellCount];
for (int j = 0; j < lastCellCount; j++) {
String cellValue = formatter.formatCellValue(row.getCell(j));
// String cellValue = row.getCell(j).getStringCellValue();
fileds[j] = cellValue;
}
list.add(fileds);
}
fis.close();
// 定义一个object[][] 的二维数组,存放list中的值
Object[][] results = new Object[list.size()][];
// 设置二维数组每行的值,
for (int a = 0; a < list.size(); a++) {
results[a] = list.get(a);
}
return results;
}
}
接下来,使用@DataProvider返回Object[][],将excel数据返回给测试方法,代码如下,文件保存为:ProviderExcelTest.java:
public class ProviderExcelTest {
@DataProvider(name = "excelData")
public Object[][] excelData() throws Exception {
return DataProviderExcel.getExcelData("src/main/resources/testdata","testdata.xlsx","testSheet1");
//第一个参数:文件路径;第二个参数:文件名;第三个参数:excel数据所在的sheet名
}
@Test(dataProvider = "excelData")
public void test(String name,String sex,String pro,String age){
System.out.println("user info:"+ name + ","+sex+","+pro+","+age);
}
}
执行test方法,控制台输入结果如下:

网友评论