5

我只是在设计一个更大的数据库架构。它将包含一组表、几个视图和相当多的存储过程。由于它是一个较大类型的数据库并且处于开发的早期阶段(实际上它还只是处于早期设计阶段),我觉得需要一个测试套件来验证重构过程中的完整性。

就应用程序逻辑而言,我非常熟悉测试概念,包括服务器端(主要是 PHPUnit)和客户端(Selenium 和 Android 测试基础设施)。

但是如何测试我的数据库架构?

  • 一般数据库,特别是 MySQL,是否有某种类似的测试策略和工具?

  • 在更改基础表后,如何验证我的视图、存储过程、触发器和天知道的内容是否仍然有效?

  • 我是否必须使用 PHP 层来包装数据库以启用对数据库逻辑(存储过程、触发器等)的测试?

4

2 回答 2

4

数据库测试有两个方面。

  • 一种是从业务逻辑的角度测试数据库,不应该关注持久化数据。在那个级别,有一种众所周知的技术——ORM。这种情况下的算法很简单:描述一个模型并创建一组独特的案例标准来测试所有级联操作是否按应有的方式执行(我的意思是,如果我们创建Product并将其链接到Category,那么在保存会话之后,我们将获得所有实体写在数据库中,具有所有必需的关系)。多说一句:有些ORM已经提供了单元测试模块(例如NHibernate) 和其中一些更酷的工具:创建数据库方案、模型、测试用例的最简单、最快的方法:例如,Fluent NHibernate

  • 其次是面向测试数据库模式本身。为此,您可以查看一个好的库DbUnit。引用自官网:

DbUnit 是针对数据库驱动项目的 JUnit 扩展(也可与 Ant 一起使用),其中包括在测试运行之间将您的数据库置于已知状态。DbUnit 能够将您的数据库数据导出和导入 XML 数据集。从 2.0 版开始,当在流模式下使用时,DbUnit 也可以处理非常大的数据集。DbUnit 还可以帮助您验证您的数据库数据是否与预期的一组值匹配

最后,我强烈推荐您阅读Martin Fowler 网站上的文章“进化数据库设计” 。它有点过时(2003 年),但确实值得一读。

于 2012-06-09T06:28:45.857 回答
2

要测试数据库,您需要做的一些事情是:

  1. 包含所有数据测试用例、初始数据等的测试数据库。这将使您能够每次都从已知的起始位置进行测试。
  2. 一组事务(INSERT、DELETE、UPDATE)使您的数据库通过您要测试的状态。这些本身可以存储在测试数据库中。
  3. 您的一组测试 - 表示为对数据库的查询,对您的操作结果进行实际检查。这些结果将由您的测试套件进行测试。
  4. 数据库可能会引发异常,但如果您遇到异常,您可能会对数据库和数据产生更严重的担忧。您可以以类似的方式测试数据库的操作,但除了“极端情况”之外,这应该不太必要,因为现代数据库引擎在其数据服务任务中非常健壮。

您不需要用 PHP 层包装您的数据库 - 如果您遵循上述结构,则应该可以在您的实际数据库的 DML 和 DDL 中与您的正常测试套件结合使用您的完整测试套件。

于 2012-06-09T06:24:53.367 回答