https://github.com/xiaobopang/phalcon_phpunit
这是一个关于phalcon单元测试的小教程
https://github.com/xiaobopang/phalcon_phpunit
phalcon phalcon-phpunit phpunit phpunit-testcase
Last synced: 3 months ago
JSON representation
这是一个关于phalcon单元测试的小教程
- Host: GitHub
- URL: https://github.com/xiaobopang/phalcon_phpunit
- Owner: xiaobopang
- License: apache-2.0
- Created: 2019-05-06T10:16:26.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2019-05-27T05:41:42.000Z (over 6 years ago)
- Last Synced: 2025-04-08T13:45:42.351Z (7 months ago)
- Topics: phalcon, phalcon-phpunit, phpunit, phpunit-testcase
- Language: PHP
- Homepage: https://www.unclepang.com
- Size: 159 KB
- Stars: 4
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
## 简介
这是一个基于Phalcon框架的单元测试demo小教程,希望对初次编写单元测试的童鞋有所帮助。
### 前提
```
1、在开始之前先假定你已经使用过Phalcon这个框架,对其有一定基础认知。
2、其次你对composer包依赖管理有一定的了解
```
## 快速开始
### 1.安装PHPUnit,以下为Linux操作环境:
````
$ wget wget -O phpunit https://phar.phpunit.de/phpunit-8.phar
$ sudo mv phpunit-8.phar /usr/local/bin/phpunit
$ sudo chmod +x /usr/local/bin/phpunit
$ phpunit --version
````
#### 如果输出结果如下,则表明你已经安装成功:

[PHPUnit](https://github.com/sebastianbergmann/phpunit) 👈点击左侧"PHPUnit"
### 2、通过composer来引入相关测试组件,首先进入你的项目根目录执行一下命令:
#### 1)composer require --dev phpunit/phpunit ^8
#### 2)composer require phalcon/incubator
#### 3)以上安装结束后,在你的项目根目录下创建tests文件夹,并进入到tests文件夹下
#### 4)在tests文件夹下新建phpunit.xml,格式如下:
```
./
./Test/UnitCaseTest.php
.
./
./UnitCaseTest.php
./
./UnitCaseTest.php
```
#### 5)紧接着在你的tests文件夹下新建一个TestHelper.php,其内容如下:
```
* Copyright (c) 2019 Pangxiaobo
*/
use Phalcon\DI;
use Phalcon\DI\FactoryDefault;
ini_set('display_errors', 1);
error_reporting(E_ALL);
define('ROOT_PATH', __DIR__);
define('PATH_INCUBATOR', __DIR__ . '/../vendor/phalcon/incubator/');
define('PATH_CONFIG', __DIR__ . '/../api/config/config.php');
define('PATH_MODELS', __DIR__ . '/../api/models/');
define('PATH_CONTROLLERS', __DIR__ . '/../api/controllers/');
define('PATH_SERVICES', __DIR__ . '/../api/services/');
set_include_path(
ROOT_PATH . PATH_SEPARATOR . get_include_path()
);
// 使用autoloader加载应用中的类,autoload依赖可以在composer vendor目录下找到
$loader = new \Phalcon\Loader();
$loader->registerDirs(array(
ROOT_PATH,
PATH_CONFIG,
PATH_MODELS,
PATH_SERVICES,
PATH_CONTROLLERS,
));
$loader->registerNamespaces(array(
'Phalcon' => PATH_INCUBATOR . 'Library/Phalcon/',
));
$loader->register();
$config = include PATH_CONFIG;
$di = new FactoryDefault();
Di::reset();
//这里我们注入一些需要用到的service服务,例如:db
$di->set('db', function () use ($config) {
return new \Phalcon\Db\Adapter\Pdo\Mysql($config->database->toArray());
}, true);
Di::setDefault($di);
```
#### 6)好了,我们在创建完TestHelper.php之后,在tests目录下接着新建一个UnitTestCase.php的文件:
```
* Copyright (c) 2019 Pangxiaobo
*/
use Phalcon\Di;
use Phalcon\Di\FactoryDefault;
use Phalcon\Mvc\Model\Manager as ModelsManager;
use \Phalcon\Test\UnitTestCase as PhalconTestCase;
use Phalcon\Cache\Backend\Redis as BackRedis;
use Phalcon\Cache\Frontend\Data as FrontData;
abstract class UnitTestCase extends PhalconTestCase
{
/**
* @var \Voice\Cache
*/
protected $_cache;
/**
* @var \Phalcon\Config
*/
protected $_config;
/**
* @var bool
*/
private $_loaded = false;
public function setUp(Phalcon\DiInterface $di = null, Phalcon\Config $config = null)
{
global $config;
if (is_null($config)) {
$this->_config = include __DIR__ . '/../api/config/config.php';
} else {
$this->_config = $config;
}
// 在测试期间根据需要加载一些服务
$di = new FactoryDefault();
Di::reset();
$di->set('db', function () use ($config) {
return new \Phalcon\Db\Adapter\Pdo\Mysql($config->database->toArray());
});
$di->set('modelsManager', function () {
return new ModelsManager();
}, true);
$di->set("config", function () use ($config) {
return $config;
});
$di->setShared('serviceCache', function () use ($config) {
$frontCache = new FrontData([
'lifetime' => 2592000,
]);
return new BackRedis($frontCache,(array) $config->redisCache);
});
Di::setDefault($di);
$this->setDi($di);
// parent::setUp($di, $config);
$this->_loaded = true;
}
/**
* 重置testcase环境
*
* @return void
*/
protected function tearDown()
{
$di = $this->getDI();
$di::reset();
parent::tearDown();
}
/**
* Check if the test case is setup properly
* @throws \PHPUnit_Framework_IncompleteTestError;
*/
public function __destruct()
{
if (!$this->_loaded) {
throw new \PHPUnit_Framework_IncompleteTestError('Please run parent::setUp().');
}
}
}
```
#### 7)为了使你的测试和你的应用隔离开来,避免污染整个项目源代码,我们可以为单元测试创建命名空间。好了,接下来我们需要在tests文件夹下接着创建一个名叫Test的文件夹。
#### 8)然后,我们在Test文件里新建一个名叫CaseTest.php的文件。其内容如下:
```
* Copyright (c) 2019 Pangxiaobo
*/
namespace Test;
/**
* Class UnitCaseTest
*/
class CaseTest extends \UnitTestCase
{
/**
* 控制器取值测试
* @return void
*/
public function testController()
{
$logStatus = TestController::$logStatus;
$this->assertEquals($logStatus, 1, "获取到控制器的logStatus=" . $logStatus);
}
/**
* 输出测试
*
* @return void
*/
public function testHello()
{
$name = $_GET["name"];
$test = new TestController();
$test->hello($name);
$this->expectOutputString('hello,jack');
}
/**
* 模型类测试
*
* @return void
*/
public function testModel()
{
$testModel = new TestModel();
$testModel->source = "Test";
$testModel->listFields = ["id", "user", "age"];
$listInfo = $testModel->retrieve(0, 3);
// 读出的条目数量是否正确
$this->assertEquals(
count($listInfo["List"]),
3,
"查询数据和预期不符"
);
}
/**
* 获取参数测试
*
* @return void
*/
public function testTest()
{
$username = $_POST['username'];
$password = $_POST['password'];
$this->assertEquals($username, 'jack', "用户名有误");
$this->assertEquals($password, '9cbf8a4dcb8e30682b927f352d6559a0', "密码有误");
}
}
```
#### 9)因为我们之前在UnitTestCase.php的setUp()中做了一些服务的依赖注入,以及在TestHelper.php中注册了相关的空间,并引入了Autoload相关文件。到此你就可以开心的编写你所想要的单元测试代码了。原文附上tests文件夹,仅供参考,如发现错误,还望指出。谢谢~
#### 10)原文参考了Phalcon官网提供的相关单元测试文章,下面有相关链接:
[PhalconTestUnit](https://docs.phalconphp.com/3.4/en/unit-testing.html) 👈点击左侧"PhalconTestUnit"查看相关文章