PHPUnit單元測試的簡單使用

何爲單元測試:php

指對軟件中的基本單元進行測試,如函數、方法等,以檢查其返回值或行爲是否符合預期;實際中軟件是很複雜的,由許多組件構成,執行流程連貫在一塊兒,要進行單元片斷的測試,就須要爲其提供執行上下文(或者說參數)和環境(好比打樁模擬一些對象)來運行,並監控其行爲和返回值,爲此咱們就須要寫出作這件事情的程序代碼,這樣的代碼叫作測試用例,許多測試用例有機結合在一塊兒造成一個總體的測試,又叫作測試套件,被測試的程序代碼叫作生產代碼。phpunit這個軟件就是用來幫助咱們寫測試用例並進行測試的。html

 

php的單元測試:phpunitbootstrap

在其官網有詳細教程,這裏介紹一些補充內容。
首先要明白phpunit軟件自己就是由php語言實現,其使用是經過命令行進行的,並非經過瀏覽器訪問
明白這一點很重要,許多新人被卡在這裏。很基礎也很簡單,但彷佛沒怎麼被說起數組

 

想試一下單元測試好久了,可是一直沒有合適的項目,並且中文網絡上的PHPUnit教程要麼太舊,要麼太亂,因此總也沒學會。最近準備把手頭的項目重構一下,決定開始使用PHPUnit作單元測試,先照着PHPUnit的官網作了一下Tutorial,雖然已經很簡單了,仍然被卡住幾回,因此寫篇文章記錄一下。由於對PHP的包管理系統不熟悉,這篇文章會從安裝開始。瀏覽器


1.安裝

PHPUnit若是使用PHAR安裝的話很簡單。Phar歸檔就像Java的Jar,能夠直接被PHP解釋器執行。在*nix系統下,能夠執行下面三條命令:bash

➜ wget  
➜ chmod +x phpunit.phar
➜ sudo mv phpunit.phar /usr/local/bin/phpunit

考慮到此次的重構會引入比較多類庫,我選擇了Composer作依賴管理。我在Windows上試過PhpStorm裏的Composer,老是失敗,感受是網絡很差的緣由。此次在Ubuntu下安裝很順利,全局安裝Composer以後,在命令行執行網絡

composer global require phpunit/phpunit

全局安裝PHPUnit。而後在 ~/.bashrc 文件末尾加一行 PATH=$PATH:/home/feng/.composer/vendor/bin(注意替換用戶名),來將Composer的global bin目錄加入PATH。composer

安裝事後運行 phpunit --version看到版本信息則說明安裝成功。phpstorm

另外,裝完之後我發現Ubuntu系統可使用 apt-get install phpunit來安裝,但我沒有試過。ide

在Windows下我用的是XAMPP環境,其中已經內置PHPUnit了。若是要在命令提示符下使用的話,能夠修改環境變量中的PATH,在裏面加上 C:\xampp\php(或者你修改後的路徑)。再打開命令提示符,運行phpunit --version看一下。


2.第一個測試

第一個Tutorial我使用的是PHPUnit官網上的Getting Started,這裏寫的比它還要簡單一點。

項目的目錄結構以下:

 
├── phpunit.xml
├── src
│   ├── autoload.php
│   └── Money.php
└── tests
    └── MoneyTest.php
 

第一個文件是項目代碼src/Money.php,內容以下:

amount = $amount;
    }

    public function getAmount()
    {
        return $this->amount;
    }

    public function negate()
    {
        return new Money(-1*$this->amount);
    }
}

 

與之對應的單元測試是tests目錄下的MoneyTest.php,注意單元測試文件名最好是*Test.php,這樣之後指定tests目錄即可以執行目錄下的全部測試。

negate();

        $this->assertEquals(-1, $b->getAmount());
    }
}

 

代碼很簡單,$this->assertEquals(-1, $b->getAmount());即斷言後一個參數的執行結果與前一個參數相等,其餘不解釋了。

如今,若是在MoneyTest.php里加一行include_once('../src/Money.php');。而後在項目根目錄下執行phpunit tests/MoneyTest,就能夠看到執行結果了。


3.自動載入

可是,逐個添加include的方式太不方便,最好是能自動include所需的文件,PHPUnit提供了一個參數--bootstrap,可使用項目的autoload文件。這裏我本身寫了一個最簡單的autoload.php,只要4行。這個文件並非PHPUnit專用的,應該放在src目錄下。

<?php

function __autoload($class){
    include $class.'.php';
}

spl_autoload_register('__autoload');

 

當須要Money類時,就去include Money.php。寫完__autoload()函數以後要用spl_autoload_register()註冊上。

如今就能夠去掉MoneyTest.php中的include語句,使用phpunit --bootstrap src/autoload.php tests/MoneyTest來執行測試了。

雖然能夠自動載入,可是要執行的命令更長了。咱們還能夠寫一個配置文件來爲項目指定bootstrap,這樣就不用每次都寫在命令裏了。

配置文件phpunit.xml放在項目根目錄下。

 

 

若是要執行MoneyTest,在項目根目錄下執行:phpunit tests/MoneyTest
若是要執行tests目錄下的全部測試,在項目根目錄下執行:phpunit tests


Reference:

  1. Getting Started with PHPUnit – The PHP Testing Framework

  2. PHP: spl_autoload_register - Manual

  3. PHPUnit Bootstrap and Autoloading classes - Jess Telford

  4. Composer

標籤: none

 

你可能會疑惑,上面的php代碼是怎麼回事呢?

那就是一個測試用例,簡單的測試了一個數組操做,進行單元測試通常經過如下四步:

1. 針對生產代碼類 Class 的測試寫在類 ClassTest中。
2. ClassTest(一般)繼承自 PHPUnit\Framework\TestCase。
3. 測試都是命名爲 test* 的公用方法。也能夠在方法的文檔註釋塊(docblock)中使用 @test 標註將其標記爲測試方法。
4. 在測試方法內,相似於 assertEquals()這樣的斷言方法用來對實際值與預期值的匹配作出斷言判斷。

這裏你可能會有幾個地方迷惑:

一、在註釋塊中使用的標註,php能夠經過反射獲得,程序能夠利用獲得的信息進行配置
二、上列中測試用例代碼裏面的TestCase類來自哪裏?並無被加載啊?
上文提到phpunit自己是用php語言寫成的,打包成了phar供使用,phar是可執行的,執行時首先執行包裏面的存根文件stub
你能夠按照上文雲客的另一篇phar帖子介紹的方法提取還原phpunit.phar包,或者使用phpstorm這樣的ide直接打開
在.phar/stub.php裏你將看到存根代碼,TestCase類就是在存根代碼裏面require的
「phpunit yunke」這條命令行代碼將首先運行phpunit腳本,從存根文件開始執行,而後由phpunit加載測試用例代碼
能夠看出程序並非從測試用例腳本開始執行的,如今明白TestCase類哪裏來的了吧

經過以上內容再配合官網文檔,新手應該能夠順利入門了

相關文章
相關標籤/搜索