当前位置: 首页 > 知识库问答 >
问题:

当数据集具有不特定于此testcase的数据时,如何将dataprovider传递给testNG中的任何测试

齐鸿光
2023-03-14

我正在尝试使用TestNG构建一个Selenium混合框架,从excel数据表中获取数据。我试图使用testNG的DataProvider,但问题是因为我的数据表包含属于不同测试用例的数据(例如,2行用于添加用户,1行用于修改用户,一些行用于搜索用户等)

因为我的数据提供商将返回数据表中的所有数据,并将其传递给任何特定的测试案例,这将为所有行的数据提供商运行将导致问题(例如,创建用户将需要5个参数,但编辑用户的数据将不足以)。

我们如何处理这个问题?

共有1个答案

鱼渝
2023-03-14

你是这样做的:

  • .xls文件中,创建表示特定功能的工作表。(例如,登录撰写通讯簿等,如果我以电子邮件应用程序为例)
  • 现在每张表都有各种测试用例的测试数据,用于测试特定的功能。
  • @Test方法中,您可以创建一个新的自定义注释(这将是一个标记注释),它将指示数据提供程序应从中检索数据的“工作表”名称。如果您不想创建新的自定义注释,那么可以使用@Test注释的“description”属性来捕获此信息。
  • TestNG可以本机将方法对象注入到@DataProvider注释的方法中。在这里,注入的方法对象将表示将调用数据提供程序的@Test方法。因此,现在您可以从新的自定义注释(或)从@Test注释的description属性中检索图纸名称,以确定要查询数据的图纸名称

这应该能解决你的问题。

下面是一个示例,演示了总体思路。您需要丰富数据提供程序,以便它使用工作表名称从excel电子表格查询数据。为了演示起见,我的示例排除了所有这些。

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.METHOD;

@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({METHOD})
public @interface SheetName {
    String value() default "";
}
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import java.lang.reflect.Method;

public class TestClass {

  @Test(dataProvider = "dp")
  @SheetName("one")
  public void test1(String name) {
    System.err.println("Name is " + name);
  }

  @Test(dataProvider = "dp")
  @SheetName("two")
  public void test2(int age) {
    System.err.println("Age is " + age);
  }

  @DataProvider(name = "dp")
  public Object[][] getData(Method method) {
    String sheetName = getSheetName(method);
    if (sheetName == null) {
      // Handle the case, wherein our custom annotation is missing. That means the test perhaps
      // expects
      // either all of the data, or it could be a error case.
      return new Object[][] {{}};
    }
    if ("one".equalsIgnoreCase(sheetName)) {
      return new Object[][] {{"Cedric"}, {"Beust"}};
    }
    if ("two".equalsIgnoreCase(sheetName)) {
      return new Object[][] {{1}, {2}};
    }
    // Handle the case, wherein we had a valid sheet name, but it represents a sheet that cant be
    // found in our
    // excel spreadsheet.
    return new Object[][] {{}};
  }

  private String getSheetName(Method method) {
    SheetName sheetName = method.getAnnotation(SheetName.class);
    if (sheetName == null || sheetName.value().trim().isEmpty()) {
      return null;
    }
    return sheetName.value();
  }
}
 类似资料:
  • 是否可以为每个测试方法指定来自DataProvider的数据。我做过这样的东西。 有没有更好的方法?我可以为两种测试方法指定一个数据集吗?谢谢

  • 我试图通过动态输入要从中提取数据的工作表的名称,以这种方式重用现有的数据提供程序,将Excel文件中的数据加载到我的测试框架中。 示例:我正在从Login凭据表加载数据,该表代表成功登录测试的数据。第二个测试是失败的登录测试,它从InvalidLogin凭据表加载数据。第三个测试从第三个表UserInformation等中提取数据。我所遵循的udemy课程并没有真正涵盖这个主题,我觉得整个事情的实

  • 我使用部署到pivotal cloud foundry的spring云数据流,将spring批处理作业作为spring云任务运行,这些作业需要aws凭据才能访问s3存储桶。 我尝试将aws凭据作为任务属性传递,但凭据作为参数或属性显示在任务的日志文件中。(https://docs.spring.io/spring-cloud-dataflow/docs/current/reference/html

  • 问题内容: 我有任何看法: 是 我的状态定义为: 但是当我单击链接时,它转到 我想要的是去 可以将ui-router与AngularJS一起使用吗? 问题答案: ui-router Github中 已经记录了问题,您可以在 这里 找到它 **** 为了解决这个问题,您需要在配置文件中添加此代码,以处理url的编码和解码。 您可以使用以下代码注册自己的替换“字符串”类型,从而覆盖内置的字符串类型(执

  • 我需要向TestNG数据提供程序传递10多个参数,代码如下所示。。。 有谁能告诉我,如果我们需要使用DataProvider传递10个以上的参数,我们应该采取什么方法?是否有其他方法来声明测试方法的参数?

  • Edit1:我有一个Excelutility.java类,可以从中获取单元格数据,并将其传递给我的测试类中的tests方法。 为了从excel文件中读取,我按照以下方式组织了测试方法: 我想做的是: > 从sheet1读取第一行数据,将其传递到test1,继续到test2 从工作表1读取第二行数据,将其传递到test1,继续到test2 并依此类推,具体取决于excel工作表中的行数。 结果是: