【问题标题】:Tracing a previous method call in PHP在 PHP 中跟踪先前的方法调用
【发布时间】:2011-09-11 16:15:23
【问题描述】:

用例:我正在尝试为我的单元测试框架创建一个诊断测试,该框架运行每个测试用例,然后返回测试用例尚未涵盖的公共方法列表.我们的想法是通过确保每个公共方法的所有公共方法都经过至少 1 个单元测试的测试来增加测试覆盖率。

问题:我无法检测是否调用了某个类中的方法。我试过使用 debug_backtrace() 函数,但它只返回来自测试框架的调用,而不是正在测试的类方法。我可以获得正在运行的方法名称的唯一方法是将 debug_backtrace() 函数实际放入测试类的方法中,这是一个不可接受的选项,因为我必须在每个类的每个公共方法中都有它。

是否有另一种方法可以进行回溯以获取测试的类方法?或者,用一种稍微不同的方法,有没有办法启动和停止一个监听器来记录所有被调用的方法(我可以解析出任何不属于的东西)?

伪代码:

runTest($testName){

   //run the test
   //get all recent classes and methods used
   //parse out test framework info
   //compare used public methods to public method list for the tested class

}

或者:

runTest($testName){

   //start listener
   //run the test
   //close listener, get all recent classes and methods used
   //parse out test framework info
   //compare used public methods to public method list for the tested class

}

【问题讨论】:

  • “这个想法是通过确保每个公共方法的所有公共方法都经过至少 1 个单元测试的测试来增加测试覆盖率。” --- 我认为这个指标不能代表任何有用的东西。为什么不像其他 (phpunit) 测试框架那样使用 xdebug?
  • @zerkms - 你能解释一下为什么你认为这个指标没有用吗?重点不是暗示一个方法被至少 1 个单元测试完全覆盖,而是要指出哪些公共方法根本没有任何 覆盖。至于 xdebug,如果没有必要,我不希望强制用户安装额外的扩展。
  • "any call" 对我来说不是有用的指标。方法可以是 100 行的长度,但覆盖 1%(仅第一行带有 if ($bla) return;)。

标签: php unit-testing debugging reflection stack-trace


【解决方案1】:

请参阅Code Coverage tools for PHP、Xdebug 2: Code Coverage Analysis 和Sebastian Bergmann's PHP_CodeCoverage,了解解决问题的一些常用方法。

你想要的通常是从外面看 php。使用debug_backtrace() 既慢又慢,正如你自己所说,不能完全依赖,因为你真的想要一个不修改你的php脚本任何行为的观察者(例如在回溯中包括你的测试方法)。

【讨论】:

  • 感谢您的回答,切尔默茨。您知道不使用 Xdebug 的任何方法吗? (看起来所有这些解决方案都需要它)。
  • @VirtuosiMedia:不,对不起。不过,我会依赖 xdebug,它非常可靠并且被主流使用。由于它是一个“额外”指标,我会很好地依赖 xdebug,但我不是你 :)
【解决方案2】:

请参阅我们的PHP Test Coverage Tool。它在您的程序运行时收集测试覆盖率数据,而不使用 xdebug。它通过临时将插桩插入到您的代码中来实现这一点,例如,在测试过程中。

您会返回测试覆盖率数据,可显示叠加在漂亮 UI 中的代码上,因此您可以看到覆盖的内容(另一个 OP 指出可能会执行 a 方法,但没有有用地覆盖)。您还会收到一份报告,指出未涵盖的内容,该报告与您的代码层次结构相匹配。它的 XML 版本包含您想要的信息:某某方法被/未被覆盖以及在何种程度上。

【讨论】:

  • 该工具看起来不错,但如果代码的目的是要在野外发布,则它是一个更难解决的依赖关系。既然采用了这种方式,是不是也觉得php里面没有简单的方法呢?
  • @chlemertz:是的,也不是。我们以这种方式构建工具通常是出于自卫;如果我们不必依赖晦涩难懂的语言调试基础设施,当我们需要的东西不存在时,我们就不会陷入困境。对于 PHP,Xdebug 的存在是不确定的;在服务器上有代码的人通常没有它,服务器管理器也不会安装它。无论 XDebug 是否存在,我们的解决方案都有效。我不确定我是否理解您对“依赖......如果代码要被释放到野外”的反对意见。我们的仪器是临时的;无需保留或运送。发送您的原始代码。
  • 您的工具看起来非常好,但(没有更好的词)似乎比 xdebug 更难获得,因为它似乎仅适用于 Windows,并且上面标有价格标签。出于同样的原因,“无论是否存在 PHP 测试覆盖工具,xdebug 都可以工作”。无意冒犯,+1
  • 是的。很难与免费竞争(尽管质量可能会有所作为)。但即使是 Zend 也是靠向人们收费来谋生的。
猜你喜欢
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 2012-12-07
  • 2013-10-05
  • 2017-03-23
相关资源
最近更新 更多