PHPUnit 下使用 PHP_CodeCoverage 函式庫

我們在前一篇有介紹說,如何在兩大作業系統上安裝 PHPUnit 環境,接著程式測試完之後,我們有時候需要知道 line coverage 程式碼行涵蓋率並做為測試的其中一個標準。

在 PHPUnit 本身環境中並無提供這個功能,需要靠另外一個 PHP_CodeCoverage 函式庫做支援。安裝這個函式庫需要用到 Composer 做為安裝,Composer 是一個 PHP 的套件安裝管理工具,讓我們能夠較易管理 PHP 的相關的套件。下面的步驟兩大作業系統皆適用。

第一步:如果我們沒有 Composer ,先去官網下載 Composer ,我建議是下載 composer.phar,使用手動安裝。

第二步:把下載回來的 composer.phar 放到測試專案目錄底下,接著建立一個 composer.json ,裡面輸入下面的文字。


{
     "require": {
        "phpunit/php-code-coverage": "^3"
      }
}

第三步:接著再打開 cmd.exe 輸入下面指令:


php composer.phar install

接著就會開始把 php-code-coverage 函式庫安裝起來了。安裝過程中大概的截圖如下:

 

[備註]

如果出現:

Warning: This development build of composer is over 60 days old. It is recommend
ed to update it by running "composer.phar self-update" to get the latest version
.

 

等相關字樣,意思是警告說,composer.phar 有60天沒有更新了,建議輸入 composer.phar self-update 指令做更新到最新的版本。如果是手動安裝的話,就要輸入下面的指令:


php composer.phar self-update

就只是在前面多加了一個 php 。

第四步:安裝完成之後,就會出現下面相關的截圖:

php-v

第五步:我們就可以在測試專案裡面使用 php-code-coverage 函式庫相關的功能了。

第六步:我們延續上一篇測試,使用兩數相加函式做測試,接著新增一個 phpunit.xml 做為設定檔,這個設定檔目的是要讓 php-code-coverage 知道是哪一個檔案要做涵蓋率的分析。

內容大概像下面這樣:


<?xml version="1.0" encoding="utf-8" ?>
    <phpunit
       colors="true"
       bootstrap="./vendor/autoload.php"
       type="coverage-text" target="reports/" charset="UTF-8">

       <filter>
           <whitelist processUncoveredFilesFromWhitelist="true">
              <directory suffix=".php">C:\wamp\bin\php\php-5.6.15\phpunit\test_sum.php</directory>
           </whitelist>
       </filter>
    </phpunit>

其中,屬性值 type 是要呈現 coverage 使用方式,有純文字和 HTML 可以選擇,如果使用後者的話,那 target 就很重要,因為需要把相關 html 檔案產生到設定 target 的目錄中。

再來就是這行:<directory suffix=”.php”>C:\wamp\bin\php\php-5.6.15\phpunit\test_sum.php</directory> 定義是哪個 PHP 檔案要做 line coverage。

設定好之後,我們就可以來測試涵蓋率了。

第七步:在這個 test 目錄下打開 cmd.exe,或是終端機。輸入下面的指令:


php phpunit.phar test_sum.php --coverage-text

完畢後,會發現出現資訊會跟下面截圖一樣,部分都無法顯示出來或是要等很久才會顯示,所以我們要換個方式把文字資訊截取出來。

php-v

過了一段時間之後,相關涵蓋率訊息才會顯示。

php-v2


php phpunit.phar test_sum.php --coverage-text > res.txt

我們把訊息存到一個自己定義檔名的文字檔裡面,這樣就不用等,cmd.exe. 顯示訊息了。

第八步:我們會使用純文字顯示涵蓋率之後,接著介紹一下用 html 方式呈現,使用這個方式呈現比純文字好處是,呈現出來的相關資訊會顯得比較好看,而且有圖表以及程式碼覆蓋率等較多資訊可以做為參考。

首先先修改 phpunit.xml 設定檔。


<?xml version="1.0" encoding="utf-8" ?>
    <phpunit
       colors="true"
       bootstrap="./vendor/autoload.php"
       type="coverage-html" target="reports/" charset="UTF-8">

       <filter>
          <whitelist processUncoveredFilesFromWhitelist="true">
               <directory suffix=".php">C:\Users\lee\Downloads\php-5.6.15-Win32-VC11-x64\php\test\test_sum.php</directory>
          </whitelist>
       </filter>
    </phpunit>

與上面不一樣的事就是這一段:type=”coverage-html” target=”reports/” ,要確定目標目錄檔存在。

第九步:接著載 終端機 / cmd.exe 中輸入指令:


php phpunit.phar test_sum.php --coverage-html reports/

後面要接目標目錄,檔名需要與 phpunit.xml 一致。

php-v

執行完成之後,就輸出產生 html 分析結果接著去查看 reports 目錄底下。就會發現這樣的檔案結構:

files

我們直接用瀏覽器,開啟 index.html 就會出現涵蓋率分析結果了。

coverage

還有這個程式碼的圖表分析:

coverage

 

[後記]

基本上 PHPUnit 基本用法就到這裡了,要做 coverage 分析之前,建議需要最基本測試,也就是後面不需要帶任何的參數,像是 –coverage-text 等,先看測試 assert(斷言)結果 是不是正確和我們要的,以免使用 assert 相關方法錯誤,導致涵蓋率分析執行下去難以找到錯誤。