今天学到了一个新的工具:JdbcProxy,关于它的介绍可以看这里:http://www.ibm.com/developerworks/cn/java/j-lo-jdbcproxy/?S_TACT=105AGX52&S_CMP=tec-csdn
我感觉这个工具的最大用处就是[b]构造测试数据[/b]。目前可以想到的应用场景是这样的:设计好测试用例之后,测试人员先根据测试用例连接实际的数据库执行一遍,通过此过程用JdbcProxy生成JDBC调用过程。之后把生成的调用过程文件放到http服务器下(之前要用JdbcProxy中的StubTracerMerger类来合并成一个xml文件),修改数据库连接的配置,改成连接那个HTTP服务,这样测试人员可以在脱离数据库的情况下重复进行那个测试过程。JdbcProxy在这里起到了一个“录制-回放”的作用。
为什么要脱离数据库呢,这样一个明显的好处就是:你的测试数据在一个文件里,这样每个测试用例一个文件,大家各测各的,相互不影响。即使是只有一个测试人员,他在测试过程中,前面的测试也不致于影响后面测试时的数据。总之据我了解,测试人员在测程序时,构造数据都要构造一阵,耽误不少时间,有时候为了图省事,可能构造的数据不合要求,害处更大。
其实,按我上面描述的过程,似乎也不省事,但肯定有办法减少手工操作。以后确定了一个框架后我再补充在后面。
下面我想说一下实践过程,上面提供的网址里已经说的很详细了,但为方便实践,我还是自己再总结一下。
首先下载下来jar包(http://jdbcproxy.sourceforge.net/)JdbcProxy-1.1.jar。(在http://www.mvnrepository.com/上没有找到这个包的pom)
其次,录制DAO调用过程。
写类似下面的程序:
这里面修改url可以达到不同的功能:
1、生成方便人阅读的JDBC调用过程记录,则采用下面格式的url
2、生成方便软件“阅读”的JDBC调用过程记录,采用下面的格式:
3、访问部署到http服务器上的JDBC调用过程,采用如下格式:
上面的示例程序是直接生成方便软件阅读的JDBC调用过程记录。生成到程序执行目录下的output文件夹下了(多个request_XX_XX.txt和response_XX_XX.txt文件)。
之后要把生成的文件合并为一个xml,在JdbcProxy-1.1.jar中有办这件事儿的工具:
nl.griffelservices.proxy.stub.StubTracerMerger
文件名可以随意取,我想,以用例的编号命名可能好一些。
把合并完成的xml(比如output.xml)放到http服务器上,确定可以访问到。
比如我把那个文件放到了我的Tomcat的webapps\ROOT下(你可以放到Apache下或IIS下)。那么,我启动了tomcat后,应该可以通过http://localhost:8008/output.xml访问到这个文件。
现在就可以测试一下效果了,用你的程序直接访问这个http服务,把上面示例程序中的url改为“jdbc:stub:localhost:8008:1000:output.xml”(只需改这一处),然后运行程序,程序在不访问数据库的情况下成功执行。修改程序中的sql试一下——报错了!当然,因为这个并不能代替数据库,它只是把JDBC调用过程录下来了而已。
我感觉这个工具的最大用处就是[b]构造测试数据[/b]。目前可以想到的应用场景是这样的:设计好测试用例之后,测试人员先根据测试用例连接实际的数据库执行一遍,通过此过程用JdbcProxy生成JDBC调用过程。之后把生成的调用过程文件放到http服务器下(之前要用JdbcProxy中的StubTracerMerger类来合并成一个xml文件),修改数据库连接的配置,改成连接那个HTTP服务,这样测试人员可以在脱离数据库的情况下重复进行那个测试过程。JdbcProxy在这里起到了一个“录制-回放”的作用。
为什么要脱离数据库呢,这样一个明显的好处就是:你的测试数据在一个文件里,这样每个测试用例一个文件,大家各测各的,相互不影响。即使是只有一个测试人员,他在测试过程中,前面的测试也不致于影响后面测试时的数据。总之据我了解,测试人员在测程序时,构造数据都要构造一阵,耽误不少时间,有时候为了图省事,可能构造的数据不合要求,害处更大。
其实,按我上面描述的过程,似乎也不省事,但肯定有办法减少手工操作。以后确定了一个框架后我再补充在后面。
下面我想说一下实践过程,上面提供的网址里已经说的很详细了,但为方便实践,我还是自己再总结一下。
首先下载下来jar包(http://jdbcproxy.sourceforge.net/)JdbcProxy-1.1.jar。(在http://www.mvnrepository.com/上没有找到这个包的pom)
其次,录制DAO调用过程。
写类似下面的程序:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JdbcProxyDemo {
public static void main(String args[]) throws Exception {
String driver = "nl.griffelservices.proxy.jdbc.oracle.StubTracerDriver";
String url = "jdbc:stubtracer:output:com.mysql.jdbc.Driver:jdbc:mysql://localhost:3306/test?user=root&password=root";
Class.forName(driver);
Connection connection = DriverManager.getConnection(url);
Statement stmt = connection.createStatement();
stmt.executeUpdate("delete from PERSON");//delete
stmt.executeUpdate("insert into PERSON values ('1', 'wowo')");
stmt.executeUpdate("insert into PERSON values ('2', 'pipilu')"); //insert
stmt.executeUpdate("update PERSON SET name = 'Good Night'"); //update
ResultSet rs = stmt.executeQuery("SELECT * FROM PERSON");//select
while (rs.next()) {
System.out.println(rs.getString("NAME"));
}
rs.close();
stmt.close();
connection.close();
}
}
这里面修改url可以达到不同的功能:
1、生成方便人阅读的JDBC调用过程记录,则采用下面格式的url
jdbc:tracer:<filename>:<driver>:<url>
2、生成方便软件“阅读”的JDBC调用过程记录,采用下面的格式:
jdbc:stubtracer:<foldername>:<driver>:<url>
3、访问部署到http服务器上的JDBC调用过程,采用如下格式:
jdbc:stub:<hostname>:<port>:<timeout>:<filename>
上面的示例程序是直接生成方便软件阅读的JDBC调用过程记录。生成到程序执行目录下的output文件夹下了(多个request_XX_XX.txt和response_XX_XX.txt文件)。
之后要把生成的文件合并为一个xml,在JdbcProxy-1.1.jar中有办这件事儿的工具:
nl.griffelservices.proxy.stub.StubTracerMerger
文件名可以随意取,我想,以用例的编号命名可能好一些。
把合并完成的xml(比如output.xml)放到http服务器上,确定可以访问到。
比如我把那个文件放到了我的Tomcat的webapps\ROOT下(你可以放到Apache下或IIS下)。那么,我启动了tomcat后,应该可以通过http://localhost:8008/output.xml访问到这个文件。
现在就可以测试一下效果了,用你的程序直接访问这个http服务,把上面示例程序中的url改为“jdbc:stub:localhost:8008:1000:output.xml”(只需改这一处),然后运行程序,程序在不访问数据库的情况下成功执行。修改程序中的sql试一下——报错了!当然,因为这个并不能代替数据库,它只是把JDBC调用过程录下来了而已。