PHPUnit - 测试SQL查询的有效性

时间:2011-03-23 13:59:28

标签: php mysql phpunit factory

我正在测试工厂类。 其中一个方法必须将数据加载到另一个方法将实例化的对象的数组中。

该方法包含SQL查询,该查询包含必须进行测试的严重条件。 (在这种情况下,只询问“已发布”的记录。例如:WHERE published = 1)。 SQL Query中的这种区别是使该方法与另一种方法不同的唯一细节,我想测试查询执行行为。

现在,我无法真正模拟我的PDO对象并要求它返回一个固定的结果,因为我不会测试mySQL执行查询。这将是一个无用的测试。

这让我觉得我需要在其中设置一个带有固定测试数据的静态数据库。我是对的还是我错过了什么?

我是否应将需要“测试数据库”的测试与自主测试分开?

2 个答案:

答案 0 :(得分:10)

我非常同意不嘲笑PDO。在某些时候,我想确保我的查询针对真正的数据库。从技术上讲,这可能不再是单元测试了。对我而言,它提供了更多知识,我处理数据存储的代码确实对数据库有效。

我倾向于为每个需要与数据库通信的类创建一种数据访问类,从而将大部分业务逻辑与数据库访问代码分离。

这样我就可以在测试类时模拟数据访问,然后为每个“数据访问类”设置一个“测试数据库”,看看是否有效。

@zerkms已经链接http://phpunit.de/manual/current/en/database.html的答案(+1)和我发现在数据库测试方面有价值的唯一其他资源是书籍Real-World Solutions for Developing High-Quality PHP Frameworks and Applications,其章节内容很大这个主题。


  

我是否应将需要“测试数据库”的测试与自主测试分开?

只有当你的测试套件变得非常大并且你有运行时问题迫使你说“即使是测试数据库也只需要花费很长时间来进行所有测试,所以我只在连续集成服务器上运行,而不是在开发时。

答案 1 :(得分:3)

是的,这是常见做法。

它也是加载灯具的特殊方法:http://phpunit.de/manual/current/en/database.html

第二个问题:不,你不应该将它们分开。您的测试应该测试行为,而不是测试实现的细节。通过逻辑将测试用例连接到测试类中。