我正在尝试使用TestNG构建Selenium混合框架,其中我从我的Excel数据表中获取数据。我正在尝试使用testNG的DataProvider,但问题是因为我的数据表包含属于不同测试用例的数据(例如,添加用户为2行,修改用户为1行,搜索用户为1行)
因为我的dataprovider将返回数据表中的所有数据并将其传递给任何特定的testCase,它将针对数据提供者的所有行运行将导致问题(例如,创建用户将需要5个参数,但编辑用户的数据将不够它)。
我们如何处理这个问题?
答案 0 :(得分:0)
以下是您的工作方式:
.xls
文件中,创建一个表示特定功能的表单。 (例如,login
,compose
,address-book
等,如果我要以电子邮件应用程序为例)@Test
方法中,您可以创建一个新的自定义注释(这将是一个标记注释),这将指示"表"数据提供者应从中检索数据的名称。如果您不热衷于创建新的自定义注释,那么您可以使用"描述" @Test
注释的属性以捕获此信息。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();
}
}