日期:2014-05-16  浏览次数:20292 次

在DBUnit中使用脚本来生成测试数据
在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信息:

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 的结合,我们就可以实现用脚本来维护测试数据了!
1 楼 yananay 2007-06-15  
管理员可以把这个转到Agile 板块吗?我觉得那个板块更适合这个帖子。
谢谢!