我只是在设计一个更大的数据库架构 . 它将包含一组表,几个视图和一些存储过程 . 由于它是一个较大类型的数据库,并且处于开发的早期阶段(实际上它仍然只处于早期设计阶段),我觉得需要一个测试套件来验证重构期间的完整性 .
就应用程序逻辑而言,我非常熟悉测试概念,包括服务器端(主要是PHPUnit)和客户端(Selenium和Android测试基础架构) .
But how do I test my database architecture?
-
对于一般的数据库,特别是MySQL,是否存在某种类似的测试策略和工具?
-
如何在更改基础表后验证我的视图,存储过程,触发器以及上帝知道什么仍然有效?
-
我是否必须使用PHP层包装数据库以启用数据库逻辑测试(存储过程,触发器等)?
2 回答
要测试数据库,您需要的一些东西是:
包含所有数据测试用例,初始数据等的测试数据库 . 这样您就可以每次从已知的起始位置进行测试 .
一组事务(INSERT,DELETE,UPDATE),用于将数据库移动到要测试的状态 . 这些本身可以存储在测试数据库中 .
您的一组测试 - 表示为对数据库的查询,用于实际检查您的操作结果 . 这些结果将由您的测试套件进行测试 .
数据库可以抛出异常,但如果您遇到异常,则可能在数据库和数据中存在更严重的问题 . 您可以以类似的方式测试数据库的操作,但除了"corner cases"之外,这应该不太必要,因为现代数据库引擎在其数据服务任务方面非常强大 .
您不需要使用PHP层包装数据库 - 如果您遵循上述结构,那么您应该可以将实际数据库的DML和DDL中的完整测试套件与您的常规测试套件结合使用 .
数据库测试有两个方面 .
One 面向从 business logic 角度测试数据库,不应该关注持久化数据 . 在那个层面上有一个众所周知的技术 - ORM . 在这种情况下算法很简单:描述一个模型并创建一组独特的案例或标准来测试所有级联操作是否按预期执行(我的意思是,如果我们创建
Product
并将其链接到Category
,那么比保存会话后我们得到的所有用DB编写的实体都具有所有必需的关系) . 更多的说法:一些ORM已经提供了单元测试模块(例如, NHibernate ),其中一些甚至是更酷的工具:创建数据库方案,模型,测试用例的最简单,最快捷的方法:例如, Fluent NHibernate .Second 面向测试 database schema 本身 . 为此,你可以看一个好的图书馆DbUnit . 从官方网站引用:
最后,我强烈建议您阅读Martin Fowler's site中的文章“Evolutionary Database Design” . 它有点过时(2003年),但仍然值得一读 .