java - 有没有人做过查询 REAL 数据库的 FitNesse 测试?我无法使 Fitnesse 连接成功

标签 java postgresql fitnesse

我问是因为我在 Google 中找到的所有示例都与 Fitnesse 教程中的相同:对内存中的列表或数组的非常简单的查询,而不是真正的数据库。

是的,Fixtures 永远不必处理这个问题,但是如果我什至无法在“API”的模拟中连接到 DB,我应该如何测试我的 fixtures?

我试图模拟的是从 FitNesse Fixture 调用以 Java 查询 PostgreSQL 数据库/表。在这个简单的示例中,我试图从一个表中的一行中获取至少一列。当我执行代码时,它会自行完美运行。问题是当试图通过夹具从 Fitnesse 执行时。调用 JDBC 驱动程序时,它总是因 ClassNotFoundException 而失败。单独运行代码不会发生这种情况。

这是执行查询的代码:

package queriespackage;

import java.sql.*;

public class testQuery01 {

    public static Connection openDBConnection(){
        Connection connectionString = null;
        try {
            String dbhost = "SOMEURL";//Redacted
            String port = "SOMEPORT";//Redacted
            String dbname = "THEDBNAME";//Redacted
            String username = "SOMEUSER";//Redacted
            String password = "SOMEPASSWORD";//Redacted
            String driverJDBC = "org.postgresql.Driver";

            Class.forName(driverJDBC);
            connectionString = DriverManager.getConnection("jdbc:postgresql://" + dbhost + ":" + port + "/" + dbname,username,password);
            connectionString.setAutoCommit(false);
        } catch (SQLException e) {
            e.printStackTrace(System.err);
            System.exit(0);
        }  catch (Exception e) {
            System.err.println( e.getClass().getName()+": "+ e.getMessage() );
            System.exit(0);
        };
        return connectionString;
    };

    public static ResultSet executeQuery(Connection connectionString, int intAccountId) throws SQLException{

        Statement querySession = connectionString.createStatement();
        //The query string
        String queryString = "SELECT DISTINCT "
                + "account_search.account_id,"
                + "account_search.account_name"
                + " FROM account_search "
                + " WHERE"
                + " account_search.account_id = "+ intAccountId
                + "LIMIT 1";

        ResultSet queryResult = querySession.executeQuery(queryString);
        return queryResult; 
    };

    public static String processQueryResult(ResultSet queryResult) throws SQLException{
        String strQueryValueReturned = null;
        while (queryResult.next()) {
            strQueryValueReturned = queryResult.getString("account_name");
        };
        return strQueryValueReturned;       
    };

    public static boolean closeDBConnection(Connection connectionString){
        try {
            if(connectionString!=null){
                connectionString.close();
            }
        } catch (SQLException e) {
            System.err.println( e.getClass().getName()+": "+ e.getMessage() );
            System.exit(0);
        };
        return true;
    };

    public static String testQuery(int intAccountId) throws SQLException, ClassNotFoundException{
        boolean bolConnectionStatus = false;
        String strValueReturned = null;

        Connection connectionString = openDBConnection();

        if(connectionString != null){
            ResultSet qryQueryResult = executeQuery(connectionString, intAccountId);
            strValueReturned = processQueryResult(qryQueryResult);
            bolConnectionStatus = closeDBConnection(connectionString);
            if(!bolConnectionStatus){
                System.exit(0);
            }
        }else{
            System.exit(0);
        };
        return strValueReturned;
    };

};

如果我向该代码添加 Main 方法,将“intAccountId”的参数值传递给它,它会成功返回帐户“account_name”的名称,只是正如预期的那样。

现在这是 FitNesse 测试应该调用的 Fixture:

package fixturespackage;

import java.sql.SQLException;
import queriespackage.testQuery01;

public class testFixture01{

    private int Int_AccountId;

    //Fixture Constructor (setter)
    public testFixture01(int Int_AccountId){
        this.Int_AccountId = Int_AccountId;
    };  


    public String query() throws SQLException, ClassNotFoundException{
        return testQuery01.testQuery(Int_AccountId);
    };
};

正如 FitNesse 指南所说,必须有一个“查询”方法,它对数据库中的接口(interface)进行实际调用。我不得不添加一个构造函数而不是“setter”,因为 FitNesse 实际上需要它:“Could not invoke constructor for fixturepackage.testFixture01

这是 FitNesse 页面:

!***> System Variables
!define TEST_SYSTEM {slim}
!path C:\FitnessTest\bin
*!

|Query: fixturespackage.testFixture01|21 |
|Str_AccountName                         |
|SomeName                                |

这是我的 BuildPath 的屏幕截图,因此您可以看到我有适用于 Java 8、JDK 1.8、JRE 1.8 的 JDBC 库......并且项目中包含“org.postgresql.Driver.class”。

org.postgresql.Driver.class" is included.

这是我从 FitNesse 运行时收到的错误:

Line 26 is where the Exception is catched if JDBC is not loaded.

这是我在使用 Inspect 工具调试 FitNesse 失败的行时得到的错误:

Defined as: String driverJDBC = "org.postgresql.Driver";.

... 是的,我还尝试通过硬编码 JDBC 的名称:

enter image description here

我在 FitNesse 指南和 Google 上搜索了很多真实生活中的例子。

FitNesse 指南可能内容广泛,但老实说,它充满了“脏话”、不切实际和不完整的示例,并且遗漏了很多信息。

所以,再问一次,有没有人使用 FitNesse 进行过真实生活测试,提出问题,这可以帮助我找出我做错了什么?

最佳答案

我不得不承认我只用 FitNesse 做过有限的数据库测试,但我已经使用它们(查询 DB2)。 我没有使用查询表(或编写自己的固定装置来查询),而是使用了 jdbcslim结合脚本表和场景。

无法找到驱动程序类这一事实表明,虽然 jar 存在于您的 IDE 的类路径中,但当 FitNesse 运行您的夹具代码时它不可用。

我注意到您将类路径指定为 wiki 中的单个目录。在 Java 中,这意味着所有类文件都应该在该目录中(作为 .class 文件,在它们定义的包的正确子目录中)。它不会在该目录中获取任何 jar(或 zip)。您是否将数据库驱动程序的 jar 解压到该目录?如果没有,您需要使用数据库驱动程序添加指向 jar 的 !path 行(因此包含文件名的整个路径)。

现在列出您需要的每个 jar 很快就会变得很麻烦,因此您也可以使用通配符。我倾向于将我需要的所有 jars 复制到一个目录,该目录还包含我的 fixture .class 文件,并添加一个 !path 行加载该目录中的所有 jars。 因此,如果您还将数据库驱动程序复制到您提出问题的目录中,您可以确保它和您自己的固定装置可通过

!path C:\FitnessTest\bin
!path C:\FitnessTest\bin\*.jar

关于java - 有没有人做过查询 REAL 数据库的 FitNesse 测试?我无法使 Fitnesse 连接成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54372624/

相关文章:

testing - Fitnesse- 测试应该与数据库对话吗?

java - Miglayout、基线和 JTextAreas

java - 如何删除,不清除工作表中的行?

postgresql - 有没有办法在给定条件的情况下声明 postgresql 行不可变?

postgresql - Postgres : index on cosine similarity of float arrays for one-to-many search

带有 BrowserTest Slim 夹具插件的 Fitnesse 中的 Xpath 不适用于 ul li

java - Fitnesse如何调用selenium服务器?我们可以明确指定它还是 Fitnesse 随机调用?

java - Android 客户端应用程序无法正确显示服务器答案/

java - Hippo CMS 部署到 tomcat(浏览器中显示空白页面,页面源在 curl 中可用)

Postgresql 创建日志模式