我正在尝试使用TestNG构建一个Selenium混合框架,从excel数据表中获取数据。我试图使用testNG的DataProvider,但问题是因为我的数据表包含属于不同测试用例的数据(例如,2行用于添加用户,1行用于修改用户,一些行用于搜索用户等)
因为我的数据提供商将返回数据表中的所有数据,并将其传递给任何特定的测试案例,这将为所有行的数据提供商运行将导致问题(例如,创建用户将需要5个参数,但编辑用户的数据将不足以)。
我们如何处理这个问题?
你是这样做的:
.xls
文件中,创建表示特定功能的工作表。(例如,登录
,撰写
,通讯簿
等,如果我以电子邮件应用程序为例)@Test
方法中,您可以创建一个新的自定义注释(这将是一个标记注释),它将指示数据提供程序应从中检索数据的“工作表”名称。如果您不想创建新的自定义注释,那么可以使用@Test
注释的“description”属性来捕获此信息。方法
对象注入到@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工作表中的行数。 结果是: