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

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!

你可能感兴趣的:(phpunit)