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

时间:2017-11-02 11:37:17

标签: 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 = 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条记录。

请帮我解决这个问题。

示例输入文件

2 个答案:

答案 0 :(得分:0)

这里需要的是由Factory提供支持的DataProviderFactory将生成测试类实例(此处的测试类基本上是一个包含一个或多个@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中的下一个键集。