PHPUnit 5.3 須要 PHP 5.6,強烈推薦使用最新版本的 PHP。php
PHPUnit 須要使用 dom 和 json 擴展,它們一般是默認啓用的。python
PHPUnit 還須要 pcre、reflection、spl 擴展。這些標準擴展默認啓用,而且除非修改 PHP 的構建系統和 C 源代碼,不然沒法禁用它們。shell
代碼覆蓋率分析報告功能須要 Xdebug (2.2.1以上)與 tokenizer 擴展。生成 XML 格式的報告須要有 xmlwriter 擴展。數據庫
要獲取 PHPUnit,最簡單的方法是下載 PHPUnit 的 PHP 檔案包 (PHAR),它將 PHPUnit 所須要的全部必要組件(以及某些可選組件)捆綁在單個文件中:json
要使用 PHP檔案包(PHAR)須要有 phar 擴展。bootstrap
要使用 PHAR 的 --self-update
功能須要有 openssl 擴展。windows
若是啓用了 Suhosin 擴展,須要在 php.ini
中容許執行 PHAR:bash
suhosin.executor.include.whitelist = phar
若是要全局安裝 PHAR:服務器
$wget https://phar.phpunit.de/phpunit.phar$chmod +x phpunit.phar$sudo mv phpunit.phar /usr/local/bin/phpunit$phpunit --versionPHPUnit x.y.z by Sebastian Bergmann and contributors.
也能夠直接使用下載的 PHAR 文件:composer
$wget https://phar.phpunit.de/phpunit.phar$php phpunit.phar --versionPHPUnit x.y.z by Sebastian Bergmann and contributors.
總體上說,在 Windows 下安裝 PHAR 和手工在 Windows 下安裝 Composer 是同樣的過程:
爲 PHP 的二進制可執行文件創建一個目錄,例如 C:\bin
將 ;C:\bin
附加到 PATH
環境變量中(相關幫助)
下載 https://phar.phpunit.de/phpunit.phar 並將文件保存到 C:\bin\phpunit.phar
打開命令行(例如,按 Windows+R » 輸入 cmd
» ENTER)
創建外包覆批處理腳本(最後獲得 C:\bin\phpunit.cmd
):
C:\Users\username>cd C:\binC:\bin>echo @php "%~dp0phpunit.phar" %* > phpunit.cmdC:\bin>exit
新開一個命令行窗口,確認一下能夠在任意路徑下執行 PHPUnit:
C:\Users\username>phpunit --versionPHPUnit x.y.z by Sebastian Bergmann and contributors.
對於 Cygwin 或 MingW32 (例如 TortoiseGit) shell 環境,能夠跳過第五步。 取而代之的是,把文件保存爲 phpunit
(沒有 .phar
擴展名),而後用 chmod 775 phpunit
將其設爲可執行。
由 PHPUnit 項目分發的全部官方代碼發行包都由發行包管理器進行簽名。在 phar.phpunit.de 上有 PGP 簽名和 SHA1 散列值可用於校驗。
下面的例子詳細說明了如何對發行包進行校驗。首先下載 phpunit.phar
和與之對應的單獨 PGP 簽名 phpunit.phar.asc
:
wget https://phar.phpunit.de/phpunit.pharwget https://phar.phpunit.de/phpunit.phar.asc
用單獨的簽名(phpunit.phar
)對 PHPUnit 的 PHP 檔案包(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 foundgpg phpunit.phar.asc
在本地系統中沒有發行包管理器的公鑰(6372C20A
)。爲了能進行校驗,必須從某個密鑰服務器上取得發行包管理器的公鑰。其中一個服務器是 pgp.uni-mainz.de
。全部密鑰服務器是連接在一塊兒的,所以鏈接到任一密鑰服務器均可以。
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)gpg --keyserver pgp.uni-mainz.de --recv-keys 0x4AA394086372C20A
如今已經取得了條目名稱爲"Sebastian Bergmann <sb@sebastian-bergmann.de>"的公鑰。不過沒法檢驗這個密鑰確實是由名叫 Sebastian Bergmann 的人建立的。可是能夠先試着校驗發行包的簽名:
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 C20Agpg phpunit.phar.asc
此時,簽名已經沒問題了,可是這個公鑰還不能信任。簽名沒問題意味着文件未被篡改。但是因爲公鑰加密系統的性質,還須要再校驗密鑰 6372C20A
確實是由真正的 Sebastian Bergmann 建立的。
任何攻擊者都能建立公鑰並將其上傳到公鑰服務器。他們能夠創建一個帶惡意的發行包,並用這個假密鑰進行簽名。這樣,若是嘗試對這個損壞了的發行包進行簽名校驗,因爲密鑰是「真」密鑰,校驗將成功完成。所以,須要對這個密鑰的真實性進行校驗。如何對公鑰的真實性進行校驗已經超出了本文檔的範疇。
有個比較謹慎的作法是建立一個腳原本管理 PHPUnit 的安裝,在運行測試套件以前校驗 GnuPG 簽名。例如:
#!/usr/bin/env bash clean=1 # 是否在測試完成以後刪除 phpunit.phar ? aftercmd="php phpunit.phar --bootstrap bootstrap.php src/tests" gpg --fingerprint D8406D0D82947747293778314AA394086372C20A if [ $? -ne 0 ]; then echo -e "\033[33mDownloading PGP Public Key...\033[0m" gpg --recv-keys D8406D0D82947747293778314AA394086372C20A # Sebastian Bergmann <sb@sebastian-bergmann.de> gpg --fingerprint D8406D0D82947747293778314AA394086372C20A if [ $? -ne 0 ]; then echo -e "\033[31mCould not download PGP public key for verification\033[0m" exit fi fi if [ "$clean" -eq 1 ]; then # 若是存在就清理掉 if [ -f phpunit.phar ]; then rm -f phpunit.phar fi if [ -f phpunit.phar.asc ]; then rm -f phpunit.phar.asc fi fi # 抓取最新的發行版和對應的簽名 if [ ! -f phpunit.phar ]; then wget https://phar.phpunit.de/phpunit.phar fi if [ ! -f phpunit.phar.asc ]; then wget https://phar.phpunit.de/phpunit.phar.asc fi # 在運行前先校驗 gpg --verify phpunit.phar.asc phpunit.phar if [ $? -eq 0 ]; then echo echo -e "\033[33mBegin Unit Testing\033[0m" # 運行測試套件 `$after_cmd` # 清理 if [ "$clean" -eq 1 ]; then echo -e "\033[32mCleaning Up!\033[0m" rm -f phpunit.phar rm -f phpunit.phar.asc fi else echo chmod -x phpunit.phar mv phpunit.phar /tmp/bad-phpunit.phar mv phpunit.phar.asc /tmp/bad-phpunit.phar.asc echo -e "\033[31mSignature did not match! PHPUnit has been moved to /tmp/bad-phpunit.phar\033[0m" exit 1 fi
若是用 Composer 來管理項目的依賴關係,只要在項目的 composer.json
文件中簡單地加上對 phpunit/phpunit
的依賴關係便可。下面是一個最小化的 composer.json
文件的例子,只定義了一個對 PHPUnit 5.3 的開發時(development-time)依賴:
{ "require-dev": { "phpunit/phpunit": "5.3.*" } }
要經過 Composer 完成系統級的安裝,能夠運行:
composer global require "phpunit/phpunit=5.3.*"
請確保 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"