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

Has anyone done a FitNesse TEST that queries to REAL Database? I can't make Fitnesse connect successfully

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

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

我要模拟的是从 FitNesse Fixture 调用 Java 查询到 PostgreSQL database/table。在这个简单的例子中,我试图在一个 table 中从一行中获取至少一列。当我执行代码时,它会自行完美运行。问题是当试图通过夹具从 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”,它会成功 returns 帐户名称“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 指南所说,必须有一个 "query" 方法,它对数据库中的接口进行实际调用。我不得不添加一个构造函数而不是 "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 的屏幕截图,因此您可以看到我有 JDBC 库用于 Java 8、JDK 1.8、JRE 1.8... 和 "org.postgresql.Driver.class" 包含在项目中。

这是我在 运行 来自 FitNesse 时收到的错误:

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

... 是的,我也尝试通过硬编码 JDBC:

的名称

我在 FitNesse 指南和 Google.

中搜索了很多关于真实生活示例的信息

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

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

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

无法找到驱动程序 class 这一事实表明,尽管 jar 存在于 IDE 的 class 路径中,但当 FitNesse 为 运行 您的夹具代码。

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

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

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