###測試目錄結構###
測試文件主要在tests文件下面,主要有以下幾個文件夾
- mock 小核心文件,用于做文件加載,引入框架等操作。
- framework 真正的測試文件,和項目文件夾機構一致,但是里面都是測試文件
- think
- application
- public
- tests
- thinkphp
- 其他文件
###準備工作###
1. 判斷渲染,若果是測試環境則不執行測試,主要在library/think/app.php文件中,修改其中的第116行:
`if (defined('IN_UNIT_TEST')) {
return $data;
} else {
Response::returnData($data, Config::get('default_return_type'), Config::get('response_exit'));
}`
和129行
`if (defined('IN_UNIT_TEST')) {
return $data;
} else {
Response::returnData($data, Config::get('default_return_type'), Config::get('response_exit'));
}`
2. 修改config.php,添加重置配置函數:
`// 重置配置參數
public static function reset($name, $value = null, $range = ''){
self::$config = [];
}`
3. 添加mock文件,在文件中添加單元測試定義,以及請求定義,否則報錯。
`<?php
// 測試入口文件
define('IN_UNIT_TEST', true);
$_SERVER['REQUEST_METHOD'] = 'GET';
// 定義項目路徑
define('APP_PATH', __DIR__ . '/../application/');
// 開啟調試模式
define('APP_DEBUG', true);
// 加載框架引導文件
require __DIR__ . '/../thinkphp/start.php';`
###主要測試流程###
thinkphp5的測試的主要流程是跟think的系統流程是相似的,大體的流程為:
1. 引用bootstrap文件加載mock里的小框架文件,加載所需文件
2. 根據文件目錄,添加測試文件
3. 執行單元測試,輸出結果
###測試舉例###
例如測試thinkphp里的apc緩存,將分為以下幾個過程:
1. 在tests/framework文件夾下創建于apc.php目錄路徑(thinkphp\library\think\cache\driver)相同的apcTest.php文件。
2. 編寫測試文件
- 引用app和config
`use think\app;
use think\config;`
- 在setUp函數中設定require條件
`if(!extension_loaded('apc')){
$this->markTestSkipped('apc擴展不可用!');
};`
- 編寫測試用例
` public function testGet()
{
\think\Cache::connect(['type' => 'apc', 'expire' => 1]);
$this->assertTrue(\think\Cache::set('key', 'value'));
$this->assertEquals('value', \think\Cache::get('key'));
$this->assertTrue(\think\Cache::rm('key'));
$this->assertFalse(\think\Cache::get('key'));
$this->assertTrue(\think\Cache::clear('key'));
Config::reset();
}`
3. 回到根目錄執行單元測試命令:
`phpunit`
若想看到所有結果,請添加-v參數
`phpunit -v`
4. 輸出結果
###大家一起來###
單元測試的內容會跟框架同步,測試內容方方面面,是一個相對復雜的模塊,同時也是一個值得重視的部分。希望大家能夠多多提出意見,多多參與。如果你有任何問題或想法,可以隨時提issue,我們期待著收到聽大家的質疑和討論。