unit-testing - 为 PHPUnit 中的所有单元测试模拟我的数据库

标签 unit-testing mocking phpunit

我最近才开始研究使用 PHPUnit 进行单元测试,想知道是否可以模拟我的整个数据库来进行所有测试。我的模型类(包装的 Table Row 对象以提供 ActiveRecord 实现) Root 于数据库,一些模型具有许多级别的其他模型类,因此模拟所有这些似乎在后端会很痛苦。

是否可以让 PHPUnit 使用 CSV 文件中的数据作为我的数据库,并针对那里的数据运行我的测试,而不必触及我的 DAO?我已经阅读了 PHPUnit 中关于数据库测试的部分,但我不确定这是我想要的,因为我不想测试数据库或与数据库交互的代码,更多的是我的模型类是与数据库密切相关,必须一直模拟事物会很痛苦。如果我可以给它一个 CSV 文件作为我的数据库,那么我就可以将我的数据放入 CSV 文件并照常进行。

不确定我是否表达清楚,所以请要求澄清。如果有可能实现这一目标,那就太棒了。如果没有这个单元测试,这个野兽可能不实用,但我真的想在项目中引入单元测试。

谢谢

齐亚德

最佳答案

在我看来,使用 DBUnit 测试依赖于 DB 的代码有一些优势。这些可能适用于所有人,也可能不适用于所有人,我同意。直到最近我自己才使用 DBUnit,因为我发现它对于我参与的小项目来说太过分了。

使用 DBUnit 将您的测试与数据库分离。您的被测系统不应依赖于数据库服务器来运行,您需要尽可能多的隔离。这通常没什么大不了的,因为很多人使用单元测试进行集成测试,为此您更愿意使用尽可能匹配您的生产环境的数据库设置。

DBUnit 受欢迎的另一个原因是它在编写测试时节省了时间。 编写测试不是我喜欢做的编码的一部分,尽可能使用模拟可以节省很多时间。当然,创建数据库的副本很容易,但您仍然需要编写脚本来加载测试数据,并使用脚本在每次测试运行之间重置测试数据。许多测试将取决于特定的数据集,并且随着您添加测试,这会变得更难维护。当然,随着实际应用的发展,所有这些设置都需要与您的实际应用保持同步。根据应用程序的不同,这可能会非常耗时。一些应用程序有数千个测试,当应用程序中的一个简单更改导致 20 个测试及其数据集必须重写时,这令人心碎。

综上所述,使用 DBUnit 有一个学习曲线,第一次使用它可能会有点耗时。一旦完成一项测试,就可以为后续测试节省时间。我并没有在任何地方使用它,因为我编写了很多依赖于实际服务器的测试,但是我编写的新代码和测试我尝试在我的初始 DBUnit 设置上构建,并且很明显这确实节省了时间 < em>从长远来看。

我的 2 美分,好 friend 。

关于unit-testing - 为 PHPUnit 中的所有单元测试模拟我的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6214449/

相关文章:

c# - 与数据库通信的单元测试类

java - Mockito 比 EasyMock 更受欢迎?

class - phpunit:如何在测试之间传递值?

php - 如何在 laravel 中为手动注册事件监听器添加测试?

ios - 我们可以在单元测试时检查 uitextfield 的验证吗?

python - 为 Django 应用程序编写好的测试

java - 有没有办法在 Junit 测试中使用自定义 TestNG 报告器?

python - 如何模拟List类型的全局变量?

Python 模拟具有不同结果的多个调用

PHPUnit - 我可以为较低版本的 PHP 运行测试吗?