首页> java的>如何循环此测试与不同的CSV行?

前端之家收集整理的这篇文章主要介绍了首页> java的>如何循环此测试与不同的CSV行? 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我是硒测试的初学者.我写了这段代码,它可以工作,但是我需要用另一条csv行循环此测试.

我花了将近10个小时试图做到这一点.

我正在尝试做的情况:

> Web浏览器正在打开转到URL
>从第一行以CSV文件中的数据登录
>驱动程序正在重新启动,并且执行相同操作,但来自csv文件第二行的数据.

我还尝试过使用aftermethod / afterclass重新启动测试,但无法正常工作.

public class CSVdataread {
    private WebDriver driver;
    String baseUrl = "URL";
    String CSV_file = "C:\\Users\\xxxxxxxxxxx\\Desktop\\TestData.csv";

    @BeforeClass
    public void openBrowser() {
        System.setProperty("webdriver.chrome.driver","C:\\Users\\xxxxxxxxxxxx\\Desktop\\webdriver\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.navigate().to("URL");
        driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
    }

    @Test
    public void verify_Search() throws InterruptedException,IOException {
        CSVReader reader = new CSVReader(new FileReader(CSV_file));
        String[] cell;

        while((cell = reader.readNext()) != null) 
            for (int i = 0; i < 1; i++) {
                String name = cell[i];
                String email = cell[i + 1];
                String baseUrl = "http://xxxxx.xxx/xxxx/";
                driver.findElement(By.xpath("//input[@id='useridFormField-inputEl']")).sendKeys(name);
                driver.findElement(By.xpath("//input[@id='userpasswordFormField-inputEl']")).sendKeys(email);
                {
                    driver.quit();
                }
            }
        }
    } 
最佳答案
JUnit 4解决方案.这将是巨大的…

首先,让我们从CSVReader和一些良好实践以及代码的可读性开始.在测试中,您将读取CSV数据并在测试中使用它们.读取数据不是测试的责任.测试应该已经提供了所有数据.它称为DataProvider.这个术语实际上在TestNG测试框架中使用,就像@ user861594建议的一样.

因此,您应该有一些东西可以为测试提供数据.但这已经是步骤2.由于您知道将从CSV文件逐行读取数据,因此您应该创建一个适当的类以从CSV读取数据.

这是一个例子:

public class CSVReader {
    private static final String DEFAULT_SEPARATOR = ",";
    private BufferedReader reader;
    private List<String> lines;

    public CSVReader(File file) throws FileNotFoundException {
        this.reader = new BufferedReader(new FileReader(file));

        lines = this.reader.lines().collect(Collectors.toList());
    }

    public String[] getRow(int rowNumber) {
        return lines.get(rowNumber).split(DEFAULT_SEPARATOR);
    }

    public int getRowCount() {
        return lines.size();
    }
}

CSVReader构造函数接受File作为参数,并创建适当的对象以特定方式读取数据(例如:读取为String).然后,将CSV文件中的数据保存在内存中供以后使用,就像读取普通TXT文件一样,即可读取CSV文件中的数据.

然后,我们创建2个方法.首先是getRowCount,它为我们提供了行/数据集的总数.

第二个是getRow,它从列表中收集特定的行,并将其保存到String []数组以供以后使用.

String []数组的显示类似于1个Excel行:

data index 0 | data index 1 | data index 2 | data index 3

我们有一个可以让我们轻松读取文件的类.让我们创建DataProvider

为了向测试提供数据,我们需要使用@Parameters批注并返回Collection< Object []>.进行测试.我稍后再说.

因此,让我们在DataProvider中实现它

public class CSVDataProvider {

    public Collection<Object[]> getData() throws FileNotFoundException {
        CSVReader reader = new CSVReader(new File("C:\\Users\\xxxxxxxxxxx\\Desktop\\TestData.csv"));
        int rowCount = reader.getRowCount();
        Object[][] data = new Object[rowCount][2];

        for (int i = 0; i < rowCount; i++) {
            Object[] singleRow = reader.getRow(i);
            data[i][0] = singleRow[0];
            data[i][1] = singleRow[1];
        }

        return Arrays.asList(data);
    }
}

我假设您在CSV文件中只有登录名和密码.这就是为什么我创建了一个二维数组new Object [rowCount] [2].我们通过提供必须存储的元素数量来创建数组,并从rowCount变量知道我们有多少行.
2表示每行只有2个数据.登录名和密码.例如,如果要使用其他元素-用户角色,则可以修改为[3]

在for循环中,我们将数据从CSV文件转换为数组,并将其返回以供以后使用.

现在,让我们谈谈我们的测试课.

@RunWith(Parameterized.class)
public class OurTest {
    private String login,password;

    public OurTest(String login,String password) {
        this.login = login;
        this.password = password;
    }

    @Parameterized.Parameters(name = "{index}: Login: ({0}) Password: ({1})")
    public static Collection<Object[]> data() throws FileNotFoundException {
        return new CSVDataProvider().getData();
    }

    @Test
    public void test() {
        System.out.println(String.format("login : %s | Password: %s",login,password));
    }
}

为了将参数从DataProvider传递到我们的测试,我们需要
 1.用@RunWith(Parameterized.class)注释类
 2.创建一个返回Collection< Object []>的方法.带有注解@参数`
 3.创建一个反映我们接受哪种数据的构造函数.

关于第3点,这就是为什么我用String登录名和String密码创建了一个2自变量构造函数的原因.我们正在传递这两个参数. JUnit将创建OurTest的新实例,并为每个测试传递不同的行.

在测试方法中,我只是打印了从DataProvider获得的数据

我没有提出一个完整的解决方案,因为我希望您尝试调整测试以了解这种特定方法.也称为数据驱动测试.

我们只有一种测试方法,但是CSV文件中的每一行都将作为单独的测试运行.

希望能帮助到你!

猜你在找的Java相关文章