【问题标题】:Hashmap in testNG dataprivider to reduce arguments passing to test methodtestNG dataprivider 中的 Hashmap 以减少传递给测试方法的参数
【发布时间】:2018-12-16 03:17:23
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: selenium-webdriver collections hashmap testng testng-dataprovider


    【解决方案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
    ===============================================
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-14
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 1970-01-01
      • 2017-09-19
      相关资源
      最近更新 更多