phpunit 測試 thinkphp action

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!

發佈了63 篇原創文章 · 獲贊 8 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章