用编程语言作数据库测试的配置

在[url=http://marlonyao.iteye.com/admin/blogs/760763]上一篇博客:django, mongodb与测试[/url]中,我推荐使用json作为数据库测试的配置格式,因为json格式简单,语言中立,容易解析, 又不似xml那样繁琐。json有它的缺点,主要有:
[list]
[*] 没有注释
[*] json不能表达复杂的类型
[*] json不能引用程序数据
[*] 程序不能引用json数据
[/list]
第一个缺点是显而易见的,测试数据也要和别人交流,最简单也要给为了将一些数据和其它数据分开,要加上一些分隔符,仅仅用空白做分隔符的作用并不明显。要给json加上注释也是有办法的,一种办法是使用一个可以带注释的json解析器,然而这不幸破坏了json的语言中立。另外一种办法就是约定凡是以'--'开头的字符串都为注释,直接将它忽略,这种方式更易实施,但需要对解析之后的数据做后续处理。一个可能的json配置是:

[
"-- 以下是用户数据",
{
"name": "marlon",
..........
},
..........
"-- 以下是商品数据",
{
....
}
]

这种方式可能很奇怪,因为它必须首先要求这是一个正确的json格式,但它的确可以做到有注释了。

第二个缺点我在[url=http://marlonyao.iteye.com/admin/blogs/760763]上一篇博客[/url]已经讲过,可以对dict加一个标识对象类型的tag来解决,这里不再赘述。

第三个缺点可能并不明显,这只在需要测试数据需要动态生成的数据时才会出现这种问题。这有绕过的方法,就是在json使用占位符,用来替换程序中对应的相应,例如 {{ name }},会在加载数据时替换成程序中的某个name变量值。

第四个缺点想必大多数写数据库测试的都碰见过,因为我们依赖配置数据来将数据库設定到某个固定初始状态,在测试中也必定要引用这初始状态的数据,但我们不能通过程序引用json中数据,这就需要我们在测试中重复配置数据中设置,如果配置数据改了,也要更新程序中相应的数据,否则测试就会失败,这会导致测试用户更改的成本明显加大,而测试恰恰是需要经常修改的。这个问题没有简单地绕过去的方法。

然而,使用程序作为数据配置却可以轻松避免以上的缺点。它的缺点是丧失了语言中立,这其实不是问题,用什么语言开发,就用什么语言写测试,这很正常,也很普遍。它对语言的唯一的要求就是它的表达力要强,表达数据,字典(或者Map)之类的对象要很简单,Python, Ruby都符合这样的要求。对于Java,就可以使用Scala,Groovy来作测试数据的配置,因为它们都和java集成很好,或者用Java做开发,却用Scala或Groovy来写测试也是很好的选择。

使用程序作为数据配置带来的一个主要问题是如何保证测试数据配置的不可修改,一旦修改了测试数据,就会影响其它的测试。这个缺点跟它带来的巨大优点相比是微不足道的。最好的方法是尽量利用程序提供的不变类型,python对list不变类型tuple,但对dict却没有提供类似的构造。一种方法是靠程序员的自我約束,这很不靠谱,保不定哪个新手就直接更改测试数据,这引起的问题很难查出来。另外一种方法就是创建dict的一个不可变版本,但是这样就可能导致配置复杂,或者可以在加载数据时自动用它的不可变版本替换。

我将测试数据配置格式从json改成python之后,测试代码清楚了许多,完全没有硬编码的测试数据了,更改测试数据也不会导致测试的失败。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值