我需要在Web应用程序中多次插入数据。我正在使用selenium和testNG以及数据驱动框架。
我正在使用CSV文件来读取输入值。
请在下面找到示例代码。
public class TestData
{
private static String firstName;
public static String lastName;
@BeforeClass
public void beforeClass() throws IOException
{
reader = new CSVReader(new FileReader(fileName));
while((record = reader.readNext()) != null)
{
firstName = record[0];
lastName = record[1];
}
}
@Test
public void test1()
{
driver.findElement(By.id(id)).sendKeys(firstName);
driver.findElement(By.id(id)).click();
and so on....
}
@Test
public void test2()
{
driver.findElement(By.id(id)).sendKeys(lastName);
driver.findElement(By.id(id)).click();
and so on....
}
}
在这里,我需要插入3条记录,但是当我使用上面的代码时,只会插入第3条记录。
请帮我解决这个问题。
示例输入文件
答案 0 :(得分:0)
这里需要的是由Factory
提供支持的DataProvider
。 Factory
将生成测试类实例(此处的测试类基本上是一个包含一个或多个@Test
方法的常规类)。数据提供程序基本上会为工厂方法提供实例化测试类所需的数据。
现在,您的@Test
方法基本上可以与实例中的数据成员一起运行其逻辑。
这是一个简单的示例,显示了这一点。
import org.assertj.core.api.Assertions;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
import org.testng.annotations.Test;
public class TestClassSample {
private String firstName;
private String lastName;
@Factory(dataProvider = "dp")
public TestClassSample(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
@DataProvider(name = "dp")
public static Object[][] getData() {
//feel free to replace this with the logic that reads up a csv file (using CSVReader)
// and then translates it to a 2D array.
return new Object[][]{
{"Mohan", "Kumar"},
{"Kane", "Williams"},
{"Mark", "Henry"}
};
}
@Test
public void test1() {
Assertions.assertThat(this.firstName).isNotEmpty();
}
@Test
public void test2() {
Assertions.assertThat(this.lastName).isNotEmpty();
}
}
答案 1 :(得分:0)
根据您提供的数据,while循环结束于CSV文件的第三条记录。在每次迭代中你的变量" firstName"和" lastName"被覆盖。
当循环中断时,变量存储最后写入的值。因此,使用更好的数据结构来存储所有值。我建议地图。
您可以在一个方法中进一步联接所有测试用例,在 @Test 注释中使用 invocationcount 属性,从 map <重复执行每个条目/ strong>即可。使用 @BeforeTest 添加一个方法,以增加到map中的下一个键集。