EasySwoole中进行单元测试

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 }
View Code

       注意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/

 

结果正常,符合预期

 

posted @ 2020-08-14 10:59  欢乐豆123  阅读(675)  评论(2编辑  收藏  举报