PHPUnit自己的手册有标题为“操作”和“数据库测试最佳实践”的some as-yet-unwritten sections。
使用PHPUnit测试数据库的最佳实践是什么,尤其是在MySQL中
发布于 2010-09-29 08:27:42
当我使用PHPUnit进行数据库测试时,我会在第一个套件的开始加载我的MySQL转储,它包含我假设在所有测试中为真的任何信息。每次测试开始时,我都会使用setupDatabase方法。此方法从我知道已更改的表中删除所有行,然后加载一个平面XML数据集,其中包含我需要保持为true的数据。在此之后,我会运行我正在测试的任何代码。最后,我使用一组简单的方法从数据库中选择行,以断言我所做的更改是正确的。
我不会说这是一种最佳实践,但对我来说效果很好。我遇到的唯一问题是每次模式更改时都必须对XML数据集进行查找和替换,并且由于所有的删除和插入操作,测试运行速度很慢。
Zend Framework有一个有趣的PHPUnit库,它允许测试compare a database table到平面XML数据集,但是我还没有机会使用它。
发布于 2010-10-18 04:12:24
一些杂乱无章的想法:
在每个测试的startUp()中,最好有装入到db中的fixture(有或没有db结构)。它可以来,即。来自JSON或XML文件,每个表一个。如果将它与getNthFixture($sTable,$nIndex)或countFixtures($sTable)等函数结合使用,就可以轻松地测试查询。此外,您还可以使用LINQ从一组fixture中获得预期的结果,而DB和fixtures查询之间几乎没有差别。我发现在db结构经常变化的早期原型/开发阶段很容易适应。添加断言来直接比较LINQ查询结果和数据库查询结果,使创建测试变得纯粹愉快;)
另一个提示: db应该在每个测试方法之前重新初始化,而不是在测试用例之前。理想情况下,您应该丢弃基座,然后从完整的夹具集合中重建它。
如果可以的话,尝试使用不同的数据库进行测试(当然,有些东西是不可移植的,但大多数都是可移植的)。除了mysql/postgres/other_big_rdbm之外,至少使用sqlite。
如果您正在测试框架或其他复杂系统,您可能应该模拟数据库访问单例。如果一些硬编码的东西被深埋在不那么灵活的orm中,那么它可能是令人头疼的东西,比如说,脖子。
一个好主意是记录所有未通过测试的查询,和/或在失败消息中显示它们。也适用于数据库错误消息。如果您在测试大型数据库时需要考虑性能,请尝试同时记录较慢的查询。
更神奇但可能有点困难的是自动化测试where / having / joins中使用的所有列是否都已被索引。也许应该属于联合的Php /数据库代码嗅探器(tm)而不是单元测试,而且实现起来不是很简单,但一旦使用就能极大地保证代码的质量。
另一个很好的建议,来自不幸的个人经验:总是为每个字符集添加测试,特别是当你使用许多不同的语言时。ISO-8859-1的世界非常小;)
1:http://phplinq.codeplex.com/链接查询
https://stackoverflow.com/questions/3697815
复制相似问题