測試是軟體開發中必不可少的環節.無論我們是否意識到,在開發Web應用的時候,我們始終都是在測試的.例如, 當我們用PHP寫了一個類時, 我們可能會用到一些注入echo
或die
語句來顯示我們是否正確地實現了某個方法;當我們實現了包含一套複雜的HTML表單的web頁面時, 我們可能會試著輸入一些測試數據來確認頁面是否是按照我們的預期來交互的.更高級的開發者則會寫一些代碼來自動完成這個測試過程, 這樣一來每當我們需要測試一些東西的時候, 我們只需要調用代碼, 剩下來的就交給計算機了. 這就是所謂的自動測試, 也是本章的主要話題.
Yii 提供的測試支持包括單元測試 和功能測試.
單元測試檢驗了程式碼的一個獨立單元是否按照預期工作. 在物件導向程式設計中, 最基本的程式碼單元就是類別. 因此, 單元測試的主要職責就是校驗這個類別所實現的每個方法工作都是正常的. 單元測試通常是由開發了這個類的人來編寫.
功能測試檢驗了特性是否按照預期工作(如:在一個博客系統裡的提交操作).與單元測試相比, 功能測試通常要高級一些, 因為待測試的特性常常牽涉到多個類別. 功能測試通常是由非常了解系統需求的人編寫.(這個人既可以是開發者也可以是品質工程師).
以下展示的便是所謂的測試驅動開發(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 應用時, 它將生成以下文件和目錄供我們來編寫和完成測試.<pre class="brush:php;toolbar:false">testdrive/
protected/ 包含了受保护的应用文件
tests/ 包含了应用测试
fixtures/ 包含了数据 fixtures
functional/ 包含了功能测试
unit/ 包含了单元测试
report/ 包含了 coverage 报告
bootstrap.php 这个脚本在一开始执行
phpunit.xml PHPUnit 配置文件
WebTestCase.php 基于 Web 的功能测试基类</pre>
如上所示的, 我們的測試程式碼主要放在fixtures
, functional
和
這三個目錄下,
report 目錄則用於存儲生成的代碼coverage 報告.我們可以在控制台測試(無論是單元測試還是功能測試):
<pre class="brush:php;toolbar:false">% cd testdrive/protected/tests
% phpunit functional/PostTest.php // 执行单个测试
% phpunit --verbose functional // 执行 'functional' 下的所有测试
% phpunit --coverage-html ./report unit</pre>
上面的最後一條命令將執行
目錄下生成一份code-coverage 報告. 注意要產生code-coverage 報告必須安裝並開啟PHP的xdebug 擴充功能.3. 測試的引導腳本
讓我們來看看
bootstrap.php
<pre class="brush:php;toolbar:false">$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);</pre>
如上所示, 首先我們包含了來自Yii 框架的
yiit.php
文件, 它初始化了一些全局常量以及它初始化了一些全局常量以及必要的測試基底類別.然後我們使用test.php
這個設定檔來建立一個應用實例.如果你查看test.php
檔案, 你會發現它是繼承自
這個設定檔的,只不過它多加了一個類別名為CDbFixtureManager 的
fixture
<pre class="brush:php;toolbar:false">return CMap::mergeArray(
require(dirname(__FILE__).'/main.php'),
array(
'components'=>array(
'fixture'=>array(
'class'=>'system.test.CDbFixtureManager',
),
/* 去除以下注释可为测试提供一个数据库连接.
'db'=>array(
'connectionString'=>'DSN for test database',
),
*/
),
)
);</pre>
以上就是Yii框架官方指南系列增補版37-測試:概覽的內容,更多相關內容請關注PHP中文網(www.php.cn)!