Contenu connexe Similaire à PHPUnit slide formal Similaire à PHPUnit slide formal (20) PHPUnit slide formal2. 依據 SWEBOK (Software Engineering Body of Knowledge)
所定義軟體測試 (Software testing), 依測試層級區分五個種類 :
1. 單元測試 (Unit testing)
2. 整合測試 (Integration testing)
3. 系統測試 (System testing)
4. 系統整合測試 (System integration testing)
5. 由下而上測試 (Bottom Up testing)
6. 由上而下測試 (Top Down testing)
4. Q : 什 麼 是 單 元 測 試 ?!
A:
程式語言裡 , 單元測試是由專案程式碼各個區塊受測試是
否可使用的方法 , 它也是軟體測試最小單位
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
5. 是 否 曾 經 遇 過 如 下 情 況 :
1. 接過維護的專案程式是大家驚恐的
2. 害怕修改專案程式後 , 出現不祥預感
3. 在專案終於完成 , 常常前一晚做噩夢 , 怕隔天又出現任何差
錯
4. 時常加班或利用周末休息時間 , 找程式蟲蟲
7. 但學習撰寫測試是非常值得投資 :
1. 微軟及 IBM 研究報告顯示 , 可能會增加開發時間
15% ~ 35 %, 但是可減少蟲蟲數 40% ~ 90%
2. 寫程式時 , 應考慮易於寫測試程式原則
3. 單元測試程式可以開發程式時順利而不會痛苦
4. 我們不想在美好的假日或優閒的下班時間 , 被蟲蟲給吸光 ,
明明只是簡單改了一行程式碼 , 為什麼程式卻壞了
9. Mr. PHPUnit 自我介紹
即使是一個優秀的程式設計師都會犯錯 , 但是優秀的程式員會利用測試盡
可能找出錯誤 , 花多點時間寫出測試程式 , 就越容易找出蟲蟲 , 程式錯誤
無法全部找出 , 但是藉由測試程式 , 盡可能找出有問題的程式 .
使用 PHPUnit 可能和你一般使用的測試方式有些部分類似 , 不同的是會
測試是否和你預期的一樣 , 有效率自動執行程式你想測試的程式片段
10. PHPUnit 身家背景
1. PHPUnit 是 PHP 的測試框架 , 作者是 Sebastian Bergman
2. 它是 xUnit 測試框架家族
3. PHPUnit 已經成為測試業界標準 , 和它同期的有 SimpleTest
和 Atoum
4. 被知名的 PHP 框架所使用 , 例如 : Zend Framework,
Symphony, CakePHP 及其它大型專案 Doctrine
11. 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 規範
13. 安裝需求
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+ 建議
15. 撰寫基本的測試程式
檔案 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
16. 測試資料準備 (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
18. 什麼是 Mock 物件 ?!
1. 它是測試類別的依賴類別的替代品
2. 取代依賴呼叫方法 , 讓執行測試時暢行無阻
3. 正確使用它 , 可以正確模擬原有依賴類別特性
4. 隔離依賴類別 , 可以幫助你判斷是否目前測試類別錯誤
5. 使用 mock 物件方法稱為 Dependency Injection (DI)
19. 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());
}
}
20. Mock 物件其它使用
1. 可使用 getMockForAbstractClass() 方法測試抽象類別
2. 可使用 getMockFromWsdl() 方法模擬 SOAP 網路服務
3. PHPUnit 支援檔案系統模擬 , 需安裝 vfsStream 套件 , 目前仍為測試版
21. 命令列執行測試
1. 直接輸入 PHPUnit 不加任何參數則返回說明訊息
2. 當測試某個檔案時 , 參數輸入檔案名稱 , 即可執行測試
3. 當測試整個目錄時 , 參數輸入目錄路徑 , PHPUnit 會依
提供目錄路徑遞迴方式一層一層搜尋檔案執行
4. PHPUnit 執行測試後 , 成功時會印出『 . 』 ,
失敗時會印出 F, 未完成時會印出 I, 省略跳過則會印出 S
5. 還會顯示執行秒數 , 使用記憶體大小 , 測試了多少方法