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