【问题标题】:Iterating through JDBC ResultSet for DataProvider?遍历 DataProvider 的 JDBC ResultSet?
【发布时间】:2018-05-03 18:09:50
【问题描述】:

我正在尝试使用数据库数据进行一些数据驱动的测试,然后使用 TestNG @DataProvider。我在 MySQL 中创建了下表,其中包含以下列和值。我正在尝试使用浏览器,然后在每行中输入用户名和密码来登录网站,总共进行了 3 次测试。

    scenario, username, password
chrome johnsmith password1
firefox janesmith password2
edge username3 password3

我有以下代码循环遍历 ResultSet:

    @DataProvider
public Object[][] getData() throws SQLException {

    String host = "localhost";
    String port = "3306";
    Connection con = DriverManager.getConnection(
            "jdbc:mysql://" + host + ":" + port + "/qadbdemo2" + "?useSSL=false", "root", "password");
    Statement s = con.createStatement();
    ResultSet rs = s.executeQuery("select * from credentials;");
    int colCount = rs.getMetaData().getColumnCount();
    rs.last();
    int rowCount = rs.getRow();
    rs.beforeFirst();
    rs.next();
    Object data[][] = new Object[rowCount][colCount];

    for (int rNum = 1; rNum <= rowCount; rNum++) {
        for (int cNum = 0; cNum < colCount; cNum++) {
            System.out.print(rs.getObject(rNum) + " ");
            data[rNum - 1][cNum] = rs.getObject(rNum);
        }
        System.out.println();
    }
    return data;

}

但是,它似乎在尝试循环时遇到了问题。测试运行,但它只使用第一行的每一列作为每个浏览器运行的变量。我是否必须在此处的某处使用 rs.next() 来遍历行?我的逻辑还有什么问题?输出/结果如下:

    [RemoteTestNG] detected TestNG version 6.14.2
chrome chrome chrome 
johnsmith johnsmith johnsmith 
password1 password1 password1 
Starting ChromeDriver 2.36.540470 (e522d04694c7ebea4ba8821272dbef4f9b818c91) on port 26256
Only local connections are allowed.
May 03, 2018 1:17:45 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
PASSED: doLogin("chrome", "chrome", "chrome")
FAILED: doLogin("johnsmith", "johnsmith", "johnsmith")
FAILED: doLogin("password1", "password1", "password1")

【问题讨论】:

  • 你自己回答了。您需要 rs.next() 作为外部 for 循环中的最后一个表达式。
  • 请阅读ResultSet的文档。当然,您必须为每一行调用next()。真的:你不应该使用诸如先调用last(),然后调用getRows()beforeFirst() 之类的东西,它会根据数据库、行数等而存在各种令人讨厌的问题。构造你的代码,这样你就不会'不需要提前知道行数。
  • 谢谢。我理解不想做 last() 和 beforeFirst(),尤其是对于大型数据集。但是我怎么能在不硬编码的情况下获得行数呢?
  • 你应该改变你的代码,这样你就不需要提前知道数字(例如使用列表而不是数组),顺便说一句,如果你阅读很多,这仍然是一个糟糕的计划行数。

标签: java jdbc testng resultset dataprovider


【解决方案1】:

我可以通过以下代码实现这一点:

    Object[][] data = new Object[rowCount][colCount];
    int row = 0;
    while (rs.next()) {
        for (int i = 0; i < colCount; i++) {
            data[row][i] = rs.getObject(i+1);
        }
        row++;
    }
    return data;

【讨论】:

  • 请接受您的回答,以便结束问题。
  • 我只能在 2 天后接受答案——将尽可能更新。
猜你喜欢
  • 2022-12-29
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多