Hashmap в dataprivider testNG для уменьшения количества аргументов, передаваемых в тестовый метод

Я писал тестовые сценарии, используя функцию TestNG DataProvider. До сих пор я был доволен тем, как я это делал, так как количество параметров, которые я передавал, было меньше 10, но некоторые из новых страниц, которые я тестирую, имеют более 30-35 параметров, добавление этих параметров в метод тестирования делает это выглядит очень некрасиво

Это хороший способ динамической передачи параметров, но затем их использование затруднено, так как вы должны быть очень осторожны с индексами и склонны к ошибкам, если это необходимо сделать для многих методов.

Я попытался передать тестовые данные как ArrayList>, где HashMap — это пара «имя-значение столбца», но TestNG не примет это, поскольку HashMap не может быть приведен как Object[]. Причина, по которой я подумал об использовании HashMap, заключается в том, что вы можете запросить ключ и получить его значение, а ключ мне известен. Я мог бы написать общий метод для получения значения и присвоения его переменной, представляющей имена полей на странице.

Источник данных (XLS) хранит только тестовые данные, введенные на странице, поэтому он основан исключительно на данных, а не на ключевых словах. Все страницы, которые я тестирую, являются страницами ввода данных.

Каков наилучший способ иметь какую-то идентичность в тестовых данных, а также заставить TestNG принять их.

В качестве альтернативы я создал карту, беря данные из Excel и передавая их поставщику данных, в то же время я создал хэш-карту и сохранил ее глобально для доступа в моем тестовом методе, но этот способ не удалит передаваемые аргументы в мой тестовый метод.

Любая помощь в этом отношении очень ценится. Спасибо, Кетан.


person kethan    schedule 16.12.2018    source источник


Ответы (1)


Я попытался передать тестовые данные как ArrayList>, где HashMap — это пара «имя-значение столбца», но TestNG не примет это, поскольку HashMap не может быть приведен как Object[].

TestNG может очень хорошо работать с методом, управляемым данными, который использует Map в качестве параметра, который передается поставщиком данных. Пример ниже должен прояснить это.

В этом примере у меня есть электронная таблица Excel, в которой есть лист с именем «53799150», данные которого выглядят так, как показано ниже.

+------------+------------+-------------+-----------------+
| TestcaseId | RollNumber | StudentName | StudentLocation |
+------------+------------+-------------+-----------------+
|          1 | S1001      | Po          | Bengaluru       |
|          2 | S1002      | Oogway      | Chennai         |
|          3 | S1003      | Shifu       | Delhi           |
|          4 | S1004      | TaiLung     | Kolkata         |
+------------+------------+-------------+-----------------+

Пример ниже работает с показанными выше данными в виде карты:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class MapPoweredDataProviderSample {

  private static final String FILE = "src/test/resources/53799150.xlsx";
  private static final DataFormatter dataFormatter = new DataFormatter();
  private static final String SHEET_NAME = "53799150";

  @Test(dataProvider = "dp")
  public void testMethod(Map<String, String> data) {
    System.err.println(data);
  }

  @DataProvider(name = "dp")
  public Object[][] getData() throws IOException, InvalidFormatException {
    Workbook workbook = WorkbookFactory.create(new File(FILE));
    Sheet sheet = workbook.getSheet(SHEET_NAME);
    Iterable<Row> rows = sheet::rowIterator;
    List<Map<String, String>> results = new ArrayList<>();
    boolean header = true;
    List<String> keys = null;
    for (Row row : rows) {
      List<String> values = getValuesInEachRow(row);
      if (header) {
        header = false;
        keys = values;
        continue;
      }
      results.add(transform(keys, values));
    }
    return asTwoDimensionalArray(results);
  }

  private static Object[][] asTwoDimensionalArray(List<Map<String, String>> interimResults) {
    Object[][] results = new Object[interimResults.size()][1];
    int index = 0;
    for (Map<String, String> interimResult : interimResults) {
      results[index++] = new Object[] {interimResult};
    }
    return results;
  }

  private static Map<String, String> transform(List<String> names, List<String> values) {
    Map<String, String> results = new HashMap<>();
    for (int i = 0; i < names.size(); i++) {
      String key = names.get(i);
      String value = values.get(i);
      results.put(key, value);
    }
    return results;
  }

  private static List<String> getValuesInEachRow(Row row) {
    List<String> data = new ArrayList<>();
    Iterable<Cell> columns = row::cellIterator;
    for (Cell column : columns) {
      data.add(dataFormatter.formatCellValue(column));
    }
    return data;
  }
}

Вот результат:

{TestcaseId=1, RollNumber=S1001, StudentName=Po, StudentLocation=Bengaluru}
{TestcaseId=2, RollNumber=S1002, StudentName=Oogway, StudentLocation=Chennai}
{TestcaseId=3, RollNumber=S1003, StudentName=Shifu, StudentLocation=Delhi}
{TestcaseId=4, RollNumber=S1004, StudentName=TaiLung, StudentLocation=Kolkata}

===============================================
Default Suite
Total tests run: 4, Passes: 4, Failures: 0, Skips: 0
===============================================
person Krishnan Mahadevan    schedule 16.12.2018