測試是軟體開發中必不可少的環節.無論我們是否意識到,在開發Web應用的時候,我們始終都是在測試的.例如, 當我們用PHP寫了一個類時, 我們可能會用到一些注入 echo 或者 die 語句來顯示我們是否正確地實現了某個方法;當我們實現了包含一套複雜的HTML表單的web頁面時, 我們可能會試著輸入一些測試資料來確認頁面是否是按照我們的預期來互動的.更進階的開發人員則會寫一些代碼來自動完成這個測試過程, 這樣一來每當我們需要測試一些東西的時候, 我們只需要調用代碼, 剩下來的就交給電腦了. 這就是所謂的 自動化的測試, 也是本章的主要話題.
Yii 提供的測試支援包括 單元測試 和 功能測試.
單元測試檢驗了代碼的一個獨立單元是否按照預期工作. 在物件導向編程中, 最基本的代碼單元就是類. 因此, 單元測試的主要職責就是校正這個類所實現的每個方法工作都是正常的. 單元測試通常是由開發了這個類的人來編寫.
功能測試檢驗了特性是否按照預期工作(如:在一個部落格系統裡的提交操作).與單元測試相比, 功能測試通常要進階一些, 因為待測試的特性常常牽涉到多個類. 功能測試通常是由非常瞭解系統需求的人編寫.(這個人既可以是開發人員也可以是品質工程師).
1. 測試驅動開發
以下展示的便是所謂的 測試驅動開發 (TDD) 的開發週期:
-
建立一個涵蓋要實現的特性的新的測試. 測試預計將在第一次執行的時候失敗, 因為特性尚未實現.
-
執行所有測試,確保這個新的測試是失敗的.
-
編寫代碼來使得測試通過.
-
執行所有測試,確保所有測試通過.
-
重構新編寫的代碼並確保這些測試仍然能夠通過.
重複步驟1至5推進整體功能的實現.
2. 構建測試環境
Yii 提供的測試支援需要 PHPUnit 3.5+ 和 Selenium Remote Control 1.0+。(Linux中安裝PHPUnit參考這篇文章:Ubuntu中安裝PHPUnit的詳細步驟及報錯的解決辦法,Windows中安裝PHPUnit可參考這篇文章:在windows中安裝Pear及PHPUnit詳細教程,Selenium下載地址在這裡:點擊下載)
當我們使用 yiic webapp 控制台命令來建立一個新的 Yii 應用時, 它將會產生以下檔案和目錄供我們來編寫和完成測試.
testdrive/ protected/ 包含了受保護的應用檔案 tests/ 包含了應用測試 fixtures/ 包含了資料 fixtures functional/ 包含了功能測試 unit/ 包含了單元測試 report/ 包含了 coverage 報告 bootstrap.php 這個指令碼在一開始執行 phpunit.xml PHPUnit 設定檔 WebTestCase.php 基於 Web 的功能測試基類
如上所示的, 我們的測試代碼主要放在 fixtures, functional 和 unit 這三個目錄下, report 目錄則用於儲存產生的程式碼 coverage 報告.
我們可以在控制台視窗執行以下命令來執行測試(無論是單元測試還是功能測試):
% cd testdrive/protected/tests% phpunit functional/PostTest.php // 執行單個測試% phpunit --verbose functional // 執行 'functional' 下的所有測試% phpunit --coverage-html ./report unit
上面的最後一條命令將執行 unit 目錄下的所有測試然後在 report 目錄下產生出一份 code-coverage 報告. 注意要產生 code-coverage 報告必須安裝並開啟PHP的 xdebug 擴充 .
3. 測試的引導指令碼
讓我們來看看 bootstrap.php 檔案裡會有些什麼. 首先這個檔案有點特殊,因為它看起來很像是 入口指令碼, 而它也正是我們執行一系列測試的入口.
$yiit='path/to/yii/framework/yiit.php';$config=dirname(__FILE__).'/../config/test.php';require_once($yiit);require_once(dirname(__FILE__).'/WebTestCase.php');Yii::createWebApplication($config);
如上所示, 首先我們包含了來自 Yii 架構的 yiit.php 檔案, 它初始化了一些全域常量以及必要的測試基類.然後我們使用 test.php 這個設定檔來建立一個應用執行個體.如果你查看 test.php 檔案, 你會發現它是繼承自 main.php 這個設定檔的, 只不過它多加了一個類名為 CDbFixtureManager 的 fixture 應用組件.我們將在下一節中詳細的介紹 fixtures.
return CMap::mergeArray( require(dirname(__FILE__).'/main.php'), array( 'components'=>array( 'fixture'=>array( 'class'=>'system.test.CDbFixtureManager', ), /* 去除以下注釋可為測試提供一個資料庫連接. 'db'=>array( 'connectionString'=>'DSN for test database', ), */ ), ));
當我執行那些涉及到資料庫操作的測試時, 我們應該提供一個測試專用的資料庫以便測試執行不會干擾到正常的開發或者生產活動. 這樣一來, 我們紙需要去除上面 db 配置的注釋, 然後填寫 connectionString 屬性的用以串連到資料庫的DSN(資料來源名稱)即可.
通過這樣一個啟動指令碼, 當我們執行單元測試時, 我們便可以獲得一個與服務需求類似的應用執行個體, 而主要的不同就是測試擁有一個 fixture 管理器以及它專屬的測試資料庫.
測試系列教程:
Yii架構官方指南系列38——定義特定狀態(Fixtures)
Yii架構官方指南系列39——單元測試(Unit Testing)
Yii架構官方指南系列40——測試:功能測試(Functional Testing )
以上就是Yii架構官方指南系列增補版37——測試:概覽的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!