我之所以问是因为,我在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”。
这是我从FitNesse运行时收到的错误:
这是在使用Inspect工具调试FitNesse失败的那一行时得到的错误:
...是的,我还尝试通过硬编码JDBC的名称进行尝试:
我在这里搜索了很多真实的例子,包括FitNesse Guide和Google。
《 FitNesse指南》可能涉及面很广,但请放心,它充满了“这里的脏话”,不现实和不完整的示例,并且缺少很多信息。
所以,再问一次,有没有人使用FitNesse做过一次真实的生活测试,这可以帮助我找出我做错了什么吗?
答案 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