有没有人做过查询 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
我问是因为我在 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