在 TestNG DataProvider 中迭代 CSV 文件
Iterating over a CSV file within a TestNG DataProvider
我对如何最好地实现一个简单的 DataProvider 感到有点困惑,因为我以前没有这样做过。
我有一个非常简单的逗号分隔 .csv 文件:
978KAL,625JBH,876SSH,452GSH
我只需要读入它并遍历记录,运行 对每条记录进行相同的测试直到完成。
到目前为止我的代码:
String csvFile = "src/test/resources/registrationsData.csv";
BufferedReader br = null;
String line = "";
String cvsSplitBy = ",";
@DataProvider(name="getRegistrations")
private Object[] getCSVTestData() {
Object [] registrationsObject;
try {
br = new BufferedReader(new FileReader(csvFile));
while ((line = br.readLine()) != null) {
// use comma as separator
String [] registrations = line.split(cvsSplitBy);
System.out.println( registrations[0] + "," + registrations[1]);
}
} catch//File not found & IOException handling here
registrationsObject = new Object[][]{registrations};
return registrationsObject;
}
@Test(dataProvider = "getRegistrations")
public void getRegistrations(String registration){
Object[] objRegArray = getCSVTestData();
for(int i=0; objRegArray.length>i; i++){
//run tests for every record in the array (csv file)
}
}
我知道我需要为数据提供程序方法使用 Object 数组 return 类型。
我不清楚如何(and/or 最好的方法)从 objRegArray object.
中检索每条记录
我想这是一个基本的 Collections 问题;谁能告诉我正确的方法?
根据我在下面的解释检查这段代码:
package click.webelement.testng;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Iterator;
import java.util.Scanner;
public class OneLineCSV {
final static String CSV_FILE = "/path_to_file/oneline.csv";
final static String DELIMETER = ",";
@DataProvider(name = "test")
public Iterator<Object[]> testDP(){
try {
Scanner scanner = new Scanner(new File(CSV_FILE)).useDelimiter(DELIMETER);
return new Iterator<Object[]>() {
@Override
public boolean hasNext() {
return scanner.hasNext();
}
@Override
public Object[] next() {
return new Object[]{scanner.next()};
}
};
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
}
@Test(dataProvider = "test")
public void testOneLineCSV(String value){
System.out.println(value);
}
}
所以我会使用 Scanner
class 因此它可以方便地将字符串解析为标记。
我还会在您的数据提供程序中使用 return Iterator<Object[]>
的功能,因为 Scanner
就是以这种方式设计的。您只需用新的 Iterator 包装它,它将 String
由 Scanner.next()
编辑的 return 转换为 new Object[]{scanner.next}
.
使用 Iterator
和 Scanner
确实更舒服,因为您可能不知道必须提供多少个值。所以你不应该关心定义数组大小。
我对如何最好地实现一个简单的 DataProvider 感到有点困惑,因为我以前没有这样做过。
我有一个非常简单的逗号分隔 .csv 文件:
978KAL,625JBH,876SSH,452GSH
我只需要读入它并遍历记录,运行 对每条记录进行相同的测试直到完成。
到目前为止我的代码:
String csvFile = "src/test/resources/registrationsData.csv";
BufferedReader br = null;
String line = "";
String cvsSplitBy = ",";
@DataProvider(name="getRegistrations")
private Object[] getCSVTestData() {
Object [] registrationsObject;
try {
br = new BufferedReader(new FileReader(csvFile));
while ((line = br.readLine()) != null) {
// use comma as separator
String [] registrations = line.split(cvsSplitBy);
System.out.println( registrations[0] + "," + registrations[1]);
}
} catch//File not found & IOException handling here
registrationsObject = new Object[][]{registrations};
return registrationsObject;
}
@Test(dataProvider = "getRegistrations")
public void getRegistrations(String registration){
Object[] objRegArray = getCSVTestData();
for(int i=0; objRegArray.length>i; i++){
//run tests for every record in the array (csv file)
}
}
我知道我需要为数据提供程序方法使用 Object 数组 return 类型。
我不清楚如何(and/or 最好的方法)从 objRegArray object.
中检索每条记录我想这是一个基本的 Collections 问题;谁能告诉我正确的方法?
根据我在下面的解释检查这段代码:
package click.webelement.testng;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Iterator;
import java.util.Scanner;
public class OneLineCSV {
final static String CSV_FILE = "/path_to_file/oneline.csv";
final static String DELIMETER = ",";
@DataProvider(name = "test")
public Iterator<Object[]> testDP(){
try {
Scanner scanner = new Scanner(new File(CSV_FILE)).useDelimiter(DELIMETER);
return new Iterator<Object[]>() {
@Override
public boolean hasNext() {
return scanner.hasNext();
}
@Override
public Object[] next() {
return new Object[]{scanner.next()};
}
};
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
}
@Test(dataProvider = "test")
public void testOneLineCSV(String value){
System.out.println(value);
}
}
所以我会使用 Scanner
class 因此它可以方便地将字符串解析为标记。
我还会在您的数据提供程序中使用 return Iterator<Object[]>
的功能,因为 Scanner
就是以这种方式设计的。您只需用新的 Iterator 包装它,它将 String
由 Scanner.next()
编辑的 return 转换为 new Object[]{scanner.next}
.
使用 Iterator
和 Scanner
确实更舒服,因为您可能不知道必须提供多少个值。所以你不应该关心定义数组大小。