【问题标题】:Unit testing with PHPUnit and a semi-persistent database使用 PHPUnit 和半永久数据库进行单元测试
【发布时间】:2012-07-28 09:20:37
【问题描述】:

我是单元测试的新手,我正在尝试在我正在处理的现有项目中开始使用 PHPUnit。

我面临的问题是我有很多单元测试需要一个足够公平的数据库。我已经建立了一个 SQLite 数据库,仅用于单元测试。有时我想为新的测试删除并重新创建数据库(我的意思是每个单独的类),以防止不必要的数据冲突。

但是,如果我在同一个类中有相互依赖的单元测试,有时我不希望这种情况发生;这些可能需要访问之前测试中保存的数据。

我目前在每个类的 setUp() 函数中都获得了一个“新鲜”的数据库。我没想到的是这个函数(与 __construct() 一样)会在所述类中的每个测试用例之后运行。

有没有办法用每个测试类刷新数据库?还是我错误地处理了整个过程?

感谢任何提示,谢谢。

【问题讨论】:

  • 我在 PHPUnit 的自学方面还没有走那么远,但我感觉您可能想查看 @depends 注释。我相信这可以让您表明测试取决于其他测试的结果,尽管我不确定它是否会保留从一个测试到下一个测试的状态。另外,只是关于架构的说明。直接与 DB 通信的对象集应该相当小,更高级别的对象使用 DB 对象进行间接通信。然后在进行测试时,您可以模拟数据库对象以供其他对象与之交谈
  • @PeeHaa 我读了它,因为他纯粹使用 sqlite 数据库进行测试。
  • @PeeHaa 我正在使用内存数据库进行测试

标签: php phpunit


【解决方案1】:

setUp和tearDown函数和你说的完全一样,就是为每次测试执行设置测试环境,然后在每次测试用例执行后进行清理。

您可能想要做的是在套件级别设置您的数据库数据提供程序。

Suite level fixtures

这可能并不是获得真正独立单元测试的最佳方式(即,您可以为 DB 等设置模拟数据提供程序)。但这是你可以做的事情,应该能满足你的迫切需求。

【讨论】:

    【解决方案2】:

    我最近也开始使用 PHPUnit(大约一年前)。我做的第一件事是为我当时正在从事的项目设置单元测试。我认为测试数据访问层也是一个好主意,并为您做了类似的事情。我花了几天的时间来设置,最后我完成了需要 8 分钟才能运行的单元测试! 99% 的时间都花在了设置和拆除测试数据库上。真是一场灾难!

    我所做的是重构项目,这样实际上只有一个类需要与数据库通信,并为此进行了集成测试,但没有单元测试。这意味着我的项目现在必须使用依赖注入来促进测试。我最终得到了一套在 2-3 秒内运行的测试和一个几乎可以自己编写的项目。维护和进行更改/添加是一个梦想,我希望我的所有代码都是这样编写的。

    基本上,我想说的是,您应该将代码更改为易于测试,而不是尝试强制单元测试以适应并非以测试驱动方式设计的代码。您现在投入的时间(如果可以的话)将在以后用红利偿还!

    现在就咬紧牙关重构吧!

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 2014-12-25
      • 2014-08-02
      • 1970-01-01
      • 2015-01-27
      • 2011-05-14
      • 2019-04-01
      • 2013-09-13
      • 1970-01-01
      相关资源
      最近更新 更多