2009年2月1日星期日

Scenario of using DbUnitTest

DbUnitTest的典型使用场景

1. 数据库脚本重构(Refactor): 原有的数据库脚本(存储过程或Sql 语句)已经经过实践检验, 逻辑正确, 但是效率有待提高. 接下的任务是重写或重构原有的脚本. 我们可以针对这个数据库脚本编写若干个测试用例, 最好做到比较高的测试覆盖率. 然后用DbUnitTest来跑一下这些测试用例, 有DbUnitTest Gui界面上若红灯出现, 就表明你新写的脚本有问题, 非常直观.
2. 回归测试(Regression Test). 模拟场景: 前几天你对数据库脚本做了一些修改, 今天Application的测试人员跑过来, 和你讲, “好像数据库脚本有些问题”. 你也许心里在骂, “有错误, 不早点告诉我, 现在告诉我, 不是明摆着叫我加班, 今天晚上我可佳人有约啊” . 其实, 我们自己也知道, 这根本不能责怪Application的测试人员, 这是典型的Bug leakage, 而且是你产生的bug. 一个好的做法是, 你先写好数据库脚本的测试用例, 每次对数据库脚本进行修改/重构后, 只需要用DbUnitTest来跑一下测试用例, 一眼就知道你的修改正不正确, 而不用等Application开发/测试人员.
3. 数据比对. 这种情形在很多软件外包公司很常见, client 发过一个excel表格和oracle数据库的dump, 里面都包含几万条记录, client的要求很简单, 就是找出excel和oracle表的数据有哪些不一致. 要求虽小, 却苦了外包公司的同胞们了, 辛苦地比对着, 一个项目做下来, 近视了好几百度.

Advantages and highlights of DbUnitTest

和其他数据库UnitTest工具相比, DbUnitTest有哪些优势?

目前面向Db的UnitTest工具有: DBFit, DBUnit, SQLUnit, XTUnit, 其中DBUnit, SQLUnit和XTUnit仅仅是xUnit的变种, 要想用它测试数据库脚本, 你需要写Java/C#代码, 这对于多数专职的DBA 或DB Developer来讲, 比较困难. DBFit比DbUnit进步了一些, 它提供了相对简单的类库, 但你仍需要编写.Net代码.

DbUnitTest数据库单元测试工具可以完成数据库存储过程/SQL的单元测试, 采用Xml而不是Java或C#来定义测试用例, 这样数据库开发人员更容易接受.

Feature:
1. 使用Xml编写测试用例, 不需要懂Java或其他编程语言.
2. 不需要在Db Server端安装任何package或软件.
3. 支持多种数据库 (目前支持Oracle/Sql Server/MySQL/Excel数据库, 将来会支持更多的数据库)
4. 支持多达16种测试断言(Assertion), 比如两个记录集合相等, 两个记录集合严格相等, 一个是另一个的子集, 超集等
5. 可以使用Excel作为测试用例的数据源. 这样你准备测试数据将非常容易
6. 支持分布式数据库单元测试, 也就是说你不仅仅可以测试单一的数据库上的脚本, 而且可以利用一个数据库的数据, 来测试另一个数据库脚本.
7. 支持沙箱模型. 只要你的数据库本身支持事务, 你可以将测试用例设置为沙箱测试模式, 等测试完毕之后, 所有的数据库语句将会自动被会滚.
8. 提供专有的记录集的比较功能. 比如当我们发现某个测试用例不通过的时候, 可以使用这些记录集比较功能, 看看期望的记录集与实际的记录集相比, 到底多一些什么, 或少了一些什么.

Why to create DbUnitTest tool?

为什么要创建DbUnitTest这个工具?

大概是2005年, 我第一次接触DUnit(一个Delphi的UnitTesting工具, 是JUnit的变种), 在项目中很快就体会到UnitTest带来的好处, 简单讲有2点: 1. 写好测试用例后, 就可以自动化完成测试; 2. 随时进行回归测试. 几年下来, NUnit,MBUnit等测试工具更是我开发必备的软件.

但比较遗憾的是, 一直没有找到比较好用的面向数据库的单元测试工具, 我曾经试用了AgileData网站列出的所有测试工具, 结果都不是很满意, 因为它们多数用Java/C#来编写测试用例, 不太适合数据库开发人员, 更重要的是, 你很难为测试用例准备测试数据源.

在2007年, 我开始构思设计一个面向数据库的单元测试工具, 大概经过半年的时间, 1.0版本的DbUnitTest问世了, 并在公司内部使用, 获得了非常好的效果.

在2008年, 我在InfoQ上, 看到一篇文章, 其中讲到数据库单元测试工具的现状, “普遍觉得数据库方面被忽视了,大部分的数据库开发人员很少或几乎没有单元测试的概念, 也缺乏相关支持工具.”(摘自InfoQ http://www.infoq.com/cn/news/2008/11/PDC-testing). 于是萌发了将DbUnitTest推广的想法.