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

时间:2018-05-06 04:49:19

标签: selenium-webdriver testng testng-dataprovider

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

因为我的dataprovider将返回数据表中的所有数据并将其传递给任何特定的testCase,它将针对数据提供者的所有行运行将导致问题(例如,创建用户将需要5个参数,但编辑用户的数据将不够它)。

我们如何处理这个问题?

1 个答案:

答案 0 :(得分:0)

以下是您的工作方式:

  • .xls文件中,创建一个表示特定功能的表单。 (例如,logincomposeaddress-book等,如果我要以电子邮件应用程序为例)
  • 现在每个工作表都有各种测试用例的测试数据,用于测试该特定功能。
  • @Test方法中,您可以创建一个新的自定义注释(这将是一个标记注释),这将指示"表"数据提供者应从中检索数据的名称。如果您不热衷于创建新的自定义注释,那么您可以使用"描述" @Test注释的属性以捕获此信息。
  • TestNG可以在您的Method带注释的方法中原生地注入@DataProvider个对象。这里注入的Method对象将表示将要调用数据提供程序的@Test方法。现在,您可以从description注释的@Test属性中的新自定义注释(或)中检索工作表名称,以确定要查询数据的工作表名称。

那应该可以解决你的问题。

这是一个展示整体构思的样本。您需要丰富数据提供程序,以便它使用工作表名称来查询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();
  }
}