MySQL:如何测试我的数据库架构(外键的一致性、存储过程等)?

5

我正在设计一个更大规模的数据库架构。它将包含一组表、多个视图和相当多的存储过程。由于这是一个比较大型的数据库,而且现在还处于早期设计阶段(实际上仍然只是早期设计阶段),所以我感觉需要一个测试套件来验证重构期间的完整性。

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

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

  • 是否有类似的测试策略和工具可用于一般数据库和特别是MySQL?

  • 当我更改底层表时,如何验证我的视图、存储过程、触发器等是否仍然有效?

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

2个回答

4

数据库测试有两个方面。

  • 第一部分是从业务逻辑的角度来测试数据库,不必关注持久化数据。在这个层面上,有一个众所周知的技术 - ORM。算法很简单: 描述模型并创建一组唯一的用例或条件,以测试所有级联操作是否按照预期执行(我指的是,如果我们创建了Product并将其链接到Category,那么保存会话后,我们可以获取所有实体及其之间所需的关系写入DB)。更重要的是:一些ORM已经提供了单元测试模块(例如,NHibernate),其中一些甚至还提供了更酷的工具:创建数据库模式、模型、测试用例的最简单、最快捷的方法,例如Fluent NHibernate

  • 第二部分是针对测试数据库模式本身。为此,您可以查看一个好的库DbUnit。引用官方网站的话:

DbUnit是一个针对数据库驱动项目的JUnit扩展(也可与Ant一起使用),它可以在测试运行之间将您的数据库置于已知状态。DbUnit具有将数据库数据导出到XML数据集并从中导入的能力。自2.0版本以来,当以流模式使用时,DbUnit还可以处理非常大的数据集。DbUnit还可以帮助您验证您的数据库数据是否与预期的值集匹配。
最后,我强烈建议您阅读Martin Fowler's site上的文章“Evolutionary Database Design”。虽然这篇文章有点过时(2003年),但确实值得一读。

+1 非常好的答案!目前我并不是特别关心测试数据库中包含的数据。但我确实会更仔细地了解“DbUnit”提示(也许我可以将其整合到我的 Jenkins 服务器中?)。谢谢! - dbm

2

要测试数据库,您需要以下几点:

  1. 一个测试数据库,包含所有数据测试用例、初始数据等。这将使您每次都可以从已知的起始位置进行测试。
  2. 一组事务(INSERT、DELETE、UPDATE),将您的数据库移动到所需测试的状态。这些事务本身可以存储在测试数据库中。
  3. 您的测试集 - 表示为对数据库的查询,实际检查您的操作结果的查询。这些结果将由您的测试套件进行测试。
  4. 数据库可能会抛出异常,但如果您遇到异常,则可能存在更严重的数据库和数据问题。您可以以类似的方式测试数据库的操作,但除了“边缘情况”外,这应该是不太必要的,因为现代数据库引擎在数据服务方面非常强大。

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


很棒的回答!简单易用(“简单即美丽”),能够快速入门,而且不需要额外设置工具集。 - dbm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接