Итерация по CSV-файлу в TestNG DataProvider - PullRequest
0 голосов
/ 14 июля 2020

Я немного запутался в том, как лучше всего реализовать простой 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)
    }
 }

Я знаю, что мне нужно используйте возвращаемый тип массива объектов для метода поставщика данных.

Мне неясно, как (и / или как лучше всего) получить каждую запись из объекта objRegArray.

Это a basi c Я думаю, вопрос о коллекциях; кто-нибудь может указать мне правильный путь?

1 Ответ

1 голос
/ 14 июля 2020

Проверьте этот код с моим объяснением ниже:

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, поэтому у него есть удобная возможность для синтаксического анализа строки на токены.

Я бы также используйте возможность возвращать Iterator<Object[]> в вашем провайдере данных, поскольку Scanner спроектирован таким образом. Вы просто обертываете его новым Iterator, который преобразует String, возвращаемый Scanner.next(), в new Object[]{scanner.next}.

Использование Iterator с Scanner действительно более удобно, поскольку вы можете не знать, сколько значений вам придется предоставить. Поэтому вам не нужно заботиться об определении размера массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...