【问题标题】:Running a unit test in isolation in PHP在 PHP 中单独运行单元测试
【发布时间】:2011-09-15 23:18:55
【问题描述】:

我已经用 PHP 创建了一个基本的单元测试套件。它显示测试是否通过以及执行测试所需的时间。它工作得很好,但我遇到了一个问题,我不知道如何解决它。每个单元测试类的每个初始单元测试似乎总是比该类中的其他单元测试花费更多的时间来执行,通常是一个重要因素。

举个例子:

TestClass1

  • Test1.1 (0.042395)
  • Test1.2 (0.000392)
  • Test1.3 (0.000325)
  • Test1.4 (0.000645)

TestClass2

  • Test2.1 (0.042395)
  • Test2.2 (0.000392)
  • Test2.3 (0.000325)
  • Test2.4 (0.000645)

我假设初始测试时间也是资源加载的因素,但我似乎无法使第一次测试与其他时间保持一致。每个测试都有运行的 setUp 和 tearDown 方法。我还尝试以不同的名称重复完全相同的测试,并且它会在预期的更短的时间内运行,因此第一个测试总是有某种开销。

PHP 没有任何类型的 unloadClass 或 unloadFile 函数,因此如果第一个测试具有将资源加载到内存中的开销,我不确定是否可以为每个测试重新创建一致的测试环境。我已经尝试过预加载文件和初始类实例化,但似乎都没有产生影响。

还有其他我可能遗漏的可能会影响初始测试时间的可能性吗?解决这个问题的正确方法是什么?

注意:我知道现有的 PHP 单元测试框架,但我正在尝试做一些不同的事情,所以请不要说“只使用 PHPUnit”,因为它是对帮助我解决这个问题没有帮助。

【问题讨论】:

  • 为什么要关心单元测试的运行时间?你不会用它来进行性能测试吧?
  • 您使用的是 APC 还是类似的?也许最初的长时间第一次运行是由于编译,然后将其缓存以供后续运行。
  • 这只是一个眼球测试,而不是深入分析。
  • @Alex - 没有 APC,它几乎只是普通的 PHP。

标签: php unit-testing isolation


【解决方案1】:

您在 PHP 代码中执行的任何基准测试都会出现偏差。我建议考虑使用 Xdebug 的分析功能来获得更准确的基准:http://xdebug.org/docs/profiler

【讨论】:

  • +1 - 我在测试套件的其他部分使用 Xdebug,所以这将是一个不错的选择。但是,探查器似乎没有 PHP 接口,这使得它不太理想,因为我不想使用像 KCacheGrind 这样的附加程序或其他附加依赖项。
  • 您能否详细解释一下,如果用 PHP 代码完成基准测试,为什么会出现偏差?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 2018-02-08
相关资源
最近更新 更多