一些无序的想法:
在每个测试的startUp()中加载fixture(带或不带db结构)到db中是很好的。它可以来自JSON或XML文件,每个表一个文件。 如果你将它与像getNthFixture($sTable, $nIndex)或countFixtures($sTable)这样的函数配对使用,你就可以轻松地测试你的查询。甚至更进一步,你可以使用[LINQ][1]从一组fixture中获取预期结果,几乎没有DB和fixture查询之间的区别。我发现在早期的原型/开发阶段很容易适应,当db结构经常变化时。添加断言以直接比较LINQ查询结果和db查询结果使创建测试成为纯粹的乐趣;)
另一个提示:db应该在每个测试方法之前重新初始化,而不是在测试用例之前。理想情况下,您应该删除基础并从完整的fixture集重新构建它。
如果可能的话,请尝试制作可与不同数据库一起使用的测试(当然,有些东西不可移植,但大多数是可移植的)。除了mysql/postgres/other_big_rdbm之外,至少要使用sqlite。
如果您正在测试框架或其他复杂系统,则可能需要模拟数据库访问单例。如果一些硬编码的东西深埋在不太灵活的orm中,它可能会让人痛苦。
好主意是记录所有未通过测试的查询,并/或在失败消息中显示它们。也适用于db错误消息。如果您正在测试大型数据库时,性能是一个问题,请尝试同时记录慢查询。
更神奇,但可能有点困难的是自动化测试,在where/having/joins中使用的所有列是否都被索引了。这可能属于Jointed Php/Database Code Sniffer (tm)而不是单元测试,并且不是很容易实现,但一旦使用,就可以极大地保证代码的质量。
另一个来自个人经验的好建议:始终为验证字符集添加测试,特别是如果您使用多种不同的语言。ISO-8859-1世界非常小;)
[1]: http://phplinq.codeplex.com/ LINQ
testdb
上运行了mysqldump
,然后手动运行mysql
将testdb
还原到构建服务器上的相同状态。但是,在我的测试中,是否有任何方式应该指示已知状态?是否有比每次手动运行mysqldump
更自动化的方法? - Josh SmithMySQL
的交互,但我仍然认为这些是单元测试。 - Josh Smith