Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中跟踪以前的方法调用_Php_Unit Testing_Debugging_Reflection_Stack Trace - Fatal编程技术网

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

在PHP中跟踪以前的方法调用,php,unit-testing,debugging,reflection,stack-trace,Php,Unit Testing,Debugging,Reflection,Stack Trace,用例:我正在尝试为我的单元测试框架创建一个诊断测试,它运行每个测试用例,然后返回测试用例尚未涵盖的公共方法列表。其想法是通过确保每个方法的所有公共方法都至少通过一个单元测试来测试,从而增加测试覆盖率 问题:我无法检测是否调用了类中的方法。我尝试过使用debug_backtrace()函数,但它只返回来自测试框架的调用,而不返回正在测试的类方法。我获得正在运行的方法名的唯一方法是将debug_backtrace()函数实际放置到被测试类的方法中,这是一个不可接受的选项,因为我必须在每个类的每个公共

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

问题:我无法检测是否调用了类中的方法。我尝试过使用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

}
或:

有关解决问题的一些常用方法,请参见和

您想要的通常是从外部观看php。使用
debug\u backtrace()
既慢又不可靠,正如您自己所说,因为您确实需要一个不会修改php脚本任何行为(例如,在backtrace中包括您的测试方法)的观察者。

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


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

“我们的想法是通过确保每个方法的所有公共方法都至少通过一个单元测试来测试,从而提高测试覆盖率。”---我认为这个指标不能代表任何有用的东西。为什么不像其他(phpunit)测试框架那样使用xdebug呢?@zerkms-你能解释一下为什么你认为这个指标没有用吗?这并不是说至少有一个单元测试就可以完全覆盖一个方法,而是要指出哪些公共方法根本没有覆盖范围。至于xdebug,如果不需要的话,我不想强迫用户安装额外的扩展。“任何调用”对我来说都不是有用的指标。方法的长度可以是100行,但覆盖范围为1%(仅包含
if($bla)return;
)的第一行。感谢您的回答,chelmertz。你知道没有使用Xdebug的方法吗?(看起来所有这些解决方案都需要它)。@VirtuosiMedia:不,对不起。尽管如此,我还是会依赖xdebug,它非常可靠,被主流使用。由于它是一个“额外”指标,我对xdebug的依赖性很满意,但我不是你:)该工具看起来不错,但如果代码的目的是在野外发布,它将是一个更难解决的依赖性。既然你采用了这种方法,你是否也觉得在php中没有简单的方法可以做到这一点?@chlemertz:是和否。我们以这种方式构建工具通常是出于自卫;如果我们不必依赖于晦涩难懂的语言调试基础设施,那么当我们需要的东西不存在时,我们就不会陷入困境。就PHP而言,Xdebug的存在是不确定的;在服务器上有代码的人通常没有代码,服务器管理器也不会安装代码。无论XDebug是否存在,我们的解决方案都有效。我不确定我是否理解您对“依赖性…如果代码要发布到野外”的反对意见。我们的仪器是暂时的;不需要保存或运送。提供您的原始代码。您的工具看起来非常好,但(缺少更好的文字)似乎比xdebug更难获得,因为它似乎只是Windows,而且上面有一个价格标签。同样的道理,“无论PHP测试覆盖率工具是否存在,xdebug都能工作”。无意冒犯,+1真的。很难与免费竞争(尽管质量可能会有所不同)。但即使是Zend也靠向人们收费谋生。
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

}