PHP教程:PHPUnit學習筆記(一)PHPUnit介紹及安裝

需求

PHPUnit 5.3 須要 PHP 5.6,強烈推薦使用最新版本的 PHP。php

PHPUnit 須要使用 dom 和 json 擴展,它們一般是默認啓用的。python

PHPUnit 還須要 pcrereflectionspl 擴展。這些標準擴展默認啓用,而且除非修改 PHP 的構建系統和 C 源代碼,不然沒法禁用它們。shell

代碼覆蓋率分析報告功能須要 Xdebug (2.2.1以上)與 tokenizer 擴展。生成 XML 格式的報告須要有 xmlwriter 擴展。數據庫

PHP 檔案包 (PHAR)

要獲取 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

總體上說,在 Windows 下安裝 PHAR 和手工在 Windows 下安裝 Composer 是同樣的過程:

  1. 爲 PHP 的二進制可執行文件創建一個目錄,例如 C:\bin

  2. 將 ;C:\bin 附加到 PATH 環境變量中(相關幫助

  3. 下載 https://phar.phpunit.de/phpunit.phar 並將文件保存到 C:\bin\phpunit.phar

  4. 打開命令行(例如,按 Windows+R » 輸入 cmd » ENTER)

  5. 創建外包覆批處理腳本(最後獲得 C:\bin\phpunit.cmd):

     
     
     
    C:\Users\username>cd C:\binC:\bin>echo @php "%~dp0phpunit.phar" %* > phpunit.cmdC:\bin>exit
  6. 新開一個命令行窗口,確認一下能夠在任意路徑下執行 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 項目分發的全部官方代碼發行包都由發行包管理器進行簽名。在 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 來管理項目的依賴關係,只要在項目的 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"
相關文章
相關標籤/搜索