PHPUnit是一個輕量級的PHP測試框架。它是在PHP5下面對JUnit3系列版本的完整移植,是xUnit測試框架家族的一員(它們都基於模式先鋒Kent Beck的設計)php
針對類 Class 的測試寫在類 ClassTest中。數組
ClassTest(一般)繼承自 PHPUnit_Framework_TestCase。bash
測試都是命名爲 test* 的公用方法。框架
也能夠在方法的文檔註釋塊(docblock)中使用 @test 標註將其標記爲測試方法。ide
在測試方法內,相似於 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 標註來表達依賴關係學習
<?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);
}
}
?>
複製代碼
*** 擁有多個 @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() ); } } ?>`
例:使用返回數組的數組的數據供給器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) ); } } ?> `
例:
` 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); } } ?> `
` `
PHPUnit 支持共享創建基境的代碼。在運行某個測試方法前,會調用一個名叫 setUp() 的模板方法。setUp() 是建立測試所用對象的地方。當測試方法運行結束後,無論是成功仍是失敗,都會調用另一個名叫 tearDown() 的模板方法。tearDown() 是清理測試所用對象的地方。
在編寫測試用例的時候可能最費時間的就是編寫那些將程序設置到使用狀態和測試完畢以後將其再設置回初始狀態的代碼了。PHPUnit給咱們提供了setUp和tearDown這兩個方法來解決這個問題。
測試類的每一個測試方法都會運行一次 setUp() 和 tearDown() 模板方法(同時,每一個測試方法都是在一個全新的測試類實例上運行的)。
setUpBeforeClass() 與 tearDownAfterClass() 模板方法將分別在測試用例類的第一個測試運行以前和測試用例類的最後一個測試運行以後調用。