有人进行过FitNesse TEST,可以查询REAL数据库吗?我无法使Fitnesse成功连接

时间:2019-01-25 20:54:12

标签: java postgresql fitnesse

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

是的,Fixture永远不需要处理,但是如果我什至不能在模拟“ API”的情况下建立与数据库的连接,我应该如何测试我的Fixture?

我要模拟的是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测试应该调用的灯具:

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指南所述,必须存在一个“查询”方法,该方法对数据库中的接口进行实际调用。我必须添加一个构造函数而不是“ setter”,因为FitNesse实际上需要它:“ 无法为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 Guide和Google。

《 FitNesse指南》可能涉及面很广,但请放心,它充满了“这里的脏话”,不现实和不完整的示例,并且缺少很多信息。

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

1 个答案:

答案 0 :(得分:1)

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

无法找到驱动程序类的事实表明,尽管jar在IDE的类路径中,但在FitNesse运行您的装置代码时不可用。

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

现在列出所需的每个jar很快就会变得很麻烦,因此您也可以使用通配符。我倾向于将所需的所有jar都复制到一个目录,该目录也包含我的固件.class文件,并添加一条!path行,以加载该目录中的所有jar。 因此,如果您还将数据库驱动程序也复制到您要查询的目录中,则可以确保可以通过以下方式使用它以及您自己的夹具:

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