EasySwoole中進行單元測試
之前寫了一篇文章《phpunit的安裝以及在PhpStorm中的使用》,講述如何在IDE中安裝phpunit進行簡單的單元測試。但是單是這樣往往是不夠的,實際項目中在進行測試之前,還需要初始化很多配置信息,比如數據庫連接,核心組件的加載。今天再記錄一下在easyswoole中無需通過IDE安裝phpunit的情況下是如何進行單元測試。
1、准備工作
1)生成測試文件
2)生成的測試文件以及目錄 UnitTest/User/UserTest.php
3)UnitTest/BaseTest.php
這里貼下BaseTest.php代碼:

1 <?php 2 3 namespace UnitTest; 4 5 use Curl\Curl; 6 use EasySwoole\EasySwoole\Core; 7 use EasySwoole\EasySwoole\Logger; 8 use PHPUnit\Framework\TestCase; 9 10 /** 11 * BaseTest 12 * Class BaseTest 13 * Create With ClassGeneration 14 */ 15 class BaseTest extends TestCase 16 { 17 public static $isInit = 0; 18 19 /** @var Curl */ 20 public $curl; 21 public $apiBase = 'http://127.0.0.1:9501'; 22 protected $modelName; 23 24 25 public function request($action, $data = [], $modelName = null) 26 { 27 $modelName = $modelName ?? $this->modelName; 28 $url = $this->apiBase . $modelName . $action; 29 $curl = $this->curl; 30 Logger::getInstance()->info("<<<<<<<<<<【單元測試】 url = " . $url . ", data = " . json_encode($data, JSON_UNESCAPED_UNICODE)); 31 $curl->post($url, $data); 32 if ($curl->response) { 33 Logger::getInstance()->info(">>>>>>>>>>【單元測試】 response = " . json_encode($curl->response, JSON_UNESCAPED_UNICODE)); 34 } else { 35 echo 'Error: ' . $curl->errorCode . ': ' . $curl->errorMessage . " 36 "; 37 } 38 $this->assertTrue(!!$curl->response); 39 $this->assertEquals(200, $curl->response->code, $curl->response->msg); 40 return $curl->response; 41 } 42 43 /** 44 * 初始化配置以及預加載各核心組件 45 * @return bool|void 46 */ 47 public function setUp() 48 { 49 if (self::$isInit == 1) { 50 Logger::getInstance()->info("<<<<<<<<<isInit:".self::$isInit); 51 return true; 52 } 53 require_once dirname(__FILE__, 2) . '/vendor/autoload.php'; 54 defined('EASYSWOOLE_ROOT') or define('EASYSWOOLE_ROOT', dirname(__FILE__, 2)); 55 require_once dirname(__FILE__, 2) . '/EasySwooleEvent.php'; 56 Core::getInstance()->initialize()->globalInitialize(); 57 self::$isInit = 1; 58 Logger::getInstance()->info(">>>>>>>>>isInit:".self::$isInit); 59 $this->curl = new Curl(); 60 } 61 }
注意request()這個方法
這是測試中實際要請求的地址,對應的路由我們提前在App\HttpController\Router.php中配置
Api/User/User.php (控制器)
Api/Base.php(User.php繼承的父類)
2、在linux上運行easyswoole
這里開啟兩個shell,
1)其中一個運行easyswoole
2)另外一個執行phpunit命令
這里執行php easyswoole phpunit UnitTest/
那么如何解決呢?由於easyswoole文檔中對於phpunit的命令講解比較少
我們可以在easyswoole控制台執行:php easyswoole phpunit查看各參數用法
順便說一句,我之前就特別不願意看英文注釋,發自內心比較抵觸的那種。也不是看不懂,第一反應就是英文看着費勁,想快速地找到中文的答案。事實上,很多時候遇到問題到百度去搜索的結果千篇一律,還沒法解決。改變一下思維,耐心的去看下原本的英文文檔和注釋。答案非常清晰並且安靜地就在那兒。
然后這里看完,我們心里就應該明白,問題出在需要加上--bootstrap這個參數,它就是用來在測試運行前把文件加載進去的
我們再執行:php easyswoole phpunit --bootstrap UnitTest/BaseTest.php UnitTest/
結果正常,符合預期