在DBUnit中使用脚本来生成测试数据
用过rails 的人都会觉得rails的测试中,fixtures 实在是一个非常方便的工具。在Java中,我们通常会使用dbunit 来维护我们的测试数据,但是,dbunit有一个不方便的地方,就是测试数据要手写。虽然我们也可以从数据库中导出来,但这并不是万灵药。
在Rails中,我们可以在fixtures中写ruby 代码,这称为动态fixtures。在dbunit 中如果也能这么做就好了!
首先,如果要实现这个功能,那么肯定涉及动态脚本的内容。自己写一个?太费劲了,浪费时间,最主要是没这个能力:)。
那么怎么办?当然是“站在巨人的肩膀上”了!目前java所支持的动态脚本很多,不过我还是选择了一个大家都熟悉的脚本:javascript。没别的原因,就是因为它简单,而且大家都熟悉。
好了,那么我们有了一个大致的思路,就是用一个工具,去读javascript脚本,这个javascript当然负责动态生成 dbunit所需要的xml信息,然后dbunit再根据这些动态生成的xml信息,去维护数据库的信息。
Java 解析javascript的内容,大家可以去看看 http://www.iteye.com/topic/87423 。这里所介绍的rhino功能强大,但是我们没必要用那么多,只要能执行函数就行了。
多说无益,下面介绍一下步骤。
首先写一个javascript,用于生成dbunit 所需的xml信息:
记住,javascript的最后一定要调用一下函数,因为解析器是不知道该调用哪个函数的。
下面就是解析这个javascript的方法:
用了rhino的最基本的方法,这个方法返回的是 InputStream类型,因为dbunit需要InputStream类型作为输入。
DbUnit 的内容就不说了,大家可以google it,用起来不难。
通过dbunit + rhino 的结合,我们就可以实现用脚本来维护测试数据了!
用过rails 的人都会觉得rails的测试中,fixtures 实在是一个非常方便的工具。在Java中,我们通常会使用dbunit 来维护我们的测试数据,但是,dbunit有一个不方便的地方,就是测试数据要手写。虽然我们也可以从数据库中导出来,但这并不是万灵药。
在Rails中,我们可以在fixtures中写ruby 代码,这称为动态fixtures。在dbunit 中如果也能这么做就好了!
首先,如果要实现这个功能,那么肯定涉及动态脚本的内容。自己写一个?太费劲了,浪费时间,最主要是没这个能力:)。
那么怎么办?当然是“站在巨人的肩膀上”了!目前java所支持的动态脚本很多,不过我还是选择了一个大家都熟悉的脚本:javascript。没别的原因,就是因为它简单,而且大家都熟悉。
好了,那么我们有了一个大致的思路,就是用一个工具,去读javascript脚本,这个javascript当然负责动态生成 dbunit所需要的xml信息,然后dbunit再根据这些动态生成的xml信息,去维护数据库的信息。
Java 解析javascript的内容,大家可以去看看 http://www.iteye.com/topic/87423 。这里所介绍的rhino功能强大,但是我们没必要用那么多,只要能执行函数就行了。
多说无益,下面介绍一下步骤。
首先写一个javascript,用于生成dbunit 所需的xml信息:
function create_dataset_xml_msg() {
var dataset_xml_msg;
dataset_xml_msg = '<dataset>\n';
for(var record_count = 0; record_count <10; record_count++) {
dataset_xml_msg += '<test1 user_name="user_'+record_count+'"/>\n';
}
dataset_xml_msg += '</dataset>\n';
return dataset_xml_msg;
}
create_dataset_xml_msg();
记住,javascript的最后一定要调用一下函数,因为解析器是不知道该调用哪个函数的。
下面就是解析这个javascript的方法:
public static InputStream LoadDataSetStr() throws Exception{
Context cx = Context.enter();
cx.setLanguageVersion(Context.VERSION_1_2);
Scriptable scope = cx.initStandardObjects();
File file = new File("dataset.js");
LineNumberReader ln = new LineNumberReader(new FileReader(file));
String js = "";
String s;
while((s = ln.readLine())!=null) {
js += s+"\n";
}
Object result = cx.evaluateString(scope, js,
null, 1, null);
String jsResult = cx.toString(result);
ByteArrayInputStream ba = new ByteArrayInputStream(jsResult.getBytes());
return ba;
}
用了rhino的最基本的方法,这个方法返回的是 InputStream类型,因为dbunit需要InputStream类型作为输入。
DbUnit 的内容就不说了,大家可以google it,用起来不难。
通过dbunit + rhino 的结合,我们就可以实现用脚本来维护测试数据了!