# 附錄:單元測試
[TOC]
仿照PHPUnit提供一個簡易的單元測試框架
## TestCase
這是基類,請繼承。
## 方法
test開頭的public方法才能作為測試用例,其余將被忽略。
## setUpBeforeClass與tearDownAfterClass
setUpBeforeClass\(\) 與 tearDownAfterClass\(\) 模板方法將分別在測試用例類的第一個測試運行之前和測試用例類的最后一個測試運行之后調用
## setUp與tearDown
測試類的每個測試方法都會運行一次 setUp\(\) 和 tearDown\(\) 模板方法
## coroutineRequestHttpController
啟動一個http的模擬訪問。
```php
$testRequest = new TestRequest('/TestController/test');
$testResponse = yield $this->coroutineRequestHttpController($testRequest);
$this->assertEquals($testResponse->data, 'helloworld');
```
TestRequest中可以設置請求的一些方法。
testResponse為返回的數據。其中data為返回的值,其余見類成員。
## coroutineRequestTcpController
啟動一個tcp的模擬訪問
```php
if ($this->config['server']['pack_tool'] != 'JsonPack') {
$this->markTestSkipped('協議解包不是JsonPack');
}
$data = ['controller_name' => 'TestController', 'method_name' => 'test', 'data' => 'helloWorld'];
$reusult = yield $this->coroutineRequestTcpController($data);
$this->assertCount(2, $reusult);
```
$data傳進去的是一個協議體
$result是返回的服務器具體操作步驟,詳情可以自己打印。
---
特別注意這是模擬的方式,所以服務器不會產生任何的send操作,只是記錄操作。
使用controller內提供的方法才能被記錄,get\_instance\(\)的方法不會被記錄,可能還會產生錯誤。
## markTestSkipped
表示該測試被跳過。
## @needTestTask
標注needTestTask
被標注的將會在測試的時候額外進行task同步測試。
## @codeCoverageIgnore
標注codeCoverageIgnore
被標注的會在測試的時候被忽略
## @depends
標注depends
對測試方法之間的顯式依賴關系進行聲明。
被標注的將產生依賴,和phpunit一樣
```php
public function testEmpty()
{
$stack = [];
$this->assertEmpty($stack);
return $stack;
}
/**
* @depends testEmpty
*/
public function testPush(array $stack)
{
array_push($stack, 'foo');
$this->assertEquals('foo', $stack[count($stack)-1]);
$this->assertNotEmpty($stack);
return $stack;
}
/**
* @depends testPush
*/
public function testPop(array $stack)
{
$this->assertEquals('foo', array_pop($stack));
$this->assertEmpty($stack);
}
```
在上例中,第一個測試, testEmpty\(\),創建了一個新數組,并斷言其為空。隨后,此測試將此基境作為結果返回。第二個測試,testPush\(\),依賴于 testEmpty\(\) ,并將所依賴的測試之結果作為參數傳入。最后,testPop\(\) 依賴于 testPush\(\)。
## @dataProvider
標注dataProvider
測試方法可以接受任意參數。這些參數由數據供給器方法提供。用 @dataProvider 標注來指定使用哪個數據供給器方法。
數據供給器方法必須聲明為 public,其返回值要么是一個數組,其每個元素也是數組
例子:使用帶有命名數據集的數據供給器
```php
/**
* @dataProvider additionProvider
*/
public function testAdd($a, $b, $expected)
{
$this->assertEquals($expected, $a + $b);
}
public function additionProvider()
{
return [
'adding zeros' => [0, 0, 0],
'zero plus one' => [0, 1, 1],
'one plus zero' => [1, 0, 1],
'one plus one' => [1, 1, 3]
];
}
```
如果測試同時從 @dataProvider 方法和一個或多個 @depends 測試接收數據,那么來自于數據供給器的參數將先于來自所依賴的測試的。來自于所依賴的測試的參數對于每個數據集都是一樣的
例子: 在同一個測試中組合使用 @depends 和 @dataProvider
```php
public function provider()
{
return [['provider1'], ['provider2']];
}
public function testProducerFirst()
{
$this->assertTrue(true);
return 'first';
}
public function testProducerSecond()
{
$this->assertTrue(true);
return 'second';
}
/**
* @depends testProducerFirst
* @depends testProducerSecond
* @dataProvider provider
*/
public function testConsumer()
{
$this->assertEquals(
['provider1', 'first', 'second'],
func_get_args()
);
}
```
## 各種簡易斷言
assertEquals
assertEmpty
assertNotEmpty
………………
- Introduction
- SD 3.X文檔連接
- 導言
- 用戶案例
- 基于Swoole擴展分布式全棧開發框架
- 選擇SD框架助力企業開發
- 捐贈SwooleDistributed項目
- 框架性能報告
- 更新日志
- VIP服務福利
- 安裝與配置
- 【推薦】全自動安裝部署
- 環境要求
- 使用Composer安裝/更新SD框架
- 通過Docker安裝
- 代碼結構
- 啟動命令
- 服務器配置
- 服務器基礎配置server.php
- 客戶端協議配置client.php
- business.php
- log.php
- 微服務及集群配置consul.php
- fileHeader.php
- mysql.php
- redis.php
- 定時任務配置timerTask.php
- 服務器端口配置ports.php
- catCache.php
- 驗證服務啟動成功
- 微服務-Consul
- 日志工具-GrayLog
- 集群-Cluster
- 內核優化
- 入門教學
- 開發流程
- 開發前必讀
- 開發規范
- 基本流程
- 框架入口
- Model數據模型
- Controller控制器
- 協程
- 協程基礎
- 迭代器
- 調度器
- 使用協程的優勢
- 通過協程的方法屏蔽異步同步的區別
- Select多路選擇器
- 協程Sleep
- 通用協程方法
- 設置超時
- 設置無異常
- 設置降級函數
- initAsynPools
- dump
- 封裝器與路由器
- 封裝器
- sendToUid
- 路由器
- sendToUids
- 對象池
- 擴展組件
- 中間件
- Redis使用介紹
- RedisAsynPool
- Redis具體使用
- sendToAll
- RedisRoute
- Redis+Lua
- Mysql使用介紹
- MysqlAsynPool
- Mysql返回值
- 如何獲取構建的mysql語句
- 如何執行一個SQL
- 如何執行事務
- stopTask
- Mysql具體使用
- 異步客戶端
- Loader
- MqttClient
- model
- SdTcpRpcPool
- task
- HttpClientPool
- view
- TcpClientPool
- AMQP
- initialization
- Memory
- destory
- Cache
- Lock
- Pool
- EventDispatcher
- Process
- Cluster
- TimerTask
- Reload
- Consul
- Context
- 自定義進程
- 進程間RPC
- $http_input
- CatCache
- $http_output
- TimerCallBack
- 專題
- HTTP專欄
- TCP專欄
- 基礎知識
- WebSocket專欄
- 微服務
- Consul配置
- RPC
- REST
- AMQP異步任務系統
- MQTT簡易服務器
- Docker化以及資源編排
- 快速搭建公司內部統一的開發環境
- 使用HTTPS/WSS
- 訂閱/發布
- 游戲專題
- 類介紹
- AppServer
- clearState
- onOpenServiceInitialization
- SwooleDistributedServer
- get_instance
- kickUid
- bindUid
- unBindUid
- coroutineUidIsOnline
- coroutineCountOnline
- setTemplateEngine
- isWebSocket
- isTaskWorker
- getSocketName
- initAsynPools
- addAsynPool
- getAsynPool
- getServerAllTaskMessage
- Controller
- onExceptionHandle
- send
- sendToUid
- sendToUids
- sendToAll
- sendToGroup
- close
- getContext
- defaultMethod
- $redis_pool
- $mysql_pool
- $request_type
- $fd
- $uid
- $client_data
- $request
- $response
- $loader
- $logger
- $server
- $config
- Model
- initialization
- destory
- View
- Task
- stopTask
- HttpInput
- postGet
- post
- get
- getPost
- getAllPostGet
- getAllHeader
- getRawContent
- cookie
- getRequestHeader
- server信息
- getRequestMethod
- getRequestUri
- getPathInfo
- HttpOutput
- setStatusHeader
- setContentType
- setHeader
- end
- setCookie
- endFile
- 單元測試