用例:我正在尝试为我的单元测试框架创建一个诊断测试,该框架运行每个测试用例,然后返回尚未被测试用例覆盖的公共方法列表。这个想法是通过确保每个方法的所有公共方法都被至少一个单元测试测试来增加测试覆盖率。
问题:我在检测一个类的方法是否被调用时遇到麻烦。我尝试过使用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
}
请参阅PHP代码覆盖工具,Xdebug 2:代码覆盖分析和Sebastian Bergmann的PHP_CodeCoverage,了解解决问题的一些常见方法。
你想要的通常是从外部观察php完成的。使用debug_backtrace()
既慢又慢,正如您自己所说,不能完全依赖,因为您真的想要一个不修改php脚本的任何行为的监视器(例如,在回溯中包括您的测试方法)。
查看我们的PHP测试覆盖工具。它在程序运行时收集测试覆盖率数据,而不使用xdebug。它是通过在您的代码中临时插入插装来实现的,例如,在测试过程的持续时间内。
您得到测试覆盖率数据,可以在一个漂亮的UI中显示在代码上,因此您可以看到覆盖了什么(另一个OP指出可能会执行a方法,但没有有效地覆盖)。您还会得到一个报告,指出没有覆盖的内容,这与代码的层次结构相匹配。它的XML版本包含您想要的信息:某个方法是否被覆盖,以及覆盖的程度。