有关数据库单元测试的几个常见问题

何为单元测试?
如果你对单元测试还不太了解, 可以看看中文维基百科的词条 http://zh.wikipedia.org/zh-cn/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95

何为数据库单元测试?
如果你对数据库单元测试还不太了解, 可以看看下面英文网站 http://www.agiledata.org/essays/databaseTesting.html


数据库单元测试的范围是什么?
1.数据库中的所有程序, 这包括存储过程/存储函数, 视图等, 对于Oracle, 还有package这个概念.
2.数据库中的一些数据, 比如控制表, 数据字典表
3.其他情形(这一点是废话, 你可能在很多法律条文中, 经常看到它)


由谁来做数据库代码单元测试?
和一般的单元测试一样, 应由数据库代码的开发者做. 


为什么要做数据库的单元测试?
如果你认为有必要对C#, Java代码做单元测试, 那么你就应该想到也需要对数据库代码做单元测试,. 具体讲:
1. 错误越早发现,修复的代价越小, 这一点, 我想做所有软件同学都有同感吧. 单元测试可能是最早能帮你找到defect的环节了.
2. 单元测试提供了一种结构化的回归测试方式, 尤其是对不断演进的系统, 回归测试好处多多, 很多时候, 你可以通过回归测试, 发现新改动对原有功能造成了影响.
3. 如果你采用测试驱动开发TDD来做项目, 那单元测试工具是比不可少的. 至于何为测试驱动开发, 请参考维基百科(http://zh.wikipedia.org/zh-cn/%E6%B5%8B%E8%AF%95%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91) 或者(http://www.agiledata.org/essays/tdd.html)
4. 如果你的team要做Continuous Integration, 单元测试工具也是比不可少的.


有了Mock框架, 数据库单元测试还需要吗?
要回答这个问题, 你需要清楚为什么引入Mock的原因是什么. 如果你要测试一段包含数据库逻辑的C#代码, 你完全可以使用Mock来做模拟数据库逻辑, 而且, 我认为, 这是一个值得推荐的做法, 原因: 一来, 你的目标是测试C#的逻辑, 而不是相关的数据库代码, 理所当然, 应该假设数据库代码是正确的, 但事实上, 数据库代码不一定是正确的, 因此, 你需要一个数据库代码的替身. 二来, 一旦包含了数据库代码的测试, 情况将变得很复杂, 也许你不得不处理, 如何初始化数据库的数据, 在测试之后, 如何恢复数据库的状态.
稍等, 这时候数据库代码的测试还没有被cover到, 你就需要一个专门的数据库单元测试工具了.


一个数据库单元测试工具应该具备的功能?
1. 很多时候, 要测试一个逻辑, 你需要在数据库中初始化一些基础数据, 单元测试软件应该能让我们很方便地准备这些基础数据.
2. 前一点算是setup吧, 在做完测试工作后, 可能还需要有一个teardown过程, 所以这个也是必须的. 
3. 因为你可能需要对一个数据库代码做多次单元测试, 所以, 单元测试最好可以工作在一个Sand Box中.

4. 它支持的测试用例应该是declarative, 而不是imperative 

posted @ 2010-11-18 20:38  harrychinese  阅读(1920)  评论(0编辑  收藏  举报