php-code-coverage

https://github.com/sebastianbergmann/php-code-coverage
https://github.com/sebastianbergmann/php-code-coverage/blob/master/src/CodeCoverage.php



https://github.com/sebastianbergmann/php-code-coverage/blob/master/src/CodeCoverage.php



http://php-coveralls.github.io/php-coveralls/



https://github.com/php-coveralls/php-coveralls

https://phpunit.readthedocs.io/zh_CN/latest/code-coverage-analysis.html



常用的单元测试工具都有代码覆盖率工具,但是当我们想统计接口测试覆盖率可能有些困难。



一般需要借助xdebug的覆盖率功能再配合一些统计展示工具。



常用工具:



1、codeception远程统计覆盖率:https://codeception.com/docs/11-Codecoverage Remote Server 工具成熟对依赖较多



2、PHPCodeCoverage https://github.com/cj58/PHPCodeCoverage 无依赖,使用方便、缺少统计报表



3、php-code-coverage https://github.com/sebastianbergmann/php-code-coverage phpunit底层支持,报表形式丰富,需做二次开发以支持远程监测



综合比较后决定基于php-code-coverage进行二次开发以满足我们的需求



需要我们自己做的部分包括:



1、服务器安装xdebug



2、服务器上安装修改后的php-code-coverage,配置php.ini内的auto_prepend_script



在php-code-coverage上进行一下工作



1、提供一个auto_prepend_script



提供根据配置文件内域名及开关开启记录覆盖率的功能
提供生成报告功能
提供归档报告功能
根据域名对统计进行区分
可以根据域名做目录排除
2、提供一个配置界面及报告查看界面



对域名及域名的配置进行关管理
对生成和归档的报告进行管理查看



项目github地址:https://github.com/chujilu/ServerPHPCodeCoverage



其他注意事项:



注入的php代码要尽量精简,



引入的自动加载要及时清除,



使用的变量也要及时清除,



控制内存占用大小



加入的目录尽量精简,避免目录太多造成响应太慢



目录变量很耗费性能,在遍历目录时尽量使用缓存



保存历史数据尽量使用内存缓存,提高数据处理速度



多服务器实现思路



项目包含两部分一部分是采集代码inject.php,剩余代码为展示与分析部分。可通过修改inject.php保存数据部分代码,将数据异步上传到一台集中服务器中。



在集中服务器上加载数据文件,生成报表。



也可以把数据保存到数据库、redis内,这样就可以做到实时多服务器分析。



https://www.it603.com/js/91.mhtml



https://testerhome.com/articles/20116



https://blog.csdn.net/galen2016/article/details/82791856
https://www.cnblogs.com/zhaoxd07/p/9049707.html
https://github.com/woojean/PHPCoverage
https://cloud.tencent.com/developer/section/1345494



Xdebug’s code coverage functionality is often used in combination with PHP_CodeCoverage as part of PHPUnit runs. PHPUnit delegates the code coverage collection to Xdebug. It starts and stops code coverage through xdebug_start_code_coverage() and xdebug_stop_code_coverage() for every test, and uses xdebug_get_code_coverage() to retrieve the results.



https://xdebug.org/docs/code_coverage



It is therefore important to set-up the filter before the code is included/required. This currently can be best done through an auto-prepended file through PHP’s auto_prepend_file setting.



To set-up a filter that only does code coverage analysis for the src/ folder, you would call xdebug_set_filter() with:



<?php
xdebug_set_filter(
XDEBUG_FILTER_CODE_COVERAGE,
XDEBUG_PATH_WHITELIST,
[ DIR . DIRECTORY_SEPARATOR . “src” . DIRECTORY_SEPARATOR ]
);
?>



php -dauto_prepend_file=xdebug_filter.php yourscript.php
Or in combination with PHPUnit, when installed through Composer, with:



php -dauto_prepend_file=xdebug_filter.php vendor/bin/phpunit



https://www.php.net/manual/en/ini.core.php#ini.auto-prepend-file



auto_prepend_file string
Specifies the name of a file that is automatically parsed before the main file. The file is included as if it was called with the require function, so include_path is used.



auto_prepend_file string
Specifies the name of a file that is automatically parsed before the main file. The file is included as if it was called with the require function, so include_path is used.



The special value none disables auto-prepending.



Xdebug 的代码覆盖功能经常和 PHP_CodeCoverage 结合使用,用做 PHPUnit 运行的一部分。PHPUnit 将代码覆盖率收集委托给 Xdebug。它通过 xdebug_start_code_coverage() 和 xdebug_stop_code_coverage() 为每个测试开启和停止代码覆盖,使用 xdebug_get_code_coverage() 来取出结果。



代码覆盖的主要输出是一个数组,详细说明在运行代码覆盖集合活跃的代码时,哪些文件哪些行被“击中”。 但代码覆盖功能还可以在产生额外性能影响的情况下,分析哪些代码行上有可执行代码,哪些代码行实际可以被命中(无用代码分析),还可以进行检测以找出函数和方法中的哪些分支和路径被追踪。xdebug_start_code_coverage() 函数记录了各种选项。



过滤
Xdebug 2.6 引入了代码覆盖的过滤功能。使用过滤器在代码覆盖率收集期间你可以通过白名单包括,或通过黑名单排除,被分析的路径或类名前缀。一个典型的用例是将过滤器配置为只包含 src/ 文件夹,以便 Xdebug 的代码覆盖率分析不会尝试分析测试,Composer 依赖项或 PHPUnit / PHP_CodeCoverage 本身。 如果正确配置过滤器,则可以预期代码覆盖率运行速度提高2倍 [1, 2, 3].



过滤器的工作原理是根据配置的过滤器标记每个可执行单元(函数,方法,文件)。 Xdebug 只在特定可执行单元第一次被 include/require 时才这样做,因为 PHP 第一次解析和编译一个文件时才会发生过滤。 Xdebug 需要在这时这样做,也是因为当这时它会分析哪些路径能运行,可执行单元的哪些行不能执行。在这时标记可执行单元,也意味着比如 Xdebug 想要计算包含在代码覆盖中的行时不必每一次运行过滤器。 因此,在代码被 include/require 之前设置过滤器非常重要。目前最好使用 PHP 的 auto_prepend_file 设置通过自动前置文件来完成。



http://xdebug.org.cn/docs/code_coverage



https://weizhimiao.github.io/2016/10/22/Xdebug%E4%B9%8B%E4%BB%A3%E7%A0%81%E8%A6%86%E7%9B%96%E7%8E%87%E5%88%86%E6%9E%90/



https://www.cnblogs.com/xiaoyaoxia/archive/2011/01/20/xdebug.html



我可以通过在php.ini中添加以下配置来生成cachegrind.out文件:



xdebug.profiler_enable_trigger=1
xdebug.profiler_output_dir=/var/log/xdebug_profiler
xdebug.profiler_output_name=cachegrind.out
xdebug.profiler_append=1
xdebug.coverage_enable=1



https://www.codenong.com/28120280/



xdebug通过插入代码完成代码执行统计,其实不然,xdebug的原理如下:



1、执行PHP脚本



2、XDEBUG在Module_init中重写每种OPCODE的处理函数



3、PHP编译PHP到OPCODE



4、Zend引擎开始执行OPCODE



5、调用Xdebug的OPCODE处理函数,获取文件和行号信息,统计。



6、返回ZEND_USER_OPCODE_DISPATCH,表示需要执行原生的Zend的处理函数



#defineZEND_USER_OPCODE_DISPATCH 2 /* calloriginal opcode handler */



7、执行原生的Zend的处理函数



xdebug来测试覆盖率,只需要两三个函数即可,如下:



xdebug_start_code_coverage(); //开始收集代码行覆盖情况



xdebug_get_code_coverage(); //获取截至目前所跑过的代码文件名和行号



xdebug_stop_code_coverage(); //停止收集代码行覆盖情况
https://www.cnblogs.com/xuning/p/4950110.html



https://www.infoq.cn/article/cH2UjY0vNlQ5FuUpaWiz



https://testerhome.com/topics/15866



http://smilejay.com/2012/10/code-coverage-tools/
c/c++: gcc+gcov+lcov;(单元测试:CUnit、CPPUnit、Google GTest等)
Java : Maven cobertura 插件,Clover,EMMA,Jtest;
Python: PyUnit + coverage.py;
PHP: phpunit + –coverage-html + Xdebug ;
Perl: Test::Class 和 Devel::Cover;
Shell: shUnit2 + shcov;



https://github.com/babymark/PHPCoverage



Category php