PHP覆盖率测试工具小结

一、写在最前

这篇文档是我对之前一段时间工作的总结和分享,自己也是第一次涉猎这方面的知识,肯定有遗漏和偏差,甚至“低级错误”,所以想起到抛砖引玉的作用,大家互相分享,共同进步。能够给同学们的工作带来些许启发,我也就很满足了。

二、覆盖率是什么?它能反映什么?

简单的说,覆盖率通常是指程序的执行过程中(即一个case),已执行的代码与可执行的代码的比值(或者与总代码行数的比值)。它能够从一个侧面反映出case的质量,即case是否做到对代码的完全覆盖。

三、PHP如何测试覆盖率?

1. Xdebug

Xdebug是PHP的一个扩展,了解PHP的同学一定不会对它陌生,非常强悍的调试助手,默认并没有开启,需要另外安装,不过多数情况下只需要在php.ini配置文件中开启即可。成功开启Xdebug后,我们便可以在程序中使用以下几个函数:

xdebug_start_code_coverage()    // 作用为开始统计覆盖率
xdebug_get_code_coverage()      // 作用为获取当前已统计信息
xdebug_stop_code_coverage()     // 作用为结束覆盖率统计

下面是个简单的例子:

<?php
  xdebug_start_code_coverage();
  // 注释、空行不会统计
  echo ‘hello world!‘;
  if ( false ) {
      echo "here is wrong\n";
  } else {
      echo "here is rigth\n";
  }
  $data = xdebug_get_code_coverage();
  xdebug_stop_code_coverage();
  // stop之后也不会统计

$data中保存了覆盖率信息,结果为:

1 (
2     [/Users/liufuxin/www/mars/index.php] => Array
3         (
4             [4] => 1
5             [6] => 1
6             [9] => 1
7             [12] => 1
8         )
9 )

可以看到,$data中保存了文件的相关信息,文件中第4、6、9、12行代码此次被执行了(状态码1表示执行)。本质上来说,基于这些信息,我们便可以统计代码的覆盖率了。各种框架也大多是基于Xdebug所获得的信息进行深加工。

但Xdebug的功能远非如此,再简单介绍下Xdebug的其他几个常用功能:

1.1 获取当前运行的文件、行号以及方法

<?php
    function fix_string() {
        echo "Called @ ".
        xdebug_call_file() . ":" .
        xdebug_call_line() . " from " .
        xdebug_call_function();
    }
fix_string();

// out : Called @ /Users/liufuxin/www/mars/index.php: 8 from {main}

1.2 获取程序当前已运行时间

<?php
    echo xdebug_time_index(), "\n";
    for ($i = 0; $i < 250000; $i++) {
        // do nothing
    }
    echo xdebug_time_index();
?>

// out // 0.0014429092407227// 0.015676975250244

1.3 追踪代码执行路径

可以在Xdebug的配置中将xdebug.auto_trace设置为on开启该功能,或者在程序中使用函数组xdebug_start_trace()和xdebug_stop_trace()来指定追踪的代码段。会自动在配置的输出目录中生成追踪文件,更多配置

1.4 Xdebug输出文件解析

当开启Xdebug后,会在指定的目录生成以“cachegrind.out.”开头的程序运行信息文件。它大致看起来是这样的:

version: 1
creator: xdebug 2.2.3
cmd: /Users/liufuxin/www/mars/index.php
part: 1
positions: line
events: Time
fl=php:internal
fn=php::xdebug_time_index
2 2
fl=php:internal
fn=php::xdebug_time_index
6 0

这时候我们就需要一些解析工具,推荐使用PHP实现的解析器webgrind,它安装简单,从浏览器打开后会自动探测xdebug输出目录,然后输出解析结果:

可以清楚的看到程序执行过程中涉及的函数与其执行次数、耗时等基本信息。

2. PHPUnit

属于XUnit家族系列,用于对php代码进行单元测试,基于Xdebug可以方便快捷的对代码进行覆盖率测试,并生成直观的报表。看以下一个简单的例子,

准备两个类文件,BankAccount与对应的测试类BankAccountTest,代码如下:

<?php
    class BankAccount {
        protected $balance = 0;
        public function getBalance() {
            return $this->balance;
        }
        protected function setBalance($balance) {
            if ($balance >= 0) {
                $this->balance = $balance;
            } else {
                throw new BankAccountException;
            }
        }
    }
?>
<?php
    require_once ‘BankAccount.php‘;

    class BankAccountTest extends PHPUnit_Framework_TestCase {
        protected $ba;
        protected function setUp() {
            $this->ba = new BankAccount;
        }
        public function testBalanceIsInitiallyZero() {
            $this->assertEquals(0, $this->ba->getBalance());
        }
    }
?>

然后在终端使用phpunit命令执行测试文件,并指定为html输出格式和输出文件report。

phpunit --coverage-html ./report BankAccountTest.php

执行完毕后,通过浏览器查看report文件,便可以清晰的查看代码执行情况:

更多信息

3. codespy

与之前介绍的工具不同,codespy是纯php开发的轻量级覆盖率统计工具,并不依赖Xdebug。只需要在被测试代码前引入其库文件,便会自动在脚本执行完毕后生成测试报告。该工具是github上托管的开源工具(github大法好!)。这次我们以常用的PHP框架Thinkphp为例,在入口文件中引入库文件,同时进行一次API访问,查看生成的测试报告。入口文件如下:

<?php
    include ‘codespy.php‘;
    \codespy\Analyzer::$outputdir = ‘/Users/liufuxin/www/codespy‘;
    \codespy\Analyzer::$outputformat = ‘html‘;

  if(version_compare(PHP_VERSION,‘5.3.0‘,‘<‘)) {
    die(‘require PHP > 5.3.0 !‘);
  }
  define(‘APP_DEBUG‘,true);    define(‘NO_CACHE_RUNTIME‘,True);
  require ‘./protected/ThinkPHP/ThinkPHP.php‘;
?>

Codespy使用起来非常方便,只需将库文件包含进来,同时设置报告的格式以及输出目录即可。然后我们访问API,查看报告。下图是本次访问所涉及的全部文件,大部分为框架代码:

我们只关注访问API的情况,点击具体Action查看详情:

可以看出来,报告高亮的显示了执行的代码,以及两个维度的覆盖率,即6.78%的语句覆盖率(statement coverage)与2%的行覆盖率(line coverage)。

更多信息

4. PHPCoverage

河图上的工具,应用场景主要为满足页面级自动化测试,统计覆盖信息并生成报告,详情。可惜的是并没有提供任何文档,接口人也已离职,代码始终无法正常运行,不过通过查看其源代码,可以发现这个工具是基于phpcoverage这个开源项目进行的二次开发。需要依赖Xdebug和XML_Parser两个扩展。

5. Pika

同样为河图上的工具,特色是支持手工测试和生存周期控制,详情。其大致原理为在测试机安装并运行Pikagent程序,其可以与服务器进行交互,QA能够通过服务器的web界面控制整个测试流程,如下图所示:

详细阅读了该项目从最初的调研,到后期各种会议的文档,项目最早的目标便是实现百度PHP代码的覆盖率测试工具,希望能够结合手动与自动两种工作方式,同时实习测试周期的可控,即报告中可以包含多个case的运行情况。

但目前核心的中控机也已无法访问,项目也宣布停止维护,比较可惜,不过从他的文档中也可以吸收不少借鉴,比如对我厂及国内当时PHP覆盖率方面的调研(2009年),关于报告生成、性能优化、交互设计等都有一定的讨论和记录。

四、主要方案比较

1、方案总体比较


方案


缺点


优点


Xdebug


1. 需要额外安装扩展

2. 输出解析复杂


1. 性能最优

2. 代码插入灵活

3. 功能丰富


PHPUnit


1. 需要额外安装扩展

2. 必须使用PHPUnit框架重新编写case

3. 只能进行单元测试


1. 规范化

2. 结果解析最优


codespy


1. 运行速度最慢

2. 功能单一


1. 代码插入简单

2. 开源,易于扩展

2、性能对比

更多的时候我们是不希望重新编写case和额外的代码,大家的测试场景也主要集中在API测试,PHPUnit更适合RD进行单元测试,所以本文将通过一个小实验比较下Xdebug和codespy的性能。

首先,我们以Thinkphp为例,计算两者在进行一次覆盖率统计中的耗时。访问一个空置的接口,并统计平均耗时。


方案


实验次数


平均时间(秒)


Xdebug


100


0.05


codespy


100


0.91

从表中可以看到,Xdebug基本不会造成太大的性能损耗,而codespy却有将近20倍的额外耗时!

真的相差这么多?带着疑问,进行了另一个对比测试,这次我们在API中进行一次比较耗时的操作,从远程接口获取数据(几百数量级)解析并写入数据库,结果如下:


方案


实验次数


API耗时(秒)


平均时间(秒)


Xdebug


100


4.42


4.48


codespy


100


4.51


5.41

比较意外,两者的性能损耗并不是线性增长的,Xdebug的时间基本保持在0.05秒左右,而codespy则基本在1秒左右。但是codespy比xdebug性能更差是可以确定的,而codespy在实际生产环境中表现到底如何,会在实际使用过后再作分享。

综上,不同的方案有其所适合的不同场景。Xdebug适用于测试需求复杂的大型项目,例如函数覆盖、类覆盖等,同时其也很容易与第三方工具交互;PHPUnit主要用于模块的单元测试,同时其规范的case管理也适合大型项目;codespy以其轻量级与简单易扩展,能够胜任大多数的小项目的覆盖率测试需求。

五、最后

以上便是我经过调研学习的一点收获,希望能够对大家起到一定作用,欢迎拍砖。另外值得一提的是,刚开始还是想到Hetu上搜搜,结果比较失望,仅有的几个工具不是“年久失修”,就是没有文档,上手困难,希望百度人能够更好的总结分享,维护好我们的知识储备。

六、最最后

下面贴出一些相关的资源,方便大家搭建环境,查阅文档。

PHPUnit安装Mac请看这里,主要介绍PHPUnit如何安装。

PHPUnit实例,PHPUnit的一篇更详细的介绍日志。

PHPUnit在线文档,中文在线文档,非常详细。

Xdebug配置,关于Xdebug的详细配置介绍。

Codespy fork,codespy的github地址。

时间: 2024-10-30 00:54:24

PHP覆盖率测试工具小结的相关文章

多环境多需求并行下的代码测试覆盖率统计工具实现

马蜂窝技术原创内容,更多干货请关注公众号:mfwtech 测试覆盖率常被用来衡量测试的充分性和完整性,也是测试有效性的一个度量.「敏捷开发」的大潮之下,如何在快速迭代的同时保证对被测代码的覆盖度和产品质量,是一个非常有挑战性的话题. 在马蜂窝大交通.酒店等交易相关业务中,项目的开发和测试实践同样遵循敏捷的原则,迭代周期短.速度快.因此,如何依据测试覆盖率数据帮助我们有效判断项目质量.了解测试状态.提升迭代效率,是我们一直很重视的工作. Part.1 测试覆盖率统计中的挑战 对于功能测试而言,通常

Web Service测试工具小汇

最近一直在做WebService的测试,考虑到手工测试的困难,所以特意去寻找好的测试工具,现在做一个整理. 1..NET WebService Studio 这款工具出自微软内部,最大的优点是可视化很好,不用去看那些XML文件,WebService的基础内容就有XML,但是测试中Case过多,每次测试结果都去看XML文件,看一轮下来对个人的视力是个很大的损害. 从上图可以看到,操作上也很方便,只需要把Service部署到IIS后,在WSDL EndPoint中输入这个要测的Service的URL

Python自然语言处理工具小结

Python自然语言处理工具小结 作者:白宁超 2016年11月21日21:45:26 1 Python 的几个自然语言处理工具 NLTK:NLTK 在用 Python 处理自然语言的工具中处于领先的地位.它提供了 WordNet 这种方便处理词汇资源的借口,还有分类.分词.除茎.标注.语法分析.语义推理等类库. Pattern:Pattern 的自然语言处理工具有词性标注工具(Part-Of-Speech Tagger),N元搜索(n-gram search),情感分析(sentiment a

源代码测试工具推荐及点评

本文推荐并点评了软件开发测试中经常使用的20种源代码测试工具,能够帮助大部分人解决测试问题.>>原文来自20款源代码测试工具推荐及点评 AdaTEST--一款针对于Ada应用程序的覆盖率测试.静态测试和动态测试工具 AQtime--该产品含有完整的性能和调试工具集,能够收集程序运行时关键的性能信息和内存/资源分配信息,并提交概要报告和详细报告,还提供所有的程序优化处理工具,囊括了自定义过滤器.图形化的调用层次结构一直到源代码浏览等内容. BoundsChecker--为C++开发者而生的运行时

Android测试工具ThreadingTest开放API接口说明

ThreadingTest(简称TT)第一期是一款Android白盒测试工具,使用离线检测的方式,在保护用户源代码的基础上,运用插装.第五代覆盖率等技术,为开发工程师与测试工程师提供一套高效可量化.可视化的交流工具.对比其它测试工具,TT在自动化测试时,会对应测试用例自动生成测试用例和代码之间的关系以及函数覆盖率,并且以TT自带的双向追溯图进行展示,在整个自动化测试进行过程中,TT还会以示波器界面可视化的监控整个自动化测试中每时每刻获取的测试数据. 基于其它测试工具测试时,TT还开放了API接口

20种源代码测试工具

本文推荐并点评了软件开发测试中经常使用的20种源代码测试工具,能够帮助大部分人解决测试问题. AQtime--该产品含有完整的性能和调试工具集,能够收集程序运行时关键的性能信息和内存/资源分配信息,并提交概要报告和详细报告,还提供所有的程序优化处理工具,囊括了自定义过滤器.图形化的调用层次结构一直到源代码浏览等内容 AdaTEST--一款针对于Ada应用程序的覆盖率测试.静态测试和动态测试工具 BoundsChecker--为C++开发者而生的运行时错误检测和调试工具,支持C/C++..Net.

【转】一般的测试流程和各阶段测试工具简介

一般测试流程:1.需求分析阶段:只要就是对业务的学习,分析需求点.2.测试计划阶段:测试组长就要根据SOW开始编写<测试计划>,其中包括人员,软件硬件资源,测试点,集成顺序,进度安排和风险识别等内容.3.测试设计阶段:测试方案一般由对需求很熟的高资深的测试工程师设计,测试方案要求根据<SRS>上的每个需求点设计出包括需求点简介,测试思路和详细测试方法三部分的方案.<测试方案>编写完成后也需要进行评审.4.测试方案阶段:主要是对测试用例和规程的设计.测试用例是根据<

最全测试工具大全

软件测试类工具大全第一部分,现列举如下,并非百分百全面,仅供测试同行参考: 功能自动化测试工具 厂商 工具名称 * Mercury Winrunner 备注:世界上最古老.经典的测试工具厂商Mercury Interactive公司(2004年改名Mercury)的绝对主打产品,于Loadrunner.Testdirector并称三雄,统治IT行业测试工具市场的20世纪末的10余年.然而它过时了,随着20世界末WEB应用技术的盛行,Winrunner显得力不从心.故2003年Mercury公司开

iOS代码覆盖率测试工具

基于lcov-1.11的:CodeCoverage4iOS 阅读目录 环境准备 Xcode工程配置 构建并安装程序 收集代码覆盖率 过滤结果 合并多个Coverage.info?件?成覆盖率报告: 参考文献 iOS code coverage test tool. 基于lcov-1.11的iOS代码覆盖率测试工具,适用与iOS真机与模拟器. 环境准备 Mac OS X :10.8.5+ 建议10.9 Xcode :5.0+ 建议6.1 回到顶部 Xcode工程配置 拷贝CodeCoverage4