Кто-нибудь делал FitNesse TEST, который запрашивает REAL Database? Я не могу подключить Fitnesse - PullRequest
0 голосов
/ 25 января 2019

Я спрашиваю, потому что ВСЕ примеры, которые я нахожу в Google, одинаковы из учебника Fitnesse: очень простой запрос к списку или массиву в памяти, НЕ РЕАЛЬНАЯ БД.

Да, Fixtures никогдаприходится иметь дело с этим, но как я должен проверить свои приборы, если я даже не могу установить соединение с БД в симуляции «API»?

То, что я пытаюсь симулировать, этовызов из приспособления FitNesse для запроса в 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 ", как и ожидалось.

Теперь вот Fixture, который должен вызыватьсятест 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, должен существовать метод «query», который выполняет фактический вызов интерфейса в БД.Мне пришлось добавить конструктор вместо «setter», потому что FitNesse фактически требует этого: « Не удалось вызвать конструктор для 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" включен в проект.

org.postgresql.Driver.class

Это ошибка, которую я получаю при запуске из FitNesse:

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

Это ошибка, которую я получаю при отладке строки, в которой FitNesse не удалось выполнить с помощью инструмента проверки:

Defined as: String driverJDBC =

... и YES,Я также пытался жестко запрограммировать имя JDBC:

enter image description here

Я много искал РЕАЛЬНУЮ ЖИЗНЬ, как здесь, так и в Руководстве по FitNesse.и Google.

Руководство FitNesse может быть обширным, но давайте будем искренними, оно полно "грязного слова здесь", нереально и не соответствуетПримеры и упущение большого количества информации.

Итак, если спросить еще раз, проводил ли кто-нибудь тест НАСТОЯЩУЮ ЖИЗНЬ, выполняя запросы с использованием FitNesse, это могло бы помочь мне выяснить, что я делаю неправильно?

1 Ответ

0 голосов
/ 26 января 2019

Должен признать, что я провел только ограниченные тесты базы данных с FitNesse, но я использовал их (для запроса DB2).Я не использовал таблицы запросов (или писал собственные приборы для запросов), но вместо этого использовал jdbcslim в сочетании с таблицами сценариев и сценариями.

Тот факт, что класс драйвера не может быть найден, предполагаетчто, хотя jar присутствует в classpath в вашей IDE, он недоступен, когда FitNesse запускает код вашего прибора.

Я заметил, что вы указали classpath как один каталог в вики.В Java это означает, что все файлы классов должны находиться в этом каталоге (как файлы .class, в правом подкаталоге для их определенного пакета).Он не будет собирать банки (или почтовые индексы) в этом каталоге.Вы распаковали флягу вашего драйвера базы данных в этот каталог?Если нет, вам нужно добавить строку !path, указывающую на jar (таким образом, весь путь, включая имя файла) с драйвером базы данных.

Теперь перечисление каждой необходимой банки может быстро стать громоздким, поэтому вы также можете использовать подстановочные знаки.Я обычно копирую все нужные мне jar-файлы в один каталог, который также содержит файлы .class моего фиксатора, и добавляю одну строку !path, загружающую все jar-файлы в этом каталоге.Поэтому, если вы также скопировали драйвер базы данных в каталог, в котором вы задали вопрос, вы можете обеспечить его доступность и свой собственный прибор через

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