PHP教程:PHPUnit學習筆記(三)測試方法進階

在上篇日記中我介紹了寫一個基本的測試類的方法,今天在基本測試類的基礎上,再來介紹測試方法的進階功能。php

測試方法間的依賴關係數組

PHPUnit能夠實現測試方法的依賴關係,也就是說,一個測試方法的參數的內容和是否會運行依賴於另一個測試方法結果,依賴關係經過註釋@depends來定義.這個特性通常用於檢查代碼的邏輯過程,一個邏輯的執行前提是另一個邏輯的執行結果.下面來看代碼例子:ide

點擊查看原圖

在上面的測試類StackTest中,定義了2個依賴測試方法,testPush依賴於testEmpty, testPop依賴於testPush.那麼在測試運行時,testEmpty中的斷言執行完畢也沒有出現問題時,方法中的return語句會將 $stack傳給依賴於它的testPush,做爲testPush的參數傳入到testPush中,testPush執行完畢以後,也會將$stack傳給依賴於它的testPop,只要斷言檢查沒有出現異常,那麼PHPUnit就會根據依賴關係依次執行依賴的測試方法,直到依賴關係結束爲止.測試

另外,爲了方便快速的肯定問題的所在,若是某個測試方法依賴的方法測試沒有功過,那麼PHPUnit會自動跳事後面全部的依賴測試,下面看代碼例子:this

點擊查看原圖

testOne中斷言爲True,可是傳入的是false,testOne的測試不會經過,那麼依賴於testOne的testTwo也會被自動跳過.spa

數據提供者(Data Providers).net

在前面的例子咱們能夠看到:測試方法是能夠有參數的,在依賴關係中參數的值是它依賴的測試方法傳入.那麼某個測試方法沒有依賴的方法,咱們怎麼給它傳入參數作測試呢?PHPUnit給咱們提供了數據提供者方法來爲測試方法傳入數據.對象

數據提供者方法須要定義在當前的測試類中,在測試方法的註釋中使用@dataProvider標籤標註給它提供數據的方法名,定義以後PHPUnit會自動的將數據提供者方法返回的數據依次傳入到測試方法中測試.圖片

數據提供者至關於都取大量數據測試時的封裝文檔

下面咱們來看代碼:

點擊查看原圖

在上面的代碼中,方法add_provider就是測試方法testAdd的數據提供者方法,它會依次給testAdd傳入4組測試數據,testAdd會測試4次.

在這裏要注意的是數據提供者方法返回數據的格式: 須要返回的是2維數組,第二維數組值的位置,對應測試方法參數的位置,參數個數和數組長度要相等,不然PHPUnit會報錯,下面是個用於理解的簡單的例子:

return array(
     array(參數1,參數2,參數3,參數4,參數N),
     array(參數1,參數2,參數3,參數4,參數N),
);

除了數組外,PHPUnit還支持數據提供者方法返回迭代器對象,迭代器的介紹估計大部分PHPer比較陌生,詳細的介紹能夠去http://php.net/manual/en/class.iterator.php 察看
,下面咱們來看代碼(點擊圖片放大察看):

點擊查看原圖

和前一個例子實現的測試內容相同,可是數據提供者返回的是一個迭代器對象而不是是數組


數據提供者方法和依賴關係的限制

當一個測試方法依賴於另一個使用data providers測試方法時,這個測試方法將會在它依賴的方法至少測試成功一次後運行,同時使用data providers的測試方法的執行的結果不能傳入一個依賴它的測試方法中.這個解釋來自官方的文檔,理解起來可能有點難,咱們經過代碼來描述下這個限制:

點擊查看原圖

上面代碼例子中:

狀況1: add_provider提供的數據至少有一對數據相等

testC會執行一次, 由於testC是依賴於testB的, 可是testB使用了數據提供者方法,那麼testC中是沒法收到testB return的值的

狀況2: add_provider提供的數據沒有一對數據相等

testC永遠不會執行

測試異常

有時候咱們須要測試某些狀況下代碼是否按照要求拋出了相關的異常.在PHPUnit中,咱們有3種方式來檢查異常是否拋出.

方法一: 註釋法, 用@expectedException 標按期待的異常
/**
 * @expectedException InvalidArgumentException
 */
 
public function testException()
{
}

方法二: 設定法,使用 $this->setExpectedException 設按期待的異常
public function testException()
{
    $this->setExpectedException('InvalidArgumentException');
}

方法三: try catch + fail法
public function testException() {
    try {
        // 這裏寫上會引起異常的代碼 
    } catch (InvalidArgumentException $expected) {
        // 抓到異常測試經過 
        return ;
    }

    // 沒抓到異常就算失敗 
    $this->fail('An expected exception has not been raised.' );
}

測試PHP錯誤

有時候咱們的代碼在運行時會出現php錯誤,如整除0,文件不存在等等.在PHPUnit中,它會自動把錯誤轉換爲異常PHPUnit_Framework_Error並拋出,咱們只須要在測試方法中設定抓取這個異常便可:

/**
 * @expectedException PHPUnit_Framework_Error // 期待PHPUnit_Framework_Error的異常
 */
 
public function testFailingInclude()
{
    // include一個不存在的文件,就會拋出一個PHPUnit_Framework_Error的異常 
    include 'not_existing_file.php'; 
}

本篇日記完結,下篇講詳細的介紹PHPUnit測試的核心:斷言

相關文章
相關標籤/搜索