我們在前一篇有介紹說,如何在兩大作業系統上安裝 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-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 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 一致。
執行完成之後,就輸出產生 html 分析結果接著去查看 reports 目錄底下。就會發現這樣的檔案結構:
我們直接用瀏覽器,開啟 index.html 就會出現涵蓋率分析結果了。
還有這個程式碼的圖表分析:
[後記]
基本上 PHPUnit 基本用法就到這裡了,要做 coverage 分析之前,建議需要最基本測試,也就是後面不需要帶任何的參數,像是 –coverage-text 等,先看測試 assert(斷言)結果 是不是正確和我們要的,以免使用 assert 相關方法錯誤,導致涵蓋率分析執行下去難以找到錯誤。