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
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
调用实例
测试套件
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!