日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Yii框架特点及测试考虑

發布時間:2025/3/8 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Yii框架特点及测试考虑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 簡介

Yii 是一個基于部件、用于開發大型 Web 應用的高性能 PHP 框架。它將 Web 編程中的可重用性發揮到極致,能夠顯著加速開發進程。Yii(讀作“易”)代表簡單(easy)、高效(efficient)、可擴展 (extensible)。它是輕量級的,又裝配了很好很強大的緩存部件,因此尤其適合開發大流量的應用,比如門戶、論壇、內容管理系統(CMS)、電子商務系統,等等。

Yii 是一個純OOP的通用Web編程框架,和大多數 PHP 框架一樣,Yii 是一個 MVC 框架。

Yii在設計時借鑒和集成了很多其他著名web編程框架和應用的思想和工作:

● Prado:這是Yii的思想的主要來源。Yii采用了它的基于部件和事件驅動的編程范式,數據庫抽象層,模塊應用框架,國際化和本地化以及其它一些東西。
● Ruby on Rails:Yii繼承了它的易于配置的特點。Yii還參考了它的活動記錄設計模式的實現。
● jQuery:作為JavaScript框架的基礎集成到Yii中
● Symfony:Yii參考了它的過濾器設計以及插件框架
● Joomla:Yii參考了它的模塊設計以及消息傳遞體系。

2. YII的設計模式

下面將以一個樹圖描述了一個簡單的web服務所產生的目錄結構。通過這個目錄結構,我們會發現除了Web常見的資源、圖片、CSS、主題等元素外,還有Yii所特有的部件、控制器、模塊、消息、視圖等元素。下面我們將介紹Yii特有的元素的功能及實現。

testdrive/
index.php Web 應用入口腳本文件
assets/ 包含公開的資源文件
css/ 包含 CSS 文件
images/ 包含圖片文件
themes/ 包含應用主題
protected/ 包含受保護的應用文件
yiic yiic 命令行腳本
yiic.bat Windows 下的 yiic 命令行腳本
commands/ 包含自定義的 'yiic' 命令
shell/ 包含自定義的 'yiic shell' 命令
components/ 包含可重用的用戶部件
MainMenu.php 'MainMenu' 掛件類
Identity/php 用來認證的 'Identity' 類
views/ 包含掛件的視圖文件
mainMenu.php 'MainMenu' 掛件的視圖文件
config/ 包含配置文件
console.php 控制臺應用配置
main.php Web 應用配置
controllers/ 包含控制器的類文件
SiteController.php 默認控制器的類文件
extensions/ 包含第三方擴展
messages/ 包含翻譯過的消息
models/ 包含模型的類文件
LoginForm.php 'login' 動作的表單模型
ContactForm.php 'contact' 動作的表單模型
runtime/ 包含臨時生成的文件
views/ 包含控制器的視圖和布局文件
layouts/ 包含布局視圖文件
main.php 所有視圖的默認布局
site/ 包含 'site' 控制器的視圖文件
contact.php 'contact' 動作的視圖
index.php 'index' 動作的視圖
login.php 'login' 動作的視圖
system/ 包含系統視圖文件


2.1. YII的MVC模式

Yii 實現了 Web 編程中廣為采用的“模型-視圖-控制器”(MVC)設計模式。MVC 致力于分離業務邏輯和用戶界面,這樣開發者可以很容易地修改某個部分而不影響其它。在 MVC 中,模型表現信息(數據)和業務規則;視圖包含用戶界面中用到的元素,比如文本、表單輸入框;控制器管理模型和視圖間的交互。

除了 MVC,Yii 還引入了一個叫做 application 的前端控制器,它表現整個請求過程的運行環境。Application 接收用戶的請求并把它分發到合適的控制器作進一步處理。

下圖描述了一個 Yii 應用的靜態結構:

圖 1 Yii 應用的靜態結構

下圖描述了一個 Yii 應用處理用戶請求時的典型流程:

圖 2 Yii 應用的典型流程

1. 用戶訪問 http://www.example.com/index.php?r=post/show&id=1,Web 服務器執行入口腳本 index.php 來處理該請求。
2. 入口腳本建立一個應用實例并運行之。
3. 應用從一個叫 request 的應用部件獲得詳細的用戶請求信息。
4. 通過 urlManager 這個應用部件,確定用戶要請求的控制器和動作。
5. 應用建立一個被請求的控制器實例來進一步處理用戶請求,控制器確定由它的actionShow 方法來處理 show 動作。然后它建立并應用和該動作相關的過濾器,如果過濾器允許的話,動作被執行。
6. 動作從數據庫讀取一個 ID 為 1 的 Post 模型。
7. 動作使用 Post 模型來渲染一個叫 show 的視圖。
8. 視圖讀取 Post 模型的屬性并顯示之。
9. 視圖運行一些掛件。
10. 視圖的渲染結果嵌在布局中。
11. 動作結束視圖渲染并顯示結果給用戶。

2.1.1. 調試模式

一個 Yii 應用能夠根據 YII_DEBUG 常量的指示以調試模式或者生產模式運行。默認情況下該常量定義為 false,代表生產模式。要以調試模式運行,在包含 yii.php 文件前將此常量定義為 true。應用以調試模式運行時效率較低,因為它會生成許多內部日志。從另一個角度來看,發生錯誤時調試模式會產生更多的調試信息,因而在開發階段非常有用。但在正式上線之后,則需要去掉調試模式,因為調試模式會打印很多額外信息,這些信息會在一定程度上影響其運行的性能。

2.2. 應用

應用表示一個請求處理的上下文。它的主要任務是分解用戶的請求并且把它分發到恰當的控制器中進行進一步的處理。它也保存應用級的配置,因此也被稱為前端控制器。

默認情況下,應用是 CWebApplication 類的一個實例。 要對其進行定制, 通常是在應用實例被創建的時候提供一個配置文件 (或數組) 來初始化其屬性值。 另一個定制應用的方法就是擴展 CWebApplication 類。配置是一個鍵值對的數組。 每個鍵名都對應應用實例的一個屬性, 相應的值為屬性的初始值。 如果應用的配置非常復雜,也可以將其分解成多個文件,每個文件返回配置數組的一部分。

應用根目錄表示包含所有安全敏感的PHP腳本和數據的根目錄。缺省情況下,它是包含入口腳本的目錄的名為protected的子目錄。應當組織Web用戶訪問這個目錄。

可以通過靈活的部件框架方便的進行應用功能的定制和擴展。應用管理著部件的集合,每個部件實現特定的功能。例如,應用可能在CUrlManager 和 CHttpRequest的幫助下處理一個用戶的請求。

Yii預定義了一個核心部件集合來提供Web應用中的常用功能,下面是CWebApplication類中預定義 核心部件:

assetManager:CAssetManager - 管理私有資源文件的發布
authManager:CAuthManager – 管理基于角色的訪問控制(RBAC)
cache:CCache – 提供數據緩存功能
clientScript:CClientScript – 管理客戶端腳本(javascript和CSS)
coreMessages:CPhpMessageSource – 提供Yii框架所使用的轉換過的核心消息
db:CDbConnection – 提供數據庫連接
errorHandler:CErrorHandler – 處理未被捕獲的PHP錯誤和異常
messages:CPhpMessageSource – 提供Yii應用使用的轉換過的消息
request:CHttpRequest – 提供和用戶請求相關的信息
securityManager:CSecurityManager – 提供安全相關的服務,如散列,加密
session:CHttpSession – 提供會話相關的功能
statePersister:CStatePersister – 提供全局持續狀態方法
urlManager:CUrlManager – 提供URL解析和創建功能
user:CWebUser – 表示當前用戶的身份信息
themeManager:CThemeManager – 管理主題

處理一個用戶請求時,一個應用將會經歷這樣一個生命周期:

1. 設置自動加載和錯誤處理類
2. 注冊核心應用部件
3. 加載應用配置
4. 使用CApplication::init()初始化應用
加載靜態應用部件
5. 觸發onBeginRequest事件
6. 處理用戶請求:
解析用戶請求
創建控制器
運行控制器
7. 觸發onEndRequest事件

2.3. 控制器

控制器是 CController 或者其子類的實例。 用戶請求應用時,創建控制器。 控制器執行請求action,action通常引入必要的模型并提供恰當的視圖。 最簡單的action僅僅是一個控制器類方法,此方法的名字以action開始。

控制器有默認的action。用戶請求沒指定哪一個action執行時,將執行默認的action。 缺省情況下,默認的action名為index。可以通過設置CController::defaultAction改變默認的action。

下邊是最小的控制器。因為控制器未定義任何action,請求時會拋出異常。

class SiteController extends CController
{
}


CWebApplication在處理一個新請求時,實例化一個控制器。程序通過控制器的ID,并按一定規則確定控制器類及控制器類所在位置。

一個動作可以定義為一個函數或者一個動作類。當請求這個動作時,控制器實例化這個類。這樣就可以復用和重用動作。

過濾器是配置為控制器動作之前或之后執行的一段代碼。例如可以設計一個性能過濾器用于計時動作執行的時間。一個動作可以有多個過濾器。過濾器可以定義為控制器類的方法,也可以是CFilter類的子類。

2.4. 模型

模型是 CModel 或其子類的實例。 模型用于保持數據以及和數據相關的業務規則。模型描述了一個單獨的數據對象。它可以是數據表中的一行數據或者用戶輸入的一個表單。數據中的各個字段都描述了模型的一個屬性。這些屬性都有一個標簽,都可以被一套可靠的規則驗證。

Yii 從表單模型和 active record 實現了兩種模型。 它們都繼承自基類 CModel。

表單模型是CFormModel的實例。表單模型用于保存通過收集用戶輸入得來的數據。這樣的數據通常被收集,使用,然后被拋棄。例如,在一個登錄頁面上,我們可以使用一個表單模型來描述諸如用戶名,密碼這樣的由最終用戶提供的信息。

Active Record (AR) 是一種面向對象風格的,用于抽象數據庫訪問的設計模式。任何一個 AR 對象都是 CActiveRecord 或其子類的實例, 它描述的數據表中的單獨一行數據。這行數據中的字段被描述成 AR 對象的一個屬性。

2.5. 視圖

視圖是一個包含了主要的用戶交互元素的PHP腳本。他可以包含PHP語句,但是建議這些語句不要去改變數據模型,且最好能夠保持其單純性(單純作為視圖)!為了實現邏輯和界面分離,大部分的邏輯應該被放置于控制器或模型里,而不是視圖里。

視圖有一個當其被渲染(render)時用于校驗的名稱。視圖的名稱與其腳本名稱是一樣的。例如:視圖 edit 的名稱出自一個名為 edit.php 的腳本文件。通過 CController::render() 調用視圖的名稱可以渲染一個視圖。這個方法將在 protected/views/ControllerID 目錄下尋找對應的視圖文件。

在視圖腳本內部,可以通過 $this 來訪問控制器實例。可以在視圖里以 $this->propertyName 的方式 pull 控制器的任何屬性。也可以用以下 push 的方式傳遞數據到視圖里:

$this->render('edit', array(
'var1'=>$value1,
'var2'=>$value2,
));


在以上的方式中, render() 方法將提取數組的兩個參數到變量里。其產生的結果是,在視圖腳本里,我們可以直接訪問變量 $var1 和 $var2。

布局是一種特殊的視圖文件用來修飾視圖。它通常包含了用戶交互過程中常用到的一部分視圖。

組件是 CWidget 或其子類的實例。它是一個主要用于描述特定意圖的組成部分。組件通常內嵌于一個視圖來產生一些復雜卻獨立的用戶界面。例如,一個日歷組件可以用于渲染一個復雜的日歷界面。組件可以在用戶界面上更好的實現重用。

系統視圖的渲染通常用于展示 Yii 的錯誤和日志信息。例如,當用戶請求來一個不存在的控制器或動作時,Yii 會拋出一個異常來解釋這個錯誤。 這時,Yii 就會使用一個特殊的系統視圖來展示這個錯誤。

2.6. 部件

Yii 應用構建于對象是規范編寫的部件之上。部件是 CComponent 或其衍生類的實例。使用部件主要就是涉及訪問其屬性和掛起/處理它的事件。基類 CComponent 指定了如何定義屬性和事件。

部件的屬性就像對象的公開成員變量,可以被讀取或設置部件屬性。

部件事件是一種特殊的屬性,它可以將方法(稱之為事件句柄(event handlers))作為它的值。綁定(分配)一個方法到一個事件將會導致方法在事件被掛起處自動被調用。因此部件行為可能會被一種在部件開發過程中不可預見的方式修改。部件事件以 on 開頭的命名方式定義。

部件可以綁定一個或者多個行為。一個行為(behavior) 就是一個對象,其方法可以被它綁定的部件通過收集功能的方式來實現 '繼承(inherited)',而不是專有化繼承(即普通的類繼承)。簡單的來說,就是一個部件可以以'多重繼承'的方式實現多個行為的綁定。

2.7. 開發流程

用yii開發一個web程序的基本流程,如下所示:

1. 創建目錄結構
2. 配置 application,即修改application配置文件
3. 每種類型的數據都創建一個 model 類來管理
4. 每種類型的用戶請求都創建一個 controller 類。 依據實際的需求對用戶請求進行分類。一般來說,如果一個model類需要用戶訪問,就應該對應一個controller類。
5. 實現 actions 和相應的 views。這是真正需要我們編寫的工作。
6. 在controller類里配置需要的action filters 。
7. 如果需要主題功能,編寫 themes。
8. 如果需要 internationalization國際化功能,編寫翻譯語句。
9. 使用 caching 技術緩存數據和頁面。
10. 最后調整好程序和發布。

3. 測試考慮

Yii提供了自動化測試的方法,包括單元測試和功能測試,其中單元測試是驗證一個單元的代碼能夠像預想的一樣工作,對于Yii來說,就是驗證類中的每個方法都可以正確的工作,輸入不同的參數和數據,來驗證類中每個方法能夠輸出符合預期的數據和行為。

功能測試是確定一個功能、特征(例如博客系統中的發表管理)可以像預想的一樣工作。由于一個功能可能包含多個類,因此相比較單元測試,功能測試在更高的級別。

Yii的測試框架是建立在PHPUnit之上的。

3.1. 定義Fixtures

一套自動化的case往往會被執行多次。為了保證這個測試的過程是可重復的,我們需要在執行case的時候,讓其初始狀態是處于一個已知確定的狀態。這個狀態,我們叫做fixture,通俗的講,就是在測試之前所需要的環境的所有初始狀態。

建立一個數據庫的fixture在web應用開發過程中可能是一個最耗時的部分。Yii框架引入了一個叫做CDbFixtureManager的應用組件來緩和這個問題,大體來說,在執行一個測試集合時它做了這樣幾件事情:
在所有case運行前,它把與本次運行case相關的所有數據表置于一個已知的狀態。在一個單一的case運行前,它把一些特定的表復位到一個已知的狀態。

在執行一個方法的過程中,它提供了對與這些fixture有關的數據的訪問。

為了使用CDbFixtureManager這個類,一般會進行如下配置:

return array(
'components'=>array(
'fixture'=>array(
'class'=>'system.test.CDbFixtureManager',
),
),
);

對于這些我們想提供作為fixture的數據,一般會將其放在/protected/tests/fixtures目錄下。這些數據文件按照php的形式組織在一起,統稱為fixture file。每個fixture file會返回一個數組,該數組包含一些特定的表的某些行的預設值。并且文件名跟表名保持一致。

3.2. 單元測試

我們可以總結出如下在Yii中書寫單元測試的原則:

● 單元測試是通過實現繼承自CTestCase或CDbTestCase類的XyzTest類來實現,其中Xyz表示要測試的類名。CTestCase用于通用單元測試而CDbTestCase用于活動記錄模型類的測試。由于PHPUnit_Framework_TestCase是這兩個類的父類,因此我們可以使用繼承自此類的所有方法。
● 單元測試類以文件XyzTest.php的形式保存。為了方便起見,一般單元測試的case會存儲在protected/tests/unit下。
● 測試類主要是一個待測試的類的方法的集合,如果這個待測試的類叫做Abc,那么這個測試類一般會起名為testAbc。
● 一個測試類經常包含一系列的斷言,(例如assertTrue, assertEquals),作為驗證目標類行為的檢驗點。

以如何為active record模型類建立單測為例,我們來看看究竟如何寫一個單測case。

假設我們想測試一個blog的評論模型類,首先要創建一個CommonTest.php并保存在/protected/tests/unit/CommentTest.php,代碼如下:

class CommentTest extends CDbTestCase
{
public $fixtures=array(
'posts'=>'Post',
'comments'=>'Comment',
);

......
?
}


在上述類中,我們制定了fixture的成員變量是一個數組,該數組將會用戶接下來的測試case中。

Fixture names允許我們在測試方法中以一種非常方便的方式來訪問fixture data。最典型的用法如下:

$comments = $this->comments;

接下來,我們就可以書寫textApprove方法來測試評論視圖類中的approve 方法了。

3.3. 功能測試

● 像單元測試一樣,功能測試時通過實現繼承自CWebTestCase類的XyzTest類來實現,其中Xyz表示要測試的類名。由于 PHPUnit_Extensions_SeleniumTestCase是CwebTestCase的父類,因此可以采用繼承自此類的所有方法。
● 功能測試類以文件XyzTest.php的形式保存。
● 測試類主要包含命名為testABC的測試方法的集合,其中Abc經常是要測試的功能的名字,例如testLogin
● 一個測試方法經常包含一系列的指令來發出命令以與被測試Web應用交互。它也包含一些斷言狀態來驗證Web應用如預想一樣響應。

3.4. 其他

3.4.1基于module的單元測試方法

有的yii版本不支持基于phpUnit 的單元的測試,那么我們也可以有其他的辦法來做單元測試。具體的方法就是把test作為一個module。目錄部署結構為:

webRoot/protected/modules/test/controller/ABC.php

在上述ABC.php里,我們可以創建繼承自業務的類,并在這些類中構建對應的action,每個action都可以調用需要測試的函數。通過在瀏覽器上直接請求這些action,并打印出相關信息,即可實現對上述這些函數的測試。如想測試的action函數為actionAdd。

根據yii的url解析規則,上述Add方法的調用即為該url的請求http://*.*.*.*/index.php?r=test/ABC/Add 。 如果適當的加上返回結果的展現,那么就能很明確的知道該函數的返回值與預期的是否相符。

3.4.2Firebug輔助測試

Firebug也是當今web開發程序員的一個利器,同時也可以作為測試人員的一個參考。Firebug會記錄各個請求的參數,post數據,響應數據。當功能出現問題時,測試人員可以根據事先設計的參數和預期的返回的數據來判定是view傳遞的參數錯誤,還是php根據邏輯所計算出的返回數據值不對。從而來定位錯誤的真正位置。

(全文完)
作者:mimical

本文首發于:百度測試技術空間http://hi.baidu.com/baiduqa/blog/item/271d1a5313886a15367abecd.html關注百度技術沙龍









本文轉自百度技術51CTO博客,原文鏈接:http://blog.51cto.com/baidutech/743559,如需轉載請自行聯系原作者

總結

以上是生活随笔為你收集整理的Yii框架特点及测试考虑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。