PHPUnit學習筆記

PHPUnit學習筆記

PHPUnit是一個輕量級的PHP測試框架。它是在PHP5下面對JUnit3系列版本的完整移植,是xUnit測試框架家族的一員(它們都基於模式先鋒Kent Beck的設計)php

PHPUnit 編寫測試的基本慣例與步驟

  1. 針對類 Class 的測試寫在類 ClassTest中。數組

  2. ClassTest(一般)繼承自 PHPUnit_Framework_TestCase。bash

  3. 測試都是命名爲 test* 的公用方法。框架

  4. 也能夠在方法的文檔註釋塊(docblock)中使用 @test 標註將其標記爲測試方法。ide

  5. 在測試方法內,相似於 assertEquals()這樣的斷言方法用來對實際值與預期值的匹配作出斷言。函數

例:用 PHPUnit 測試數組操做單元測試

`
assertEquals(0, count($stack));
        array_push($stack, 'foo');
        $this->assertEquals('foo', $stack[count($stack)-1]);
        $this->assertEquals(1, count($stack));
        $this->assertEquals('foo', array_pop($stack));
        $this->assertEquals(0, count($stack));
    }
    /**
     * 定義test標籤聲明改方法是測試方法
     * @test
     */
    public function indexEquals()
    {
        $stack = array(1,2,3,4);
        $this->assertEquals(2,$stack[0]);  //失敗
    }
}
?>
`
  • 通俗的講,單元測試就是在測試用例類中,定義一系列的測試方法,在方法中使用斷言(assert)來測試你程序中的相關函數、類、接口、過程的執行結果是否和你預期的是同樣的,
  • 若是某個部分的執行結果沒有與你期待的結果相同,PHPUnit就會向你報告問題,你也能夠方便的根據報告確認和修復程序中的Bug。針對你的程序寫好詳細的完整單元測試,你就不用每次完成一個新功能後逐個的測試你軟件的全部功能,並且在程序發佈以前,你至少能夠經過測試消滅大部分的內部邏輯Bug和缺陷。
  • 一樣,你在以後的維護開發中,若是在某個功能的修改中不當心改壞了與其相關連的其餘模塊,那麼先前完善的單元測試也會向你報告出相關的問題讓你及時發現和修復問題。

測試方法間的依賴關係

  • 測試方法並不必定非要是一個封裝良好的獨立實體。測試方法之間常常有隱含的依賴關係暗藏在測試的實現方案中。
  • 依賴關係經過註釋@depends來定義.這個特性通常用於檢查代碼的邏輯過程,一個邏輯的執行前提是另一個邏輯的執行結果

例:用 @depends 標註來表達依賴關係學習

<?php
class StackTest extends PHPUnit_Framework_TestCase
{
   public function testEmpty()
   {
       $stack = array();
       $this->assertEmpty($stack);
       return $stack;
   }
   /**
    * @depends testEmpty
    */
   public function testPush(array $stack)
   {
       array_push($stack, 'foo');
       $this->assertEquals('foo', $stack[count($stack)-1]);
       $this->assertNotEmpty($stack);
       return $stack;
   }
   /**
    * @depends testPush
    */
   public function testPop(array $stack)
   {
       $this->assertEquals('foo', array_pop($stack));
       $this->assertEmpty($stack);
   }
}
?>
複製代碼
  • 只要斷言檢查沒有出現異常,那麼PHPUnit就會根據依賴關係依次執行依賴的測試方法,直到依賴關係結束爲止.
  • 爲了方便快速的肯定問題的所在,若是某個測試方法依賴的方法測試沒有功過,那麼PHPUnit會自動跳事後面全部的依賴測試.

*** 擁有多個 @depends 標註的測試,其第一個參數是第一個生產者提供的基境,第二個參數是第二個生產者提供的基境,以此類推 ***測試

`
assertTrue(true);
        return 'first';
    }
    public function testProducerSecond()
    {
        $this->assertTrue(true);
        return 'second';
    }
    /**  多重依賴
     * @depends testProducerFirst
     * @depends testProducerSecond
     */
    public function testConsumer()
    {
        $this->assertEquals(
            array('first', 'second'),
            func_get_args()
        );
    }
}
?>`

數據供給器

  • 某個測試方法沒有依賴的方法,咱們怎麼給它傳入參數作測試呢?PHPUnit給咱們提供了數據提供者方法來爲測試方法傳入數據.測試方法能夠接受任意參數。這些參數由數據供給器方法提供。用 @dataProvider 標註來指定使用哪一個數據供給器方法。
  • 數據提供者方法返回數據的格式: 須要返回的是2維數組,第二維數組值的位置,對應測試方法參數的位置,參數個數和數組長度要相等,不然PHPUnit會報錯

例:使用返回數組的數組的數據供給器ui

`
assertEquals($expected, $a + $b);
    }
    public function additionProvider()
    {
        return array(
          array(0, 0, 0),
          array(0, 1, 1),
          array(1, 0, 1),
          array(1, 1, 3)
        );
    }
}
?>
`
  • 若是測試同時從 @dataProvider 方法和一個或多個 @depends 測試接收數據,那麼來自於數據供給器的參數將先於來自所依賴的測試的。來自於所依賴的測試的參數對於每一個數據集都是同樣的。

例:

`
assertTrue(true);
        return 'first';
    }
    public function testProducerSecond()
    {
        $this->assertTrue(true);
        return 'second';
    }
    /**
     * @depends testProducerFirst
     * @depends testProducerSecond
     * @dataProvider provider
     */
    public function testConsumer()
    {
        $this->assertEquals(
            array('provider1', 'first', 'second'),
            func_get_args()
        );
    }
}
?>
`

** 結果:Tests: 4, Assertions: 4, Failures: 1. **

@depends @dataProvider @dataProvider 是一個二維數組, 有多少個第二緯的數組就測試多少次,第二緯的數組和參數一致 @depends 生產者(producer)返回一個測試基境(fixture)的實例,並將此實例傳遞給依賴於它的消費者(consumer)們。兩者同時存在的話先進行@dataProvider

對異常進行測試

例:

`
expectException(InvalidArgumentException::class);
    }
}
?>
`
  • 使用 @expectedException 標註
`

`

對輸出進行測試

錯誤相關信息的輸出

邊緣狀況

基境(fixture)

PHPUnit 支持共享創建基境的代碼。在運行某個測試方法前,會調用一個名叫 setUp() 的模板方法。setUp() 是建立測試所用對象的地方。當測試方法運行結束後,無論是成功仍是失敗,都會調用另一個名叫 tearDown() 的模板方法。tearDown() 是清理測試所用對象的地方。

在編寫測試用例的時候可能最費時間的就是編寫那些將程序設置到使用狀態和測試完畢以後將其再設置回初始狀態的代碼了。PHPUnit給咱們提供了setUp和tearDown這兩個方法來解決這個問題。

測試類的每一個測試方法都會運行一次 setUp() 和 tearDown() 模板方法(同時,每一個測試方法都是在一個全新的測試類實例上運行的)。

setUpBeforeClass() 與 tearDownAfterClass() 模板方法將分別在測試用例類的第一個測試運行以前和測試用例類的最後一個測試運行以後調用。

組織測試

  1. 用文件系統來編排測試套件
  2. 用 XML 配置來編排測試套件
相關文章
相關標籤/搜索