第 3 章 安装 PHPUnit

注意

PHPUnit 3.7 需要 PHP 5.3.3(或更高版本),强烈推荐 PHP 5.5.1(或更高版本)。

PHPUnit 使用了 PHP_CodeCoverage 这个库来收集与处理代码覆盖率信息。它依赖于 Xdebug 2.0.5(或更高版本),强烈推荐 Xdebug 2.2.3(或更高版本)。

PHP档案包(PHAR)

要获取 PHPUnit,最简单的方法是下载 PHPUnit 的 PHP 档案包(PHAR),它将 PHPUnit 所需要的所有依赖组件(包括某些可选的组件)捆绑在单个文件中:

wget https://phar.phpunit.de/phpunit.phar
chmod +x phpunit.phar
mv phpunit.phar /usr/local/bin/phpunit

当然,你也可以下载后直接使用这个 PHAR:

wget https://phar.phpunit.de/phpunit.phar
php phpunit.phar

Composer

如果你用 Composer 来管理项目的依赖关系,只需要简单的在项目的 composer.json 文件中加上一个对 phpunit/phpunit 的依赖关系即可。下面是一个最小化的 composer.json 文件的例子,只定义了一个对 PHPUnit 3.7 的开发时(development-time)依赖:

{
    "require-dev": {
        "phpunit/phpunit": "3.7.*"
    }
}

要通过 Composer 完成系统级的安装,可以运行:

composer global require 'phpunit/phpunit=3.7.*'

请确保 path 变量中包含有 ~/.composer/vendor/bin/

注意

对于 Composer 和 PHP 档案包(PHAR) 的支持是于 PHPUnit 3.7(从 PHPUnit 3.7.5 开始是稳定(stable)版本)加入的。更早的 PHPUnit 发行版本在这些分发渠道上不可用。

PEAR

使用 PEAR 安装程序来安装 PHPUnit 只需要执行以下两个指令(可能需要以 root 权限运行):

pear config-set auto_discover 1
pear install pear.phpunit.de/PHPUnit

小心

根据你的操作系统版本与PHP环境的具体情况,有可能需要先安装 PEAR 或者更新已安装的 PEAR 之后才能按照这里的指南来操作。

一般用 sudo pear upgrade PEAR 就能完成对已安装 PEAR 的升级。PEAR 手册则解说了如何对 PEAR 进行全新安装。

可选的组件包

有以下可选组件包可用:

DbUnit

移植到 PHP/PHPUnit 上的 DbUnit 用于提供对数据库交互测试的支持。

若要通过 PEAR 安装此组件包,使用如下指令:

pear install phpunit/DbUnit

若要通过 Composer 安装此组件包,添加如下 "require-dev" 依赖项:

"phpunit/dbunit": ">=1.2"
PHP_Invoker

一个工具类,可以用带有超时限制的方式调用可调用内容。当需要在严格模式下保证测试的超时限制时,这个组件包是必须的。

要安装此组件包,使用如下指令:

pear install phpunit/PHP_Invoker

若要通过 Composer 安装此组件包,添加如下 "require-dev" 依赖项:

"phpunit/php-invoker": "*"
PHPUnit_Selenium

将 Selenium RC 集成于 PHPUnit。

若要通过 PEAR 安装此组件包,使用如下指令:

pear install phpunit/PHPUnit_Selenium

若要通过 Composer 安装此组件包,添加如下 "require-dev" 依赖项:

"phpunit/phpunit-selenium": ">=1.2"
PHPUnit_Story

使用PHPUnit进行行为驱动开发时所使用的基于故事的测试运行器。

若要通过 PEAR 安装此组件包,使用如下指令:

pear install phpunit/PHPUnit_Story

若要通过 Composer 安装此组件包,添加如下 "require-dev" 依赖项:

"phpunit/phpunit-story": "*"
PHPUnit_SkeletonGenerator

一个工具,用于从成品代码类中生成骨架测试类,或反之。

要安装此组件包,使用如下指令:

pear install phpunit/PHPUnit_SkeletonGenerator
PHPUnit_TestListener_DBUS

一个发送事件给 DBUS 的测试监听器(TestListener)。

要安装此组件包,使用如下指令:

pear install phpunit/PHPUnit_TestListener_DBUS
PHPUnit_TestListener_XHProf

一个利用 XHProf 来对测试的代码进行自动性能剖析的测试监听器(TestListener)。

要安装此组件包,使用如下指令:

pear install phpunit/PHPUnit_TestListener_XHProf
PHPUnit_TicketListener_Fogbugz

一个与Fogbugz系统的问题API交互的任务单(ticket)监听器。

要安装此组件包,使用如下指令:

pear install phpunit/PHPUnit_TicketListener_Fogbugz
PHPUnit_TicketListener_GitHub

一个与GitHub系统的问题API交互的任务单(ticket)监听器。

要安装此组件包,使用如下指令:

pear install phpunit/PHPUnit_TicketListener_GitHub
PHPUnit_TicketListener_GoogleCode

一个与Google Code系统的问题API交互的任务单(ticket)监听器。

要安装此组件包,使用如下指令:

pear install phpunit/PHPUnit_TicketListener_GoogleCode
PHPUnit_TicketListener_Trac

一个与Trac系统的问题API交互的任务单(ticket)监听器。

要安装此组件包,使用如下指令:

pear install phpunit/PHPUnit_TicketListener_Trac

升级

此部分收集了从 PHPUnit 3.6 升级到 PHPUnit 3.7 时可能遭遇的一些小的向后兼容问题。

升级应当是十分简单且不会遭遇任何问题的,因为这个过程已经针对所有主要的开源框架进行过测试并且不存在任何问题。但是每个项目毕竟是各有不同的,如果你已经尝试了某个候选发布版本并且遭遇到了问题,本文档也许能提供一些帮助。

已移除废弃的 OutputTestCase

PHPUnit_Extensions_OutputTestCase 已经移除。在 PHPUnit 3.6 中,用到这个类时会产生一个废弃提示。关于现在该如何测试输出参见“对输出进行测试”一节

当前工作目录将会在每个测试用例之后还原

如果某个测试改变了当前工作目录(cwd),PHPUnit 在生成代码覆盖率报告时会碰到问题。现在当前工作目录将会在每个测试用例之后还原,于是可能会发现某个测试依赖于另外一个改变了当前工作目录的测试。这是不可取的,并且应当很容易修正。

测试监听器触发了一次对自动加载(autoload)的调用

当像“测试监听器(Test Listeners)”一节中描述的那样使用自定义测试监听器时,PHPUnit 静默地忽略掉缺失的测试监听器。对于用户来说,这方面的问题极其难于调试。现在,在尝试定位这些类时会触发一次对自动加载(autoload)的调用。如果你所使用的自动加载器在找不到测试监听器时生成一个错误,就可能让你在这里碰到问题。要这个问题,移除这个监听器或者在 bootstrap.php 中确保这个类已被加载。

不再克隆(clone)仿件对象(mock object)的参数

之前,在模仿(mock)一个对象时会克隆(clone)起所有参数。这导致在测试中尝试判定传递给方法的是否是同一个参数是碰到问题,另外在碰到不可克隆的对象时还会有其他问题。作为一直以来都被许多人所要求的特性,这个行为已经改变了。例 10.15展示了新实现方式的有益之处。例 10.16展示了如何切换回之前的行为方式。

addUncoveredFilesFromWhitelist已移除,以processUncoveredFilesFromWhitelist取而代之

在生成代码覆盖率时,如果使用了 <whitelist addUncoveredFilesFromWhitelist="true">,PHPUnit 将会对所有无覆盖的文件进行包含(include)操作。对于这些文件中包含可执行代码的人而言这会是个问题。PHPUnit 现在将扫描文件并在不执行包含操作的情况下尝试猜测确定哪些代码是可执行的哪些代码是不可执行的。这有可能导致代码覆盖率报告有所不同。

如果需要切换回旧的行为方式,可以使用 <whitelist processUncoveredFilesFromWhitelist="true">。如果需要同时支持 PHPUnit 3.6 和 3.7,可以同时使用这两个设置。

cacheTokens 的默认值改为 false

从 PHPUnit 3.7.2 开始,对已词法分析(tokenized)的文件的缓存默认关闭。在处理大型项目的代码覆盖率报告时,这个缓存会消耗大量内存,并且由于白名单行为的变化,对于那些代码基于成千上万个类的人来说会很成问题。

如果项目比较小或者有足够多内存,可以通过在 phpunit.xml 文件中添加 cacheTokens="true" 来获得运行时间上的收益。参见“PHPUnit”一节

请在 GitHub 上 开启任务单 来对本页提出改进建议。万分感谢!