透過 PHPUnit 來幫你的 PHP 專案進行單元測試!

單元測試能夠透過一個單元一個單元逐一地測試你的程式,單元測試通常會放置在 CI 上自動執行,意思就是當你 Git Push 了你的專案至遠端,CI 就會自動測試你的程式是否有問題,並且在出現問題時自動回報給你

我為什麼需要單元測試?

如果你正在撰寫一個大型專案,這個專案內的程式一定互相有關聯(像是相依性),一旦你改寫了 B 的部分,你可能就會讓 A 部分失效,但這個時候你只測試 B 的部分,你就沒辦法發覺 A 已經出現了錯誤,而且一旦撰寫了單元測試,這能夠確保你在未來不同機器上都能正常運行,還能夠讓你的程式更有條理

什麼是 PHPUnit?

PHPUnit 是單元測試的程式之一當然還有一些其他的,但 PHPUnit 是最基本並最容易上手的,所以在這裡先介紹 PHPUnit,之後還會介紹到程式碼覆蓋率讓你知道你的單元測試有沒有完整覆蓋到整個程式)。


1. 安裝 PHPUnit

首先你需要先安裝 PHPUnit 才能夠進行單元測試,透過下列幾個指令逐一輸入即可。

$ curl -LO --silent https://phar.phpunit.de/phpunit.phar
$ chmod +x phpunit.phar
$ mv phpunit.phar /usr/local/bin/phpunit

2. 準備你的測試單元!

一旦你安裝了 PHPUnit 之後,你需要先有一些事前準備,這個時候我們需要新增目錄,跟一個設定檔案,當然還有一些注意事項。

新增目錄和設定檔

我們假設你現在有了像下面這樣目錄結構的 PHP 專案。

application                // 主要目錄  
└── src                  // 你存放 PHP 專案的資料夾
     ├── test.php        // 你的 PHP 程式
     ├── test2.php
     └── test3.php

現在我們需要新增一個資料夾,是用來存放測試單元檔案的,這個時候我們新增一個 test 資料夾,然後,還有一個 phpunit.xml

application                // 主要目錄  
├── src                  // 你存放 PHP 專案的資料夾
│    ├── test.php       // 你的 PHP 程式
│    ├── test2.php
│    └── test3.php
├── test                // 搭拉!存放測試單元的資料夾
└── phpunit.xml         // 用來設置 PHPUnit 的檔案

設定 phpunit.xml

這個檔案是用來告訴 PHPUnit 你要把哪些檔案當作單元測試用途,首先我們在裡面這樣輸入。

<?xml version="1.0" encoding="UTF-8"?>  
<phpunit colors="true">  
    <testsuites>
        <testsuite name="My PHP Project">
            <directory>test</directory>
        </testsuite>
    </testsuites>
</phpunit>  

接著就會自動執行 test 裡面所有 xxxTest.php (請注意,名稱結尾一定是 Test.php)的檔案當作測試單元。

3. 撰寫測試單元

我們已經設定了 test 為測試單元的資料夾,接下來就可以開始撰寫測試單元了。

注意事項

有些事情是你在撰寫時需要注意的。

  1. 你的測試單元結尾一定要是 Test.php
  2. 測試單元裡的函式開頭一定要是 test (例如:testHello())。
  3. 測試單元類別一定要衍生於 \PHPUnit_Framework_TestCase

開始撰寫

現在我們在裡面新增一個 helloTest.php 測試單元(檔名結尾一定要是 Test.php),其內容如下。

<?php  
class HelloTest extends \PHPUnit_Framework_TestCase  
{
    function testHello()
    {
        /** 這是斷言,就像是 IF 中的等於,左邊必須等於右邊的值,否則就讓 PHPUnit 報錯 */
        $this->assertEquals('bar', 'bar');
    }
}
?>

4. 開始測試

一旦你都準備就緒也撰寫了測試單元後,你就可以開始執行 PHPUnit 來測試你的單元了,輸入下列指令開始進行單元測試

$ phpunit -c phpunit.xml

接著你就會看到下列結果。

$ phpunit -c phpunit.xml
.                     1 / 1 (100%)

Time: 0.03 seconds, Memory: 18.00MB

OK (1 tests, 1 assertion)  

這表示你的測試花費了 0.03 秒,共有 1 個測試和 1 個斷言。

未來還會敘述更多這方面的用法,例如自動測試跟程式碼涵蓋率,還敬請關注。


圖示來源:Class by Arthur Shlain from the Noun Project