1 要測試thinkphp 的action,首先要處理兩個問題: cookie 與session ,爲了保證測試ACTION 的每個URL 都是用同一個session,所有的URL 必須設置cookie 的PHPSESSID 值,而且都是相同的值,
2 當用PHPUNIT 測試action 時,不能直接實例化Action 類 然後直接調用類方法,比如
$Huiyuan_AC = A("Huiyuan");
$Huiyuan_AC->addAccount();
這樣的調用方式行不通,因爲action 的error 錯誤輸出後使用exit結束程序運行(除非你確定沒有程序沒有調用exit)
3 當前在使用TP session 時,經常發生session 文件死鎖問題,當開啓SEESION 後,當前PHPUNIT的進程一直佔用session 文件,而當請求 POST 到 ACTION時
一直在等待PHPUNIT 進程釋放session 資源,而PHPUNIT 只能執行完程序後纔會調用session_write_close 釋放資源,
而PHPUNIT 一直停留等待請求中,所以會死鎖,所以當TP 加載完後,應該把TP 的session 關掉,
然後設置關掉SESSION_AUTO_START
session_write_close();
C("SESSION_AUTO_START",false);
/**
* filename:前臺入口文件
* desc:前臺入口文件,框架選型:ThinkPHP
* create:創建時間格式:2012-04-16
* author:
*/
// 定義ThinkPHP框架路徑
define('ITEM_ROOT', str_replace('test/houtai/library/TPItemConfig.php', '', str_replace('\\', '/', __FILE__)));
define('THINK_PATH', ITEM_ROOT.'TP/');
//定義項目名稱和路徑
define('APP_NAME', 'HouTai');
define('APP_PATH', ITEM_ROOT.'HouTai/');
define('RUNTIME_PATH',APP_PATH.'../Runtime/'.APP_NAME.'/');
//關閉調試模式
define("APP_DEBUG", false);
// 加載框架公共入口文件
require THINK_PATH."/ThinkPHP.php";
session_write_close();
C("SESSION_AUTO_START",false);
4 當前本人處理TP 的session 可以有兩種方式模擬:URL設置session,直接原生設置session,不過最終用那種方式設置session 都要提供PHPSESSID 值
* 如果用URL 方式 可以設置cookie 的PHPSESSID 值,如果用原生session 的,可以通過以下代碼設置PHPSESSID 值,設置session 值後必須調用
session_write_close(); 釋放session 文件鎖
*
原生設置session
$_PHPUNIT_SESSION_ID = md5("PHPUNIT_TEST");
$_COOKIE[session_name()] = $_PHPUNIT_SESSION_ID;
ob_start();
session_start();
//設置session 值
$_SESSION["key"] = "123456";
session_write_close();
ob_end_clean();
URL設置session
發送POST 設置session
$http = new HttpWebRequest();
$http->setHeaders($this->_config["APP_PHPUNIT_ACTION_HEADER"]);
$http->setParam(array("sess"=>$sess), "POST");
$http->setUrl($this->_config["APP_PHPUNIT_SESSION_URL"]);
$http->send();
接收代碼
setsession.php
<?php
session_start();
if($_POST){
$_sess = $_POST["sess"];
foreach($_sess as $key=>$value){
$_SESSION[$key] = $value;
}
}
?>
5 目前phpunit 暫時不支持action 的測試,所以只能寫個控制器測試,如果要寫成斷言形式,暫時還不會,只能實現簡單的URL 的執行,文件目錄如下
目錄介紹:
Controller.php: 控制器類,只要通過此類執行action
IHttpWebRequest.php: request 請求接口
HttpWebRequest.php:IHttpWebRequest.php 的實現,目前採用了 httpRequest 組件,後續可能實現http_request(pear 的api 包)
httpRequest 可以通過 http://downloads.php.net/pierre/ 網址 下載 php_http-5.3-svn20091125-vc9-x86.zip
或者可以通過pear 安裝
http://pear.php.net/package/HTTP_Request2
安裝命令
pear install HTTP_Request2
PhpunitConfig.php:TP 測試配置文件,可以配置一些請求的header
信息,項目服務器地址
TPItemConfig.php:TP 項目入口文件,爲了能使用TP
提供的函數或model 功能(model 測試時需要),可以使用導入此文件
PhpunitInit.php:phpunit 測試初始化文件,裏面就一些require_once
導入文件
BaseModelTest.php:所有model 測試類的基類,繼承了PHPUnit_Extensions_Database_TestCase
BaseActionTest.php:所有action
測試類的基類,繼承了PHPUnit_Framework_TestCase
BaseHtmlTest.php:所有html
測試類的基類,繼承了PHPUnit_Extensions_Selenium2TestCase
調用實例
測試套件
<?php
require_once 'library/PhpunitInit.php';
class ActionSuite{
public static function main() {
PHPUnit_TextUI_TestRunner::run(self::suite());
}
public static function suite() {
$suite = new PHPUnit_Framework_TestSuite("ActionTestCase");
//$suite->addTestSuite("TestCase555");
$suite->addTestFile('action/Login.php');
$suite->addTestFile('action/HuiyuanZhuanghu.php');
$suite->addTestFile('action/HuiyuanJifen.php');
$suite->addTestFile('action/HuiyuanDingdan.php');
$suite->addTestFile('action/HuiyuanOrder.php');
return $suite;
}
}
?>
執行phpunit ActionSuite.php
OK!