testNG dataprivider 中的哈希映射以减少传递给测试方法的参数

Hashmap in testNG dataprivider to reduce arguments passing to test method

我一直在使用 TestNG 的 DataProvider 功能编写测试脚本。到目前为止,我对自己的做法很满意,因为我传递的参数数量少于 10 个,但我正在测试的一些新页面有超过 30-35 个参数,将这些参数添加到测试方法使得真的很难看

这是一种动态传递参数的好方法,但是使用它们很困难,因为您必须非常小心地处理索引,如果必须为很多方法执行此操作,则很容易出错。

我尝试将测试数据作为 ArrayList> 传递,其中 HashMap 是列名称-值对,但 TestNG 不会接受它,因为 HashMap 无法转换为 Object[]。我想到使用 HashMap 的原因是因为您可以查询一个键并获取它的值,并且该键是我已知的。我本可以编写一个通用方法来获取值并将其分配给表示页面上字段名称的变量。

数据源 (XLS) 仅存储在页面上输入的测试数据,因此它纯粹是数据驱动的,而不是基于关键字的。我正在测试的所有页面都是数据输入页面。

在测试数据上获得某种身份并让 TestNG 接受它的最佳方式是什么。

作为替代方案,我创建了一个地图,同时从 Excel 获取数据并传递给数据提供者,同时我创建了一个哈希图并将其存储在全局以在我的测试方法中访问,但这种方式不会删除传递给我的测试方法的参数

非常感谢在这方面的任何帮助。 谢谢 科坦

I tried passing the test data as a ArrayList>, where the HashMap is the Column Name-Value pair but TestNG wont accept this as HashMap cant be cast as Object[].

TestNG 可以很好地使用数据驱动方法,该方法使用 Map 作为由数据提供者提供的参数。下面的示例应阐明这一点。

在这个例子中,我有一个 excel spreadsheet,其中有一个 sheet,其名称为“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
===============================================