在PHP中跟踪以前的方法调用

时间:2011-09-11 06:41:18

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

用例:我正在尝试为运行每个测试用例的单元测试框架创建诊断测试,然后返回测试用例尚未涵盖的公共方法列表。我们的想法是通过确保每种方法的所有公共方法至少通过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

}

2 个答案:

答案 0 :(得分:2)

有关解决问题的常用方法,请参阅Code Coverage tools for PHPXdebug 2: Code Coverage AnalysisSebastian Bergmann's PHP_CodeCoverage

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

答案 1 :(得分:1)

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

您可以获得测试覆盖率数据,可以在一个漂亮的UI中叠加在代码上,这样您就可以看到所涵盖的内容(另一个OP指出了一个方法可能会被执行,但没有被有效覆盖)。您还会收到一个报告,指出未覆盖的内容,它与您的代码的层次结构相匹配。它的XML版本包含您想要的信息:这样的方法未被覆盖以及在何种程度上覆盖。