PHPUnit4. IEEE ( 電機電子工程師學會 ) - SWEBOK (Software Engineering Body of Knowledge)
依軟體測試 (Software testing) 層級區分六種測試
5. 1. 單元測試 (Unit testing)
2. 整合測試 (Integration testing)
3. 系統測試 (System testing)
4. 系統整合測試 (System integration testing)
5. 由下而上測試 (Bottom Up testing)
6. 由上而下測試 (Top Down testing)
7. 程式語言裡 , 單元測試是由專案程式碼各個區塊受測試是
否可使用的方法 , 它也是軟體測試最小單位
In computer programming, unit testing is a method by
which individual units of source code are tested to
determine if they are fit for use. A unit is smallest testable
part of an application. - Wiki
8. 1. 單元測試 (Unit testing)
2. 整合測試 (Integration testing)
3. 系統測試 (System testing)
4. 系統整合測試 (System integration testing)
5. 由下而上測試 (Bottom Up testing)
6. 由上而下測試 (Top Down testing)
10. 1. 單元測試 (Unit testing)
2. 整合測試 (Integration testing)
3. 系統測試 (System testing)
4. 系統整合測試 (System integration testing)
5. 由下而上測試 (Bottom Up testing)
6. 由上而下測試 (Top Down testing)
12. 1. 單元測試 (Unit testing)
2. 整合測試 (Integration testing)
3. 系統測試 (System testing)
4. 系統整合測試 (System integration testing)
5. 由下而上測試 (Bottom Up testing)
6. 由上而下測試 (Top Down testing)
14. 1. 單元測試 (Unit testing)
2. 整合測試 (Integration testing)
3. 系統測試 (System testing)
4. 系統整合測試 (System integration testing)
5. 由下而上測試 (Bottom Up testing)
6. 由上而下測試 (Top Down testing)
18. 是 否 曾 經 遇 過 如 下 情 況 :
1. 接過複雜的大型專案
2. 對自己維護的專案,極度沒信心
3. 在專案完成時,常做噩夢,怕隔天出現任何 差錯
4. 時常加班或利用周末休息時間,找程式蟲蟲
20. 但學習撰寫測試是非常值得投資 :
1 、微軟及 IBM 研究報告顯示,可能會增加開發時間
15% ~ 35 % ,但是可減少蟲蟲數 40% ~ 90% ( 註 1) 。
2 、寫程式時,應考慮易於寫測試程式原則。
3 、單元測試程式可以開發程式時順利而不會痛苦。
4 、我們不想在美好的假日或優閒的下班時間 , 被蟲蟲給吸光 ,
明明只是簡單改了一行程式碼,為什麼程式卻壞了。
( 註 1)
http://research.microsoft.com/en-us/groups/ese/nagappan_tdd.pdf
23. PHPUnit 身家背景
1. PHPUnit 是 PHP 的測試框架 , 作者是 Sebastian Bergman
2. 它是 xUnit 測試框架家族
3. PHPUnit 已經成為測試業界標準
4. 被知名的 PHP 框架所使用 , 例如 :
Zend Framework
Symphony
CakePHP
Doctrine
24. xUnit 簡介
1. 單元測試
2. 自動化測試
3. 源於 Smalltalk 的 SUnit, 由 Kent Beck 移植架構 , 使用 Java
寫成 JUnit, 承襲此架構其他語言相繼出現 , 例如 :
(1) C++ 的 CppUnit
(2) PHP 的 PHPUnit
(3) JavaScript 的 JsUnit, YUI Test, Qunit
JsUnit (2001 ~ 2009) 目前已停止開發維護 , 它是 JS 語言第一個
出現的測試套件
Qunit 是 jQuery 作者開發 , 後由社群維護 , 遵循
CommonJS Unit Testing 規範
27. 安裝需求
PHPUnit 3.6
- PHP 5.2.7+ 最低
- PHP 5.3.9+ 建議
配件 : PHP_CodeCoverage
- Xdebug 2.0.5+ 最低
- Xdebug 2.1.3+ 建議
PHPUnit 3.7
- PHP 5.3.3+ 最低
- PHP 5.4.0+ 建議
配件 : PHP_CodeCoverage
- Xdebug 2.0.5+ 最低
- Xdebug 2.2.0+ 建議
29. 撰寫基本的測試程式
檔案 StackTest.php
1 require_once PHPUnit/Autoload.php
2
3 class StackTest extends PHPUnit_Framework_TestCase
4 {
5 public function testEmpty()
6 {
7 $stack = array();
8 $this->assertEmpty($stack);
9 }
10 }
11
12 1. 檔案名稱結尾加 Test
13 2. 類別名稱結尾加 Test
14 3. 類別繼承 PHPUnit_Framework_TestCase
15 4. 類別方法名稱開頭加 test, 存取範圍設定成 public
16 5. 類別裡至少要有一個 test 開頭的方法 , 否則測試會顯示失敗
17 6. 類別方法裡至少要有一個 assert 方法被呼叫 , 否則會顯示未完成或省略
18
30. 測試資料準備 (Test Fixtures)
檔案 StackTest.php
1 require_once PHPUnit/Autoload.php
2
3 class StackTest extends PHPUnit_Framework_TestCase
4 {
5 protected $stack;
6
7 protected function setUp()
8 {
9 $this->stack = array();
10 }
11
12 public function testEmpty()
13 {
14 $this->assertTrue(empty($this->stack));
15 }
16 }
1. 經由 setUp 或 tearDown 方法 , 可在測試前設置所需資料
2. setUp 在執行測試前呼叫 , tearDown 則在之後被呼叫
3. 藉由這兩種方法 , 可以從是檔案或者網路相關測試
4. 另外 setUpBeforeClass 和 tearDownAfterClass 個別在執行 test 方法前後被呼叫
5. 執行順序 setUp => setUpBeforeClass => test* => tearDownAfterClass => tearDown
32. 什麼是 Mock 物件 ?!
1. 它是測試類別的依賴類別的替代品
2. 取代依賴呼叫方法 , 讓執行測試時暢行無阻
3. 正確使用它 , 可以正確模擬原有依賴類別特性
4. 隔離依賴類別 , 可以幫助你判斷是否目前測試類別錯誤
5. 使用 mock 物件方法稱為 Dependency Injection (DI)
33. Mock 物件實做
class SomeClass
{
public function doSomething()
{
// Do something.
}
}
class StubTest extends PHPUnit_Framework_TestCase
{
public function testStub()
{
$stub = $this->getMock('SomeClass');
$stub->expects($this->any())
->method('doSomething')
->will($this->returnValue('foo'));
$this->assertEquals('foo', $stub->doSomething());
}
}
34. Mock 物件其它使用
1. 可使用 getMockForAbstractClass() 方法測試抽象類別
2. 可使用 getMockFromWsdl() 方法模擬 SOAP 網路服務
3. PHPUnit 支援檔案系統模擬 , 需安裝 vfsStream 套件 , 目前仍為測試版
35. 命令列執行測試
1. 直接輸入 PHPUnit 不加任何參數則返回說明訊息
2. 當測試某個檔案時 , 參數輸入檔案名稱 , 即可執行測試
3. 當測試整個目錄時 , 參數輸入目錄路徑 , PHPUnit 會依
提供目錄路徑遞迴方式一層一層搜尋檔案執行
4. PHPUnit 執行測試後 , 成功時會印出『 . 』 ,
失敗時會印出 F, 未完成時會印出 I, 省略跳過則會印出 S
5. 還會顯示執行秒數 , 使用記憶體大小 , 測試了多少方法