Хэш-карта в тест-драйвере testNG для сокращения передачи аргументов в метод теста - PullRequest
0 голосов
/ 16 декабря 2018

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 16 декабря 2018

Я попытался передать тестовые данные в виде 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
===============================================
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...