【问题标题】:Store dataprovider parameters as array in test method in testng在 testng 的测试方法中将 dataprovider 参数存储为数组
【发布时间】:2017-06-26 02:51:53
【问题描述】:

我正在将 excel 数据写入数组并通过 @dataprovider 返回相同的数据。代码看起来像这样-

for(i=0;i<numrow+1;i++){
      for (j=0;j<numcol;j++ ){
          if(xlsh.getRow(i).getCell(j)!=null){
              xldata[i][j]=xlsh.getRow(i).getCell(j).toString();
          }
          else{
              xldata[i][j]="";
          }
      }
}

return xldata;

我正在阅读的 excel 有大约 40 列,我想在我的 @test 方法中将其写入数组。所以我尝试在我的@test 方法中使用下面的代码来读取@dataprovider 提供的数据

@Test(dataProvider = "name")
public void mymethod(String[] fromxl) {
 //code
}

但不知何故,数组不被识别为数组,我收到错误消息 - dataprovider 有 40 个参数,但测试方法只接受 1 个。 现在,如果我在我的测试方法(下面的示例代码)中将数组更改为 40 个不同的参数,它似乎正在工作。但我不想这样做,因为这很麻烦。为什么我不能让数组在我的测试方法中工作?感谢任何关于此的帮助/指针

@Test(dataProvider = "name")
public void mymethod(String data1, .. , String data40) {
 //code
}

【问题讨论】:

    标签: java selenium-webdriver testng


    【解决方案1】:

    要将数组作为参数传递给测试,您只需将其包装在DataProvider 使用的Object[][] 中。这样的事情应该做你想做的事:

    private String[] buildSingleDimensionArray() {
        String[] result = new String[40];
        for (int i = 0; i < result.length; i++) {
            result[i] = "element" + i;
        }
        return result;
    }
    
    @DataProvider(name = "arrayBuilder")
    public Object[][] createData() {
        return new Object[][] { { buildSingleDimensionArray() }, };
    
    }
    
    @Test(dataProvider = "arrayBuilder")
    public void theTest(String[] inputArray) {
        for (int i = 0; i < inputArray.length; i++) {
            System.out.println(inputArray[i]);
        }
    }
    

    【讨论】:

    • 但是如何从 excel 中读取所有行?例如,假设有 10 行和 40 列,我需要在单个 return 语句中从 dataprovider 返回所有这些,对吗?
    【解决方案2】:

    您的测试只需要一个参数 - 字符串数组。所以你的 xldata 应该以字符串数组的形式返回一个参数。

    for(i=0;i<numrow+1;i++){
    
          for (j=0;j<numcol;j++ ){
              if(xlsh.getRow(i).getCell(j)!=null){
              //Build fresh array here instead of writing directly to return
                   freshArr[j] = ...
              }
              else{
                  freshArr[0] = "" ;
              }
    //once all columns are read, set that to the return array
              xldata[i][0] = freshArr;
          }
    }
    

    【讨论】:

    • 这不起作用。我看不出这与我在代码中所做的有多么不同。我错过了什么? :|
    • 当你说这不起作用时。 .你是什么意思..异常?错误?精心制作
    • 我的意思是,这并不能解决帖子中提到的原始问题。我得到相同的例外,即 dataprovider 有 40 个参数,但测试方法只接受 1
    • 发布您的新代码 - 我已经给出了解决问题的提示。想看看你做了什么。我很确定这会奏效。不同之处在于创建多维数组的方式。我们只设置第 0 个元素..即只有一个参数要测试
    • 嗨,这确实有效,对此感到抱歉。我必须先在 for 循环中声明freshArr,以便为每行excel 创建一个新引用。所以它现在确实有效,可能不是最有效的方式,但稍后会发现。我将在答案中发布完整的代码。感谢您的帮助!
    【解决方案3】:

    这对我有用 -

    for(i=0;i<numrow;i++){
      String[] newArray=new String[numcol]; 
      for (j=0;j<numcol;j++ ){
          if(xlsh.getRow(i).getCell(j)!=null){
              XSSFCell cellval=xlsh.getRow(i).getCell(j);
              cellval.setCellType(Cell.CELL_TYPE_STRING);
              newArray[j] = cellval.toString();
          }
          else{
              newArray[j] = "";
          }
      }
      xldata[i][0] = newArray;  
    }
    return xldata;
    

    【讨论】:

      【解决方案4】:

      好吧,如果您仍在寻找答案,那么这里是解决方案: 首先不确定您的 excel 数据电子表格是什么样的,但您的 for 循环应该是这样的......

      for(i=0;i<numrow+1;i++){
            for (j=0;j<numcol;j++ ){
                if(xlsh.getRow(i).getCell(j)!=null){
                    xldata[I][j]=xlsh.getRow(i).getCell(j).getStringCellValue();
            }
            else{
                xldata[i][j]="";
            }
        }
      }
      
      return xldata;
      

      当你有 xldata[I][j] 时,你需要从这个方法返回一个二维对象......比如“return xldata”,你的方法应该有 String[][] 和返回类型. 例如:这样的事情

      public String[][] readExcelData(String filename, String sheetName, String tableName){
      ...
      ...
      ...
      for(i=0;i<numrow+1;i++){
            for (j=0;j<numcol;j++ ){
            if(xlsh.getRow(i).getCell(j)!=null){
                xldata[i][j]=xlsh.getRow(i).getCell(j).getStringCellValue();
            }
            else{
                xldata[i][j]="";
            }
        }
      }
      
      return xldata;
      
      }
      

      您的测试方法也应该期望相同的行和列数据..这样取决于您从电子表格中获得的数据,如果可能是 2 个或更多参数...

      Ex:
      @Test(dataProvider = "name")
      public void test1(String row, String col){
      ..
      }
      

      尝试这样的实现,希望它能奏效!

      【讨论】:

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