php 单元测试 集成测试,Yaf框架结合PHPUnit的集成测试

Yaf,全称 Yet Another Framework,是一个C语言编写的PHP框架。自从接触Yaf以来也快1年了,Yaf的性能确实非常不错,但是相应的资料比较少。一直想把PHPUnit使用在Yaf上,网上搜了一圈这方面的资料非常非常少。于是自己折腾了下这个,初步处理了一下关于控制器(controller)和模型(model)的测试。

先报下运行环境:

PHP:5.3.13或者5.4.16

Yaf:2.2.9

phpunit:3.7.29

在php 5.3.13和5.4.16下都没有发现问题,Yaf扩展要注意下载相应的版本。

下面说明下相关文件和代码。

测试目录为tests。

phpunit.xml文件

PHPUnit配置文件,内容如下:

表示测试执行时从bootstrap.php开始引导。

bootstrap.php文件

测试执行的引导文件,声明常量等一些全局配置都可以在这里做。内容如下:

define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../'));

application\library\Test\PHPUnit\TestCase.php文件

自定义的测试基类文件,控制器和模型的测试类都继承该类。代码如下:

namespace Test\PHPUnit;

/**

* 测试基类

*/

class TestCase extends \PHPUnit_Framework_TestCase {

/**

* yaf运行实例

*

* @var \Yaf\Application

*/

protected $_application = null;

/**

* 构造方法,初始化yaf运行实例

*/

public function __construct() {

$this->_application = $this->getApplication();

parent::__construct();

}

/**

* 设置application

*/

public function setApplication() {

$application = new \Yaf\Application(APPLICATION_PATH . "/conf/application.ini");

$application->bootstrap();

\Yaf\Registry::set('application', $application);

}

/**

* 获取application

*

* @return \Yaf\Application

*/

public function getApplication() {

$application = \Yaf\Registry::get('application');

if (!$application) {

$this->setApplication();

}

return \Yaf\Registry::get('application');

}

}

因为Yaf在运行的时候,全局只能实例化一次,所以在初始化Yaf运行实例后,就保存到Yaf的注册表里避免多次实例化。此外在构造方法里就调用初始化Yaf运行实例的方法,是为了在数据模型的测试中,可以直接new出相应的数据模型,而不用导入相关的文件。

application\library\Test\PHPUnit\ControllerTestCase.php文件

控制器测试基类,控制器的测试类都继承该类。内容如下:

namespace Test\PHPUnit;

require_once APPLICATION_PATH . '/tests/application/library/Test/PHPUnit/TestCase.php';

/**

* 控制器测试基类

*/

class ControllerTestCase extends \Test\PHPUnit\TestCase {

}

暂时没有代码,为将来扩展预留。

application\library\Test\PHPUnit\ModelTestCase.php文件

模型测试基类,模型的测试类都继承该类。内容如下:

namespace Test\PHPUnit;

require_once APPLICATION_PATH . '/tests/application/library/Test/PHPUnit/TestCase.php';

/**

* 数据模型测试基类

*/

class ModelTestCase extends \Test\PHPUnit\TestCase {

}

application\controllers\IndexTest.php首页控制器测试文件

控制器测试示例文件,内容如下:

require_once APPLICATION_PATH . '/tests/application/library/Test/PHPUnit/ControllerTestCase.php';

/**

* 首页控制器测试类

*/

class IndexTest extends \Test\PHPUnit\ControllerTestCase {

/**

* 测试index方法

*/

public function testIndex() {

$request = new \Yaf\Request\Simple("CLI", "Index", "Index", 'index');

$response = $this->_application->getDispatcher()

->returnResponse(true)

->dispatch($request);

$content = $response->getBody();

$this->assertEquals('index phtml', $content);

}

}

测试控制器主要是使用\Yaf\Request\Simple类,设定参数为CLI则为命令行运行。

application\controllers\models\UserTest.php模型测试文件

数据模型测试文件,内容如下:

require_once APPLICATION_PATH . '/tests/application/library/Test/PHPUnit/ModelTestCase.php';

class UserTest extends \Test\PHPUnit\ModelTestCase {

public function testGetUserName() {

$model = new \UserModel();

$userId = 1;

$result = $model->getUserName($userId);

$this->assertEquals('iceup', $result);

$userId = 100;

$result = $model->getUserName($userId);

$this->assertFalse($result);

}

}

这里可以直接new \UserModel()出来,因为在测试基类的构造方法里已经初始化了Yaf运行实例。

小结

执行测试的时候一般最头疼的是文件的自动加载问题,基本上只要解决了这个问题,剩下都比较容易处理了。目前在项目的运用中碰到一些实际的问题,比如输出json格式的数据,抛出异常,post传参等,以后会陆续补上相应的解决方式。

你可能感兴趣的:(php,单元测试,集成测试)