PHP代码覆盖率统计详解_php技巧

来源:脚本之家  责任编辑:小易  

大家都知道sonar是个好东东,在有CI支持的情况下,使用好了可以非常好的控制代码的质量,诸如代码覆盖率,代码规则检查等。而解决violation的办法,除了正统的修改代码来满足规则外,还有一个变通的方法,NOSONAR。这个标记本意是在一些特殊情况,有不得已的理由不得不违反规则,为了避免sonar继续报错而不得已做了一个"变通。NOSONAR本意虽好,但要是有人滥用,变通就会变成取巧,因为解决sonar violation的最简单的方法,就是直接NOSONAR!当问题很简单时,一般人都会选择正常的方式修改代码,如果只是举手之劳基本上还是能遵守规则的。但是当问题复杂时,或者说当解决问题不再是举手之劳时,每个人都要受到NOSONAR的诱惑。而NOSONAR的底线在哪里?没有人定义,没有人检测,自然不会每个人都坚守,NOSONAR的底线随着一个一个的NOSONAR慢慢的在降低。退五十步的人,是没有资格笑百步的。返回到现实代码中,不知道是大家都没有顶住诱惑,还是说我们开启的规则不大合理,总之越来越频繁的在代码中看到NOSONAR了,虽然还没有到泛滥的地步,但是已经让我有些不安了。简单搜索了一下刚才让我感觉到很多NOSONAR的project,结果是58个。更糟糕的是,每个NOSONAR后面都不会带有注释说明为什么要NOSONAR,因此一个个飞舞的NOSONAR就变成了一个个谜团。想知道为什么要NOSONAR吗?恩,你猜.我没有办法去检查这个58个NOSONAR是不是都合理的,都站得住脚的。出于程序员的习惯,对于一切不可确认性都报以怀疑的眼光和质疑的姿态,我总觉得这58个NOSONAR让我总是没有底,每次我看到sonar上100%的规则检测通过率时,我总是禁不住在心里浮现NOSONAR的字样www.zgxue.com防采集请勿采集本网。

一 安装php环境

因此,在运行单元测试时,只有在已关闭代码覆盖率数据收集功能,或者当您希望对其他项目进行检测以收集它们的代码覆盖率数据时,才需要执行获取代码覆盖率数据中的步骤。测试运行完成后,即可查看代码覆盖

二 统计php代码覆盖率

使用emma统计代码执行覆盖率: 使用 emma 2.1(emma-stable-2.1.5320-lib)1.新建/home/q/java/emmalib 目录,将emma.jar 与 emma_ant.jar 放入 2.复制/server/bin/mobileserver/runServer.sh 到

1 需要安装xdebug

软件测试覆2113盖率 覆盖率=(至少被执行一次的item数)/item的总数5261 语句覆盖率4102=(至少被执行一次的语句数量1653)/(可执行的语句总数) 判定覆盖率=(判定结果被评价的次数)/(判定结果总数)

安装步骤:

单元测试关注代码覆盖率 系统测试、集成测试关注功能覆盖率,不能统计代码覆盖率了

//www.zgxue.com/article/116419.htm

各年的森林覆盖率是没有的,因为一年时间无法调查出森林覆盖率。我国从1973年开始执行全国森林资源清查,至今已有8次了。其中除了1981—1983年未统计外,其他均进行了统计,只有第一次,即1973—

测试环境 LNMP 军哥一键包1.3版本 PHP 7.0.7 Xdebug 2.6

配置步骤

git clone git://github.com/xdebug/xdebug.gitcd xdebugfind / -name phpize/usr/bin/phpizefind / -name php-config./configure --enable-xdebug --with-php-config=/usr/local/php/bin/php-configmakemake install

开启扩展

find / -name php.inivi /usr/local/php/etc/php.ini添加 extension=xdebug.so[Xdebug]xdebug.collect_params=onxdebug.collect_return=onxdebug.remote_autostart=onservice restart php-fpm

成功验证:①在linux输入php -version,如下:

②访问index.php(phpinfo())

2 安装composer

curl -sS https://getcomposer.org/installer | phpphp composer.phar --versionComposer version 1.6.5 2018-05-04 11:44:59

3 安装phpcov 和 phpunit

此处选了phpunit 6.5.0 和phpcov 4.0.8,编辑composer.json文件(phpcov是根据phpunit自动匹配的,php和phpunit对应关系可百度或看底部)

#composer.json{ "name": "root/php-code-coverage", "require-dev": { "phpunit/phpunit":"6.5.0", "phpunit/phpcov": "*"}

执行命令安装 php composer.phar install

安装完成后校验 如下即可(phpunit和phpcov一定要在这个目录下使用)

vendor/bin[root@mt-jry-01 bin]# lllrwxrwxrwx 1 root root 24 Jul 13 10:22 phpcov -> ../phpunit/phpcov/phpcovlrwxrwxrwx 1 root root 26 Jul 13 10:21 phpunit -> ../phpunit/phpunit/phpunit[root@mt-jry-01 bin]# .vendor/bin/phpunit --versionPHPUnit 6.5.0 by Sebastian Bergmann and contributors. [root@mt-jry-01 bin]# .vendor/bin/phpcov --versionphpcov 4.0.5 by Sebastian Bergmann.

4 编写测试代码

#userinfo.php<?phpinclude_once("*****/prepend.php"); $id = $_POST["user_id"];if ($id != 10086){ exit();}$userinfo = array( 'username'=>'jason', 'password'=>'123456',);$result = array( 'code'=>10000, 'message'=>"success", 'data'=>$userinfo, );echo json_encode($result);

#prepend.php<?phprequire_once dirname(__FILE__).'/vendor/autoload.php'; # 在composer生成的vender同级目录use SebastianBergmann\CodeCoverage\CodeCoverage;$coverage = new CodeCoverage; $coverage->filter()->addDirectoryToWhitelist('/var/www/html/userinfo.php'); # 白名单<br>$coverage->filter()->removeDirectoryFromWhitelist('/var/www/html/userinfo.php'); # 从白名单中移除文件夹<br>$coverage->filter()->removeFileFromWhitelist('/var/www/html/userinfo.php'); # 从白名单中移除文件

$coverage->start('<Site coverage>');#开始统计register_shutdown_function('__coverage_stop',$coverage);#注册关闭方法 function __coverage_stop(CodeCoverage $coverage){ $coverage->stop();#停止统计 $cov = '<?php return unserialize(' . var_export(serialize($coverage), true) . ');';#获取覆盖结果,注意使用了反序列化 //echo $cov; file_put_contents(dirname(__FILE__).'/cov/site.' . date('U') .'.'.uniqid(). '.cov', $cov);#将结果写入到文件中} 若多个域名或者接口请求要在同一个prepend文件里分别统计,在新建$coverage前加if条件即可,如if(strpos($_SERVER['HTTP_HOST'],'www.baidu.com') === true){}

5 测试

执行命令

[root@mt-jry-01 html]# curl -d "user_id=10086" "127.0.0.1/userinfo.php"{"code":10000,"message":"success","data":{"username":"jason","password":"123456"}}

查看prepend.php统计目录cov下

-rw-r--r-- 1 apache apache 4609 Jul 13 14:45 site.1531464305.5b484a71c0a1c.cov

生成xml或者html报告命令如下:

./vendor/bin/phpcov merge --clover cov/coverage.xml cov/ -vvv # 在cov目录下生成xml报告./vendor/bin/phpcov merge --html="cov/coverage_html" cov/ -vvv # 在cov目录下生成html报告 

6 查看报告结果

8 工程配置

在实际项目中有三种配置方式

    在php.ini中引入prepend文件:auto_prepend_file = /***/prepend.php (配置后重启php) --- 所有php请求均会预加载该文件,文件有错误时影响整个php服务 在文件入口文件中引入prepend文件:include_once(/www/***/prepend.conf); (一般为index.php) --- 效果同3,重新部署清掉配置 在nginx.conf中引入prepend文件 --- 对于该域名的请求会加载该文件(配置后重启nginx)

location ~ .*\.php?${ fastcgi_pass 127.0.0.1:9200; fastcgi_index index.php; include common/fastcgi.conf; fastcgi_param MY_ENV pre; fastcgi_param PHP_VALUE 'auto_prepend_file=/www/data/phpcoverage/prepend.php';} 

7 问题:

① 开始使用的phpcov 2.0.2 & phpunit 4.8.7 生成的报告数据全为0 - phpunit4 不能支持 php7,对应版本见⑦

② 开始总是报错PHP Fatal error: Uncaught Error: Class 'SebastianBergmann\CodeCoverage\CodeCoverage' not found in

是因为没有引用vender目录,在prepend.php里加一句require_once dirname(__FILE__).'/vendor/autoload.php'; 即可

③ 配置nginx

④ 请求域名没有生成site文件:请求权限不够,不能在对应目录下写文件

chmod 777 -R 域名请求是apache权限,如果与cov文件夹权限不一致则不可写入

⑤ 生成覆盖率文件有要统计的代码文件,但是命中情况count全为0,有两种可能

A xdebug的collect_param 与collect_return没打开,导致未收集到数据,需要在php.ini里配置

B 如果在php.ini里配置了auto_prepend_file=‘**/prepend.php',则只有用指定目录下的prepend.php文件才能生成覆盖率数据,否则覆盖行全为0

⑥ 将xml报告集成到jenkins

注意:go 和 c++ 的xml报告可以用 Cobertura 统计到jenkins展示,php 的要用Clover PHP 插件统计,phpcov生成的xml格式Cobertura解析不了会报错

⑦ php 和 phpunit 的对应关系https://phpunit.de/supported-versions.html

⑧ 问题:观察每日构建的覆盖率,在代码未更新,用例未更新的前提下,覆盖率降低

    该方式统计的代码总行数变化,与之前不一致 -- 实际两天的代码完全一致 同一个文件的覆盖行数不一致,发现会出现同一个分支中,上下行未覆盖,而中间行覆盖 和 空行被覆盖(空白行 绿色,鼠标放置提示 1test covers..)的

原因:猜测是 xdebug 统计抽风,因为 xdebug 负责收集统计代码,phpunit phpcov只是汇总整理为可读报告。

解决:暂不能解决,可观察xdebug和phpcoverage官网有类似问题

⑨ jenkins 配置

cur_path=`pwd`echo ${cur_path} # 删除历史cov文件,保证覆盖率干净find /www/data/phpcoverage/admin_cov/ -name "site*" | xargs rm -rfrm -rf ${cur_path}/reports/* #在工程入口文件引入 prepend 文件sed -i '2cinclude_once("/www/data/phpcoverage/prepend.php");' /www/my_project/index.php # 更新自动化用例并执行用例source /www/data/project3/venv/bin/activategit checkout mastergit pullpython run.py # 统计html和xml报告,html更易读,xml更直观反映历史情况cd /www/data/phpcoverage./vendor/bin/phpcov merge --clover ${cur_path}/reports/coverage.xml admin_cov/ -vvv./vendor/bin/phpcov merge --html="${cur_path}/reports/coverage_html" admin_cov/ -vvv # 从入口文件删除引用sed -i '2c//' /www/my_project/index.php

https://github.com/sebastianbergmann/phpcov

到此这篇关于PHP代码覆盖率统计详解的文章就介绍到这了,更多相关PHP代码覆盖率内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

PHP 单元测试2113 为文件或文件夹创建5261 PHPUnit 测试和 Selenium 测试用例,运行测试,并查看4102测试结果。您可1653以定义测试组以便有选择地对其运行单元测试。在 PHPUnit 属性中,您可以定义定制 XML 配置文件、提供命令行选项的引导文件或定制测试套件,也可以让 IDE 生成框架代码。使用快捷键可以在测试与测试类之间快速导航。NetBeans IDE 7.2 引入了对 PHPUnit 框架生成器和对项目特定的 PHPUnit 脚本的支持,1. XdebugXdebug是PHP的一个扩展,了解2113PHP的同学5261一定不会对它陌生,非常强悍的调4102试助手,默认并没有开启,1653需要另外安装,不过多数情况下只需要在php.ini配置文件中开启即可。成功开启Xdebug后,我们便可以在程序中使用以下几个函数:xdebug_start_code_coverage()    // 作用为开始统计覆盖率xdebug_get_code_coverage()      // 作用为获取当前已统计信息xdebug_stop_code_coverage()     // 作用为结束覆盖率统计2. PHPUnit属于XUnit家族系列,用于对php代码进行单元测试,基于Xdebug可以方便快捷的对代码进行覆盖率测试,并生成直观的报表。3. codespycodespy是纯php开发的轻量级覆盖率统计工具,并不依赖Xdebug。只需要在被测试代码前引入其库文件,便会自动在脚本执行完毕后生成测试报告。该工具是github上托管的开源工具。4. Pika河图上的工具,特色是支持手工测试和生存周期控制,详情。其大致原理为在测试机安装并运行Pikagent程序,其可以与服务器进行交互,QA能够通过服务器的web界面控制整个测试流程。Xdebug适用于测试需求复杂的大型项目,例如函数覆盖、类覆盖等,同时其也很容易与第三方工具交互;PHPUnit主要用于模块的单元测试,同时其规范的case管理也适合大型项目;codespy以其轻量级与简单易扩展,能够胜任大多数的小项目的覆盖率测试需求。本回答被网友采纳内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • 使用phpunit进行单元测试并生成代码覆盖率报告的方法
  • php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
  • 浅析thinkphp中的pathinfo模式和url重写
  • php往mysql中批量插入数据实例教程
  • php使用number_format函数截取小数的方法分析
  • php下实现一个阿拉伯数字转中文数字的函数
  • [企业公众号]升级到[企业微信]之后发送消息失败的解决方法
  • php云打印类完整示例
  • 用c/c++扩展你的php 为你的php增加功能
  • 浅谈php中output_buffering
  • php将日期格式转换成xx天前的格式
  • php代码覆盖率检查工具有哪些
  • 如何使用sonar进行代码覆盖率检测
  • 使用lcov 统计覆盖率结果报错gcno version '408' prefer '406'
  • 测试覆盖率有哪几种统计方式
  • 如何:获取代码覆盖率数据
  • 如何使用emma统计代码执行覆盖率
  • 软件测试中执行覆盖率怎么计算。
  • 进行软件测试时,哪种情况下可以统计代码覆盖率
  • 从2001年起到2010年这十年各年的森林覆盖率是多少呀
  • 测试用例应该注意什么?如何保证高的覆盖率
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全php基础php技巧php实例php文摘php模板首页php编程php技巧使用phpunit进行单元测试并生成代码覆盖率报告的方法php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo浅析thinkphp中的pathinfo模式和url重写php往mysql中批量插入数据实例教程php使用number_format函数截取小数的方法分析php下实现一个阿拉伯数字转中文数字的函数[企业公众号]升级到[企业微信]之后发送消息失败的解决方法php云打印类完整示例用c/c++扩展你的php 为你的php增加功能浅谈php中output_bufferingphp将日期格式转换成xx天前的格式php中json_decode()和json_encodphp 数组和字符串互相转换实现方php中使用curl实现get和post请求php中iconv函数使用方法php日期转时间戳,指定日期转换成php 页面跳转到另一个页面的多种php中文处理 中文字符串截取(mb_php下intval()和(int)转换使用与利用phpexcel实现excel数据的导入phpmyadmin 配置文件详解(配置)用php函数解决sql injectionphp计算整个目录大小的方法mysql+php分页类(已测)php ob_flush,flush在ie中缓冲无效的解决详细对比php中类继承和接口继承让php支持断点续传的源码php+mysql存储数据常见中文乱码问题小结用穿越火线快速入门php面向对象php数组无限分级数据的层级化处理代码php导出mysql数据到excel文件(fputcsv)
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved