如何逐个读取csv数据并在多个testNG测试中通过它

如何逐个读取csv数据并在多个testNG测试中通过它,csv,selenium,selenium-webdriver,testng,Csv,Selenium,Selenium Webdriver,Testng,我需要在web应用程序中多次插入数据。我将selenium与testNG以及数据驱动框架一起使用 我使用CSV文件读取输入值 请在下面找到示例代码 public class TestData { private static String firstName; public static String lastName; @BeforeClass public void beforeClass() throws IOException { reader =

我需要在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条记录

请帮我解决这个问题

样本输入文件


这里您需要的是一个由
数据提供者提供动力的
工厂。
工厂将生成测试类实例(这里的测试类基本上是一个常规类,其中包含一个或多个
@test
方法)。数据提供者基本上会向工厂方法提供实例化测试类所需的数据

现在,您的
@Test
方法基本上可以与实例中的数据成员一起运行其逻辑

下面是一个简单的示例,说明了这一点

import org.assertj.core.api.Assertions;
导入org.testng.annotations.DataProvider;
导入org.testng.annotations.Factory;
导入org.testng.annotations.Test;
公共类TestClassSample{
私有字符串名;
私有字符串lastName;
@工厂(dataProvider=“dp”)
公共TestClassSample(字符串名、字符串名){
this.firstName=firstName;
this.lastName=lastName;
}
@数据提供者(name=“dp”)
公共静态对象[][]getData(){
//可以用读取csv文件的逻辑(使用CSVReader)来替换此选项
//然后将其转换为二维数组。
返回新对象[][]{
{“Mohan”,“Kumar”},
{“凯恩”,“威廉姆斯”},
{“马克”,“亨利”}
};
}
@试验
公共void test1(){
Assertions.assertThat(this.firstName).isNotEmpty();
}
@试验
公共无效测试2(){
Assertions.assertThat(this.lastName).isNotEmpty();
}
}

这里您需要的是一个
工厂
,由
数据提供者
供电。
工厂将生成测试类实例(这里的测试类基本上是一个常规类,其中包含一个或多个
@test
方法)。数据提供者基本上会向工厂方法提供实例化测试类所需的数据

现在,您的
@Test
方法基本上可以与实例中的数据成员一起运行其逻辑

下面是一个简单的示例,说明了这一点

import org.assertj.core.api.Assertions;
导入org.testng.annotations.DataProvider;
导入org.testng.annotations.Factory;
导入org.testng.annotations.Test;
公共类TestClassSample{
私有字符串名;
私有字符串lastName;
@工厂(dataProvider=“dp”)
公共TestClassSample(字符串名、字符串名){
this.firstName=firstName;
this.lastName=lastName;
}
@数据提供者(name=“dp”)
公共静态对象[][]getData(){
//可以用读取csv文件的逻辑(使用CSVReader)来替换此选项
//然后将其转换为二维数组。
返回新对象[][]{
{“Mohan”,“Kumar”},
{“凯恩”,“威廉姆斯”},
{“马克”,“亨利”}
};
}
@试验
公共void test1(){
Assertions.assertThat(this.firstName).isNotEmpty();
}
@试验
公共无效测试2(){
Assertions.assertThat(this.lastName).isNotEmpty();
}
}

根据您提供的数据,while循环在CSV文件的第三条记录处结束。在每次迭代中,变量“firstName”和“lastName”都会被覆盖

循环中断时,变量存储最后写入的值。因此,使用更好的数据结构来存储所有值。我推荐地图


您可以在一个方法中进一步合并所有测试用例,使用@test注释中的invocationcount属性对map中的每个条目重复执行。使用@BeforeTest再添加一个方法,以增加映射中的下一个键集

根据您提供的数据,while循环在CSV文件的第三条记录处结束。在每次迭代中,变量“firstName”和“lastName”都会被覆盖

循环中断时,变量存储最后写入的值。因此,使用更好的数据结构来存储所有值。我推荐地图


您可以在一个方法中进一步合并所有测试用例,使用@test注释中的invocationcount属性对map中的每个条目重复执行。使用@BeforeTest再添加一个方法,以增加映射中的下一个键集

beforeClass
在返回之前读取文件中的所有行(而循环执行此操作)。因此,始终只有最后一行数据。您可以将CSV数据保存在一个数组中,并在每个测试中通过索引访问它。
beforeClass
在返回之前读取文件中的所有行(而loop则执行此操作)。因此,始终只有最后一行数据。您可以将CSV数据保存在一个数组中,并在每个测试中通过索引访问它。