第 1 章 安装 PHPUnit

注意

如果从旧版本 PHPUnit 升级,请阅读“从 PHPUnit 4.0 升级到 PHPUnit 4.1”一节

需求

PHPUnit 4.1 需要 PHP 5.3.3,强烈推荐使用最新版本的 PHP。

PHPUnit 需要使用以下扩展:domjsonpcrereflection 以及 spl。通常,这些扩展会被一并编译并默认启用。其中的某些甚至是根本无法禁用的。

如果需要支持代码覆盖率分析,需要 Xdebug 2.1.3,强烈推荐使用最新版本的 Xdebug。另外,代码覆盖率分析功能还需要有 tokenizer 扩展才能工作。 如果要将代码覆盖率信息以 XML 格式记录下来,需要有 xmlwriter 扩展。

要以 PHP 档案包(PHAR)方式使用 PHPUnit,需要 phar 扩展。 PHPUnit 的 PHAR 的 --self-update 功能需要 openssl 扩展才能工作。 如果使用了 Suhosin 扩展并同时希望以 PHP 档案包(PHAR)方式使用 PHPUnit,需要配置 suhosin.executor.include.whitelist = phar

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

注意

要从 https://phar.phpunit.de/ 下载,需要支持 TLS/SNI的客户端,例如 wget 1.14(或更高版本)。

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

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

校验 PHPUnit PHAR 发行包

由 PHPUnit 项目分发的所有官方代码发行包都由发行包管理器进行签名。在 phar.phpunit.de 上有 PGP 签名和 SHA1 散列值可用于校验。

下面的例子详细说明了如何对发行包进行校验。首先下载 phpunit.phar 和与之对应的单独 PGP 签名 phpunit.phar.asc

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

用单独的签名(phpunit.phar.asc)对 PHPUnit 的 PHP 档案包(phpunit.phar)进行校验:

gpg phpunit.phar.asc
gpg: Signature made Sat 19 Jul 2014 01:28:02 PM CEST using RSA key ID 6372C20A
gpg: Can't check signature: public key not found

在本地系统中没有发行包管理器的公钥(6372C20A)。为了能进行校验,必须从某个密钥服务器上取得发行包管理器的公钥。其中一个服务器是 pgp.uni-mainz.de。所有密钥服务器是链接在一起的,因此连接到任一密钥服务器均可。

gpg --keyserver pgp.uni-mainz.de --recv-keys 0x4AA394086372C20A
gpg: requesting key 6372C20A from hkp server pgp.uni-mainz.de
gpg: key 6372C20A: public key "Sebastian Bergmann <sb@sebastian-bergmann.de>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

现在已经取得了条目名称为"Sebastian Bergmann <sb@sebastian-bergmann.de>"的公钥。不过无法检验这个密钥确实是由名叫 Sebastian Bergmann 的人创建的。但是可以先试着校验发行包的签名:

gpg phpunit.phar.asc
gpg: Signature made Sat 19 Jul 2014 01:28:02 PM CEST using RSA key ID 6372C20A
gpg: Good signature from "Sebastian Bergmann <sb@sebastian-bergmann.de>"
gpg:                 aka "Sebastian Bergmann <sebastian@php.net>"
gpg:                 aka "Sebastian Bergmann <sebastian@thephp.cc>"
gpg:                 aka "Sebastian Bergmann <sebastian@phpunit.de>"
gpg:                 aka "Sebastian Bergmann <sebastian.bergmann@thephp.cc>"
gpg:                 aka "[jpeg image of size 40635]"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: D840 6D0D 8294 7747 2937  7831 4AA3 9408 6372 C20A

此时,签名已经没问题了,但是这个公钥还不能信任。签名没问题意味着文件未被篡改。然而,由于公钥加密系统的性质,还需要再校验密钥 6372C20A 确实是由真正的 Sebastian Bergmann 创建的。

任何攻击者都能创建公钥并将其上传到公钥服务器。他们可以建立一个带恶意的发行包,并用这个假密钥进行签名。这样,如果尝试对这个损坏了的发行包进行签名校验,由于密钥是“真”密钥,校验将成功完成。因此,需要对这个密钥的真实性进行校验。如何对公钥的真实性进行校验已经超出了本文档的范畴。

Composer

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

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

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

composer global require "phpunit/phpunit=4.1.*"

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

可选的组件包

有以下可选组件包可用:

PHP_Invoker

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

PHPUnit 的 PHAR 分发中已经包含了此组件包。若要通过 Composer 安装此组件包,添加如下 "require-dev" 依赖项:

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

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

PHPUnit 的 PHAR 分发中已经包含了此组件包。若要通过 Composer 安装此组件包,添加如下 "require-dev" 依赖项:

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

将 Selenium RC 集成于 PHPUnit。

PHPUnit 的 PHAR 分发中已经包含了此组件包。若要通过 Composer 安装此组件包,添加如下 "require-dev" 依赖项:

"phpunit/phpunit-selenium": ">=1.2"
如果对本页有改进建议,请 在 GitHub 上开启任务单。万分感谢!