【问题标题】:Reduce number of arguments when calling from DataProviders in testng using java使用 java 从 testng 中的 DataProviders 调用时减少参数数量
【发布时间】:2021-01-11 07:38:44
【问题描述】:

我正在从 Excel 文件中读取数据,假设我在 Java testNG 中有 5 行 15 列。

查看以下代码

    Class ReadExcel {
    public String[][] getCellData(String path, String sheetName) throws InvalidFormatException, IOException {
              FileInputStream stream = new FileInputStream(path);
              XSSFWorkbook workbook = new XSSFWorkbook(stream);
              Sheet s = workbook.getSheet(sheetName);
              int rowcount = s.getLastRowNum();
              int cellcount = s.getRow(0).getLastCellNum();
              String data[][] = new String[rowcount][cellcount];
              FormulaEvaluator evaluator= workbook.getCreationHelper().createFormulaEvaluator();
              DataFormatter df = new DataFormatter();
              for (int i = 1; i <= rowcount; i++) {
                  Row r = s.getRow(i);
                  for (int j = 0; j < cellcount; j++) { 
                    Cell c = r.getCell(j);
                    try {
                        if(c!=null){
                            if (c.getCellType() == c.CELL_TYPE_STRING) {
                                  data[i - 1][j] = c.getStringCellValue();
                            }else if (c.getCellType() == c.CELL_TYPE_FORMULA) {
                                    data[i - 1][j] = df.formatCellValue(c, evaluator);
                            } 
                            else if (c.getCellType() == c.CELL_TYPE_BOOLEAN) {
                                data[i - 1][j] = df.formatCellValue(c, evaluator);
                            } 
                            else{
                                  data[i - 1][j] = String.valueOf(c.getNumericCellValue());
                            }
                        }
                    
                    } catch (Exception e) {
                         e.printStackTrace();
                    }
                  }
              }
              return data;
        }
}

另一个处理数据的类

    public class Sample
{
        ReadExcel read = new ReadExcel();

    @DataProvider (parallel= true)
    public String[][] getFilterValues() throws InvalidFormatException, IOException, InterruptedException{
        
        return read.getCellData("fileLoc","fileName");
    }
    
    @Test(dataProvider = "getFilterValues")
    public void verifyReports(String row, String name, String age, String lastname and so on...) throws Exception
    {
        System.out.println(FileName);
        
    }

所以,这里我需要减少 verifyReports 方法中的参数数量,并且应该能够在同一方法中检索整个记录。

注意:将来可能会更改参数计数。

所以我尝试了地图概念,但我找不到。

主要目标是减少数量。 verifyReports 方法中的参数。如何做到这一点。

我通过使用下面的代码实现了。但它会在 2D 数组中以便在 testNG DataProviders 中使用它

以下是代码,我尝试使用地图列表。

public ArrayList<String> readHeader(String path, String sheetName) throws IOException
{
    FileInputStream stream = new FileInputStream(path);
      XSSFWorkbook workbook = new XSSFWorkbook(stream);
      Sheet s = workbook.getSheet(sheetName);
      int rowcount = s.getLastRowNum();
      int cellcount = s.getRow(0).getLastCellNum();
      ArrayList<String> al = new ArrayList<String>();
      Row r = s.getRow(0);
      for(int i=0;i<cellcount;i++)
      {
          Cell c = r.getCell(i);
          al.add(c.getStringCellValue());
      }
      return al;
}


public ArrayList<HashMap<String,String>> getCellData(String path, String sheetName) throws InvalidFormatException, IOException {
    //ExcelConfig ec = new ExcelConfig();
    FileInputStream stream = new FileInputStream(path);
    ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>(); 
      XSSFWorkbook workbook = new XSSFWorkbook(stream);
      Sheet s = workbook.getSheet(sheetName);
      int rowcount = s.getLastRowNum();
      int cellcount = s.getRow(0).getLastCellNum();
      FormulaEvaluator evaluator= workbook.getCreationHelper().createFormulaEvaluator();
      DataFormatter df = new DataFormatter();
      ArrayList<String> head = ec.readHeader(path, sheetName);
      for (int i = 1; i <= rowcount; i++) {
          HashMap<String,String> map = new HashMap<String,String>();
          Row r = s.getRow(i);
          for (int j = 0; j < cellcount; j++) { 
            Cell c = r.getCell(j);
            try {
                if(c!=null){
                    if (c.getCellType() == c.CELL_TYPE_STRING) {
                        map.put(head.get(j), c.getStringCellValue());
                    }else if (c.getCellType() == c.CELL_TYPE_FORMULA) {
                        map.put(head.get(j), df.formatCellValue(c, evaluator));
                    } 
                    else if (c.getCellType() == c.CELL_TYPE_BOOLEAN) {
                        map.put(head.get(j), df.formatCellValue(c, evaluator));
                    } 
                    else{
                        map.put(head.get(j), String.valueOf(c.getNumericCellValue()));
                    }
                }
            
            } catch (Exception e) {
                 e.printStackTrace();
            }
          }
          list.add(map);
         }
      return list;
}


public void multiRec() throws InvalidFormatException, IOException
{
    ArrayList<HashMap<String, String>> map = read.getCellData(fileLoc,"ComparisonStatus");
    for(HashMap<String, String> ls : map)
    {
        System.out.println(ls.get("Row"));
        System.out.println(ls.get("FileName"));
    }       
}

这里,Row 和 FileName 是 Excel 文件头。所以现在我减少了编号。的论点。但是如何将其转换为二维数组将是现在的任务。

【问题讨论】:

  • 您可以传递一个带有所有必需参数的 JSON 对象。
  • 您提到您尝试了 Map,那么失败的原因是什么?

标签: java selenium-webdriver testng testng-dataprovider testng-eclipse


【解决方案1】:

最好的方法是创建一个class,其中包含所有参数作为类的字段。让类名是CellData

class CellData {
    private String row;
    private String name;
    // and all other relevant fields..
}

getCellData方法中,使用每一行的相关值创建并初始化CellData的对象,而不是返回String[][]返回CellData[]。然后进行以下更改:

@DataProvider (parallel= true)
public Object[][] getFilterValues() throws InvalidFormatException, IOException, InterruptedException{        
    CellData[] cellData = read.getCellData("fileLoc","fileName");
    Object[][] data = new Object[cellData.length][];
    for(int i = 0; i < cellData.length; i++) {
        data[i][0] = cellData[i];
    }
    return data;
}

@Test(dataProvider = "getFilterValues")
public void verifyReports(CellData data) throws Exception
{
    // test code.
}

既然您说将来可能会引入新参数,那么使用类将非常有益,因为它可以帮助代码可维护和可读。任何未来的更新也需要更少的代码更改,因为不需要更新DataProvider 方法或测试方法。唯一的变化是 CellData 类中的一个新字段,并在 getCellData 方法中设置新字段的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 2019-07-28
    • 2011-11-04
    • 1970-01-01
    • 2013-07-30
    • 2022-08-15
    • 2013-07-06
    相关资源
    最近更新 更多