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


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

測試方法間的依賴關系

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

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

另外,為了方便快速的確定問題的所在,如果某個測試方法依賴的方法測試沒有功過,那么PHPUnit會自動跳過后面所有的依賴測試,下面看代碼例子:

testOne中斷言為True,但是傳入的是false,testOne的測試不會通過,那么依賴於testOne的testTwo也會被自動跳過.

數據提供者(Data Providers)

在前面的例子我們可以看到:測試方法是可以有參數的,在依賴關系中參數的值是它依賴的測試方法傳入.那么某個測試方法沒有依賴的方法,我們怎么給它傳入參數做測試呢?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測試的核心:斷言


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM