Unit testing Codeigniter API调用的PHPUnit/Xdebug代码覆盖率

Unit testing Codeigniter API调用的PHPUnit/Xdebug代码覆盖率,unit-testing,codeigniter,phpunit,code-coverage,xdebug,Unit Testing,Codeigniter,Phpunit,Code Coverage,Xdebug,我们使用Codeigniter,有2个选项可以调用我们的API控制器: 我们可以使用通过Curl调用控制器url的客户端, 我们可以使用从命令行调用控制器的客户端。 这对于我们网站的功能来说是非常好的。但是,当我运行PHPUnit时,控制器的覆盖率报告为空,而所有模型的覆盖率报告都是正确的 在跟踪xdebug如何创建报告时,使用基于Curl的客户端或CLI客户端似乎在测试函数的范围之外被调用,因此xdebug_get_code_coverage不会跟踪执行的控制器代码 是否可以配置xdebug来

我们使用Codeigniter,有2个选项可以调用我们的API控制器:

我们可以使用通过Curl调用控制器url的客户端, 我们可以使用从命令行调用控制器的客户端。 这对于我们网站的功能来说是非常好的。但是,当我运行PHPUnit时,控制器的覆盖率报告为空,而所有模型的覆盖率报告都是正确的

在跟踪xdebug如何创建报告时,使用基于Curl的客户端或CLI客户端似乎在测试函数的范围之外被调用,因此xdebug_get_code_coverage不会跟踪执行的控制器代码

是否可以配置xdebug来识别此场景中的代码覆盖率?可以在PHPUnit测试功能范围内调用Codeigniter控制器吗?还有其他可能的解决办法吗

另一种选择:查看我们的工具

它不使用xdebug来收集覆盖率数据,因此不会出现xdebug的特定问题。它插入脚本以收集测试覆盖率数据;一旦插入指令,无论脚本如何执行,都将获得测试覆盖率数据。 仪器是临时的;一旦你完成了测试,你就把测试过的代码扔掉了 测试覆盖率收集数据,因此不会影响生产代码库。 这种方法确实需要显式地列出需要覆盖率数据的所有PHP脚本;如果你愿意,你可以忽略一些。通常不值得费心;大多数用户只是列出所有PHP脚本。

另一种选择:查看我们的工具

它不使用xdebug来收集覆盖率数据,因此不会出现xdebug的特定问题。它插入脚本以收集测试覆盖率数据;一旦插入指令,无论脚本如何执行,都将获得测试覆盖率数据。 仪器是临时的;一旦你完成了测试,你就把测试过的代码扔掉了 测试覆盖率收集数据,因此不会影响生产代码库。
这种方法确实需要显式地列出需要覆盖率数据的所有PHP脚本;如果你愿意,你可以忽略一些。通常不值得费心;大多数用户只需列出所有PHP脚本。

是的,这很容易做到。有关详细信息,请参阅

基本上,您在web根目录中放置了一些特殊文件:

PHPUnit_Extensions_SeleniumTestCase可以收集通过Selenium运行的测试的代码覆盖率信息: 将PHPUnit/Extensions/SeleniumTestCase/PHPUnit_coverage.php复制到Web服务器的文档根目录中。 在Web服务器的php.ini配置文件中,分别将PHPUnit/Extensions/SeleniumTestCase/prepend.php和PHPUnit/Extensions/SeleniumTestCase/append.php配置为auto_prepend_文件和auto_append_文件。 在扩展PHPUnit_Extensions_SeleniumTestCase的测试用例类中,使用protected $coverageScriptUrl='1!'http://host/phpunit_coverage.php'; 为phpunit_coverage.php脚本配置URL


当使用GET参数PHPUNIT\u SELENIUM\u TEST\u ID运行URL时,会跟踪覆盖率信息,PHPUNIT可以通过请求覆盖率脚本URL来收集它。

是的,这很容易实现。有关详细信息,请参阅

基本上,您在web根目录中放置了一些特殊文件:

PHPUnit_Extensions_SeleniumTestCase可以收集通过Selenium运行的测试的代码覆盖率信息: 将PHPUnit/Extensions/SeleniumTestCase/PHPUnit_coverage.php复制到Web服务器的文档根目录中。 在Web服务器的php.ini配置文件中,分别将PHPUnit/Extensions/SeleniumTestCase/prepend.php和PHPUnit/Extensions/SeleniumTestCase/append.php配置为auto_prepend_文件和auto_append_文件。 在扩展PHPUnit_Extensions_SeleniumTestCase的测试用例类中,使用protected $coverageScriptUrl='1!'http://host/phpunit_coverage.php'; 为phpunit_coverage.php脚本配置URL


当使用GET参数PHPUNIT\u SELENIUM\u TEST\u ID运行URL时,会跟踪覆盖率信息,PHPUNIT可以通过请求覆盖率脚本URL来收集该信息。

您仍然需要修改代码库。除此之外,这不是您想说的xdebug问题。@cweiske:OP特别问,还有其他解决方案吗?@cweiske:您不必修改代码库。该工具生成您运行的插入指令的副本,该副本具有与原始代码完全相同的功能,但也收集测试覆盖率数据。运行插入指令的版本,然后将其丢弃。您的原始版本不会用手触摸或修改。每一个脚本都需要几秒钟的时间来编写,这个过程是自动化的,而且非常可靠,因为它是在PHP前端这样的编译器上构建的。您仍然需要修改代码库。除此之外,这并不是你想说的xdebug问题。@cweiske:OP特别问过,有什么问题吗
其他解决方案?@cweiske:您不必修改代码库。该工具生成您运行的插入指令的副本,该副本具有与原始代码完全相同的功能,但也收集测试覆盖率数据。运行插入指令的版本,然后将其丢弃。您的原始版本不会用手触摸或修改。为您拥有的每个脚本插入指令只需几分之一秒,该过程是自动化的,而且非常可靠,因为它构建在类似PHP前端的编译器上。