JUnit 4 решение. Этот будет огромным ...
Во-первых, давайте начнем с CSVReader
и некоторых хороших практик плюс читаемость кода. В своем тесте вы читаете данные CSV и используете их в своих тестах. Тест не несет ответственности за чтение данных. В тесте уже должны быть представлены все данные. Это называется DataProvider
. Этот термин на самом деле используется в TestNG
инфраструктуре тестирования, как и @ user861594 предложил.
Итак, у вас должно быть что-то, что предоставит данные для ваших тестов. Но это уже Шаг № 2. Поскольку вы знаете, что вы будете читать данные построчно из файла CSV, вы должны создать соответствующий класс для чтения данных из CSV.
Вот пример:
public class CSVReader {
private static final String DEFAULT_SEPARATOR = ",";
private BufferedReader reader;
private List<String> lines;
public CSVReader(File file) throws FileNotFoundException {
this.reader = new BufferedReader(new FileReader(file));
lines = this.reader.lines().collect(Collectors.toList());
}
public String[] getRow(int rowNumber) {
return lines.get(rowNumber).split(DEFAULT_SEPARATOR);
}
public int getRowCount() {
return lines.size();
}
}
Конструктор CSVReader
принимает File
в качестве аргумента и создает надлежащие объекты для чтения данных определенным образом (например: read as String
). Затем данные в CSV-файле считываются, как и в обычном TXT-файле, путем сохранения строк в памяти для последующего использования.
Затем мы создаем 2 метода. Сначала getRowCount
, который дает нам общее количество строк / наборов данных.
Второй - это getRow
, который собирает конкретную строку из списка и сохраняет ее в массиве String[]
для дальнейшего использования.
String[]
массив имеет представление в виде 1 строки Excel:
data index 0 | data index 1 | data index 2 | data index 3
У нас есть класс, который позволяет нам легко прочитать файл. Давайте создадим DataProvider
Чтобы предоставить данные для тестов, нам нужно использовать аннотацию @Parameters
и вернуть Collection<Object[]>
в наш тест. Я поговорю об этом позже.
Итак, давайте реализуем это в нашем DataProvider
public class CSVDataProvider {
public Collection<Object[]> getData() throws FileNotFoundException {
CSVReader reader = new CSVReader(new File("C:\\Users\\xxxxxxxxxxx\\Desktop\\TestData.csv"));
int rowCount = reader.getRowCount();
Object[][] data = new Object[rowCount][2];
for (int i = 0; i < rowCount; i++) {
Object[] singleRow = reader.getRow(i);
data[i][0] = singleRow[0];
data[i][1] = singleRow[1];
}
return Arrays.asList(data);
}
}
Я предполагаю, что у вас есть только логины и пароли в файле CSV. Вот почему я создал 2-мерный массив new Object[rowCount][2]
. Мы создаем массив, предоставляя, сколько элементов он должен хранить, и мы знаем, сколько у нас строк из переменной rowCount
.
2 означает, что у нас есть только 2 данных в строке. Логин и пароль. Если вы хотите использовать дополнительный элемент, например - роль пользователя, вы можете изменить его на [3]
В цикле for
мы преобразуем данные из файла CSV в массив и возвращаем их для дальнейшего использования.
Теперь поговорим о нашем тестовом классе.
@RunWith(Parameterized.class)
public class OurTest {
private String login, password;
public OurTest(String login, String password) {
this.login = login;
this.password = password;
}
@Parameterized.Parameters(name = "{index}: Login: ({0}) Password: ({1})")
public static Collection<Object[]> data() throws FileNotFoundException {
return new CSVDataProvider().getData();
}
@Test
public void test() {
System.out.println(String.format("login : %s | Password: %s", login, password));
}
}
Чтобы передать параметры из DataProvider
в наш тест, нам нужно
1. Аннотируйте класс с помощью @RunWith(Parameterized.class)
2. Создайте метод, возвращающий Collection<Object[]> with annotation
@ Parameters`
3. Создайте конструктор, отражающий, какие данные мы принимаем.
Что касается пункта 3, поэтому я создал конструктор с двумя аргументами с String login
и String password
. Мы передаем эти 2 параметра. JUnit создаст новый экземпляр OurTest
и передаст разные строки для каждого теста.
В методе test
я только что напечатал данные, которые мы получили из DataProvider
Я не представляю полностью работающее решение, потому что я хочу, чтобы вы попытались настроить свой тест, чтобы изучить этот конкретный подход. Это также называется Data-driven Testing
.
У нас есть только 1 метод теста, но каждая строка в файле CSV будет выполняться как отдельный тест.
Надеюсь, это поможет!