在 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 包装它,它将 StringScanner.next() 编辑的 return 转换为 new Object[]{scanner.next}.

使用 IteratorScanner 确实更舒服,因为您可能不知道必须提供多少个值。所以你不应该关心定义数组大小。