gpt4 book ai didi

php - 如何使用 PHPUnit 在 Symfony2 中设置数据库密集型单元测试?

转载 作者:IT王子 更新时间:2023-10-29 00:02:00 25 4
gpt4 key购买 nike

我对测试世界还很陌生,我想确保自己走在正确的轨道上。

我正在尝试使用 phpunitsymfony2 项目中设置单元测试。

PHPUnit 正在运行,简单的默认 Controller 测试运行良好。 (但这不是关于功能测试,而是关于我的应用程序的单元测试。)

虽然我的项目在很大程度上依赖于数据库交互,但据我了解 phpunit's documentation ,我应该建立一个基于 \PHPUnit_Extensions_Database_TestCase 的类,然后为我的数据库创建固定装置并从那里开始工作。

然而,symfony2 仅提供了一个 WebTestCase 类,该类仅从 \PHPUnit_Framework_TestCase 扩展开箱即用。

所以我认为我应该创建自己的 DataBaseTestCase 是否正确,它主要复制 WebTestCase,唯一的区别是它扩展自 \PHPUnit_Extensions_Database_TestCase 并实现其所有抽象方法?

或者 symfony2 是否有另一个关于以数据库为中心的测试的“内置”推荐工作流?

因为我想确保我的模型存储和检索正确的数据,所以我不想最终测试 doctrine 的细节。

最佳答案

我从来没有使用过PHPUnit_Extensions_Database_TestCase,主要是因为这两个原因:

  • 它不能很好地扩展。如果您为每个测试都设置和拆除数据库,并且您有一个严重依赖数据库的应用程序,那么您最终会一遍又一遍地创建和删除相同的架构。
  • 我喜欢不仅在我的测试中,而且在我的开发数据库中都有我的固定装置,甚至生产需要一些固定装置(初始管理员用户或产品类别或其他)。将它们放在只能用于 phpunit 的 xml 中对我来说似乎不合适。

我的理论方法...

我使用 doctrine/doctrine-fixtures-bundle用于固定装置(无论出于何种目的)并使用所有固定装置设置整个数据库。然后我对该数据库执行所有测试,并确保在测试更改数据库时重新创建数据库。

优点是如果测试只读取但不更改任何内容,我不需要再次设置数据库。对于更改,我必须删除它并重新创建它,或者确保还原更改。

我使用 sqlite 进行测试,因为我可以设置数据库,然后复制 sqlite 文件并用干净的文件替换它以恢复原始数据库。这样我就不必删除数据库,创建它并再次加载所有固定装置以获得干净的数据库。

...在代码中

我写了一个 article about how I do database tests with symfony2 and phpunit .

虽然它使用 sqlite,但我认为可以轻松地进行更改以使用 MySQL 或 Postgres 或其他任何东西。

进一步思考

以下是一些其他可能可行的想法:

  • 我曾经读过一个测试设置,在使用数据库之前,你启动一个事务(在 setUp 方法中),然后使用 tearDown 进行回滚。这样您就无需再次设置数据库,只需初始化一次即可。
  • 我上面描述的设置有一个缺点,即每次执行 phpunit 时都会设置数据库,即使您只运行一些没有数据库交互的单元测试。我正在尝试一种设置,其中我使用一个全局变量来指示数据库是否已设置,然后在测试中调用一个方法,该方法检查此变量并在数据库尚未发生时初始化数据库。这样,只有在测试需要数据库时才会进行设置。
  • sqlite 的一个问题是它在极少数情况下与 MySQL 的工作方式不同。我曾经遇到过一个问题,即 MySQL 和 sqlite 中的某些行为不同,导致在 MySQL 一切正常时测试失败。我不记得它到底是什么了。

关于php - 如何使用 PHPUnit 在 Symfony2 中设置数据库密集型单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10784973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com