1. 配置代码格式管理工具:

composer require squizlabs/php_codesniffer, 使用 php artisan cs 检查代码格式;

2.单元测试用例编写

  1./database/factories/ModelFactory.php 中配置每个表的模拟数据,例:

  1. $factory->define(App\Models\Task::class, function (Faker\Generator $faker) {
    return [
    'description' => $faker->streetAddress,
    'type' => $faker->randomElement(App\Models\Order::ORDER_TYPE),
    'app_id' => $faker->randomNumber(),
    'status' => rand(1, 5),
    'keyword' => str_random(5),
    'credit' => $faker->randomElement([508, 608, 708]),
    'total' => 100,
    'release' => 10,
    'done' => 10,
    'release_count' => 1,
    'toke_at' => $faker->dateTime()->format('Y-m-d H:i:s'),
    'end_at' => $faker->dateTime()->format('Y-m-d H:i:s'),
    ];
    });
      2./tests 中配置一个基础的 TestCase.php,其他的测试用例都继承这里,可以在这里配置统一的校验,统一响应格式,例,
        
  1. <?php
  2.  
  3. use Laravel\Lumen\Testing\DatabaseMigrations;
  4. use Laravel\Lumen\Testing\DatabaseTransactions;
  5.  
  6. abstract class TestCase extends \Laravel\Lumen\Testing\TestCase
  7. {
  8. use DatabaseTransactions;
  9.  
  10. /**
  11. * Creates the application.
  12. *
  13. * @return \Laravel\Lumen\Application
  14. */
  15. public function createApplication()
  16. {
  17. return require __DIR__ . '/../bootstrap/app.php';
  18. }
  19.  
  20. public function getData()
  21. {
  22. $this->assertResponseOk();
  23. return @json_decode($this->response->content(), true);
  24. }
  25.  
  26. public function dump()
  27. {
  28. $content = $this->response->content();
  29. $data = @json_encode(@json_decode($content), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
  30.  
  31. if (empty($data) || $data === 'null') {
  32. dd($content);
  33. }
  34. echo ($data) . PHP_EOL;
  35. die();
  36. }
  37.  
  38. public function auth()
  39. {
  40. $user = factory('App\User')->make();
  41. return $this->actingAs($user);
  42. }
  43.  
  44. public function signatureJson($uri, $data = [], $method = 'GET', $user = null, $header = ['Authorization' => 'c4ca4238a0b923820dcc509a6f75849b'])
  45. {
  46. if (empty($user)) {
  47. factory(App\User::class)->create(['authorization' => array_get($header, 'Authorization', '')]);
  48. }
  49.  
  50. if (is_array($data) || is_string($data)) {
  51. $timestamp = \Carbon\Carbon::now()->getTimestamp();
  52. if (is_string($data)) {
  53. $data = @json_decode($data);
  54. }
  55. $data['timestamp'] = $timestamp;
  56. ksort($data);
  57.  
  58. $signature = sha1(config('signature.key') . array_get($header, 'Authorization', '') . http_build_query($data));
  59. $data['signature'] = $signature;
  60. return $this->json($method, $uri, $data, $header);
  61. }
  62. $this->assertEquals(1, 0, 'params data invalid.');
  63.  
  64. }
  65. }
  1.   3.用例的编写,例:
  1. <?php
  2.  
  3. class TaskAPITest extends TestCase
  4. {
  5. public function testTaskListSuccess()
  6. {
  7. $apps = factory(App\Models\Application::class, 8)->create();
  8.  
  9. foreach ($apps as $app) {
  10. $task = factory(App\Models\Task::class)->create(['app_id' => $app->id]);
  11. factory(App\Models\TaskDetail::class)->create([
  12. 'task_id' => $task->id,
  13. 'step' => \App\Models\TaskDetail::TASK_INITIAL,
  14. 'user_id' => 0
  15. ]);
  16. }
  17.  
  18. $this->signatureJson('api/v1/task/list', [
  19. 'type' => 1,
  20. 'page' => 1,
  21. 'limit' => 10
  22. ]);
  23.  
  24. $this->seeJsonContains([
  25. 'code' => 1,
  26. 'message' => 'success',
  27. ]);
  28.  
  29. $data = $this->getData();
  30. $this->assertEquals(8, array_get($data, 'data.total'));
  31. }
  32.  
  33. public function testTaskDetailSuccess()
  34. {
  35. $app = factory(App\Models\Application::class)->create();
  36. $task = factory(App\Models\Task::class)->create(['app_id' => $app->id]);
  37.  
  38. $this->signatureJson('api/v1/task/info', ['taskId' => $task->id]);
  39.  
  40. $data = $this->getData();
  41.  
  42. $this->assertEquals($task->id, array_get($data, 'data.id'));
  43.  
  44. $this->seeJsonContains([
  45. 'code' => 1,
  46. 'message' => 'success'
  47. ]);
  48. }
  49.  
  50. public function testTaskGotDetailSuccess()
  51. {
  52. $app = factory(App\Models\Application::class)->create();
  53. $task = factory(App\Models\Task::class)->create(['app_id' => $app->id]);
  54.  
  55. $authorization = str_random(32);
  56. $user = factory(App\User::class)->create(['authorization' => $authorization]);
  57. factory(App\Models\TaskDetail::class)->create([
  58. 'task_id' => $task->id,
  59. 'user_id' => $user->id,
  60. 'status' => \App\Models\TaskDetail::TASK_INITIAL
  61. ]);
  62.  
  63. $this->expectsEvents(\App\Events\TaskGetEvent::class);
  64.  
  65. $this->signatureJson('api/v1/task/draw', ['taskId' => $task->id], 'POST', $user, ['Authorization' => $authorization]);
  66.  
  67. $this->signatureJson('api/v1/task/info', ['taskId' => $task->id]);
  68.  
  69. $this->seeInDatabase('task_details', [
  70. 'task_id' => $task->id,
  71. 'user_id' => $user->id,
  72. 'status' => \App\Models\TaskDetail::TASK_INITIAL,
  73. 'step' => \App\Models\TaskDetail::WORKING
  74. ]);
  75.  
  76. $data = $this->getData();
  77.  
  78. $this->assertEquals(2, array_get($data, 'data.step'));
  79.  
  80. $this->assertEquals($task->id, array_get($data, 'data.id'));
  81.  
  82. $this->seeJsonContains([
  83. 'code' => 1,
  84. 'message' => 'success'
  85. ]);
  86. }
  87.  
  88. public function testTaskErrorSuccess()
  89. {
  90. $authorization = str_random(32);
  91. $taskError = factory(App\Models\TaskError::class)->make();
  92. $app = factory(App\Models\Application::class)->create();
  93. $task = factory(App\Models\Task::class)->create(['app_id' => $app->id]);
  94. $user = factory(App\User::class)->create(['authorization' => $authorization]);
  95.  
  96. factory(App\Models\TaskDetail::class)->create([
  97. 'task_id' => $task->id,
  98. 'user_id' => $user->id,
  99. 'status' => \App\Models\TaskDetail::WORKING,
  100. 'step' => \App\Models\TaskDetail::WORKING
  101. ]);
  102.  
  103. $this->expectsEvents(\App\Events\TaskErrorEvent::class);
  104.  
  105. $taskError->taskId = $task->id;
  106. $taskError = $taskError->toArray();
  107.  
  108. $this->signatureJson('api/v1/task/error', $taskError, 'POST', $user, ['Authorization' => $authorization]);
  109.  
  110. $this->seeInDatabase('task_errors', [
  111. 'task_id' => $task->id
  112. ]);
  113.  
  114. $this->seeInDatabase('task_details', [
  115. 'task_id' => $task->id,
  116. 'user_id' => $user->id,
  117. 'step' => \App\Models\TaskDetail::INITIAL,
  118. ]);
  119.  
  120. $this->seeJsonContains([
  121. 'code' => 1,
  122. 'message' => 'success'
  123. ]);
  124. }
  125.  
  126. public function testTaskDoneSuccess()
  127. {
  128. $authorization = str_random(32);
  129.  
  130. $user = factory(App\User::class)->create(['authorization' => $authorization]);
  131. $app = factory(App\Models\Application::class)->create();
  132.  
  133. $task = factory(App\Models\Task::class)->create(['app_id' => $app->id]);
  134.  
  135. factory(App\Models\TaskDetail::class)->create([
  136. 'task_id' => $task->id,
  137. 'user_id' => $user->id,
  138. 'step' => \App\Models\TaskDetail::WORKING,
  139. 'process' => 3,
  140. 'valid_status' => 1
  141. ]);
  142.  
  143. $this->expectsEvents(\App\Events\TaskDoneEvent::class);
  144.  
  145. $this->signatureJson('api/v1/task/complete', ['taskId' => $task->id], 'POST', $user, ['Authorization' => $authorization]);
  146.  
  147. $this->seeInDatabase('task_details', [
  148. 'task_id' => $task->id,
  149. 'user_id' => $user->id,
  150. 'step' => \App\Models\TaskDetail::COMPLETED
  151. ]);
  152.  
  153. $this->seeJsonContains([
  154. 'code' => 1,
  155. 'message' => 'success'
  156. ]);
  157. }
  158.  
  159. public function testTaskDoneFailure()
  160. {
  161. $authorization = str_random(32);
  162.  
  163. $user = factory(App\User::class)->create(['authorization' => $authorization]);
  164.  
  165. $task = factory(App\Models\Task::class)->create();
  166.  
  167. factory(App\Models\TaskDetail::class)->create([
  168. 'task_id' => $task->id,
  169. 'user_id' => $user->id,
  170. ]);
  171.  
  172. $this->expectsEvents(\App\Events\TaskDoneEvent::class);
  173.  
  174. $this->signatureJson('api/v1/task/complete', ['taskId' => $task->id], 'POST', $user, ['Authorization' => $authorization]);
  175.  
  176. $this->assertResponseStatus(422);
  177.  
  178. $this->seeJsonContains([
  179. 'code' => \App\Exceptions\BusinessException::EX_STEP_NO_VALIDATION,
  180. 'message' => 'fail'
  181. ]);
  182. }
  183.  
  184. public function testTaskCancelNotFoundFailure()
  185. {
  186. $authorization = str_random(32);
  187.  
  188. $user = factory(App\User::class)->create(['authorization' => $authorization]);
  189.  
  190. $app = factory(App\Models\Application::class)->create();
  191.  
  192. $task = factory(App\Models\Task::class)->create(['app_id' => $app->id]);
  193.  
  194. factory(App\Models\TaskDetail::class)->create([
  195. 'task_id' => $task->id,
  196. 'user_id' => $user->id + 1,
  197. 'step' => \App\Models\TaskDetail::WORKING
  198. ]);
  199.  
  200. $this->expectsEvents(\App\Events\TaskCancelEvent::class);
  201.  
  202. $this->signatureJson('api/v1/task/giveUp', ['taskId' => $task->id], 'POST', $user, ['Authorization' => $authorization]);
  203.  
  204. $this->assertResponseStatus(422);
  205.  
  206. $this->seeJsonContains([
  207. 'code' => \App\Exceptions\BusinessException::EX_TASK_INFO_EMPTY,
  208. 'message' => 'fail'
  209. ]);
  210. }
  211.  
  212. public function testTaskCancelNoPermissionSuccess()
  213. {
  214. $authorization = str_random(32);
  215.  
  216. $user = factory(App\User::class)->create(['authorization' => $authorization]);
  217.  
  218. $task = factory(App\Models\Task::class)->create();
  219.  
  220. factory(App\Models\TaskDetail::class)->create([
  221. 'task_id' => $task->id,
  222. 'user_id' => $user->id,
  223. 'status' => \App\Models\TaskDetail::INITIAL
  224. ]);
  225.  
  226. $this->expectsEvents(\App\Events\TaskCancelEvent::class);
  227.  
  228. $this->signatureJson('api/v1/task/giveUp', ['taskId' => $task->id], 'POST', $user, ['Authorization' => $authorization]);
  229.  
  230. $this->assertResponseStatus(422);
  231.  
  232. $this->seeJsonContains([
  233. 'code' => \App\Exceptions\BusinessException::EX_STEP_NO_PERMISSION,
  234. 'message' => 'fail'
  235. ]);
  236. }
  237.  
  238. public function testTaskCancelSuccess()
  239. {
  240. $authorization = str_random(32);
  241.  
  242. $user = factory(App\User::class)->create(['authorization' => $authorization]);
  243.  
  244. $app = factory(App\Models\Application::class)->create();
  245.  
  246. $task = factory(App\Models\Task::class)->create(['app_id' => $app->id]);
  247.  
  248. factory(App\Models\TaskDetail::class)->create([
  249. 'task_id' => $task->id,
  250. 'user_id' => $user->id,
  251. 'step' => \App\Models\TaskDetail::WORKING
  252. ]);
  253.  
  254. $this->expectsEvents(\App\Events\TaskCancelEvent::class);
  255.  
  256. $this->signatureJson('api/v1/task/giveUp', ['taskId' => $task->id], 'POST', $user, ['Authorization' => $authorization]);
  257.  
  258. $this->notSeeInDatabase('task_details', [
  259. 'task_id' => $task->id,
  260. 'user_id' => $user->id,
  261. ]);
  262.  
  263. $this->seeJsonContains([
  264. 'code' => 1,
  265. 'message' => 'success'
  266. ]);
  267. }
  268.  
  269. public function testTaskReportSuccess()
  270. {
  271. $authorization = str_random(32);
  272. $taskReport = factory(App\Models\TaskReport::class)->make();
  273. $user = factory(App\User::class)->create(['authorization' => $authorization]);
  274. $app = factory(App\Models\Application::class)->create();
  275.  
  276. $task = factory(App\Models\Task::class)->create(['app_id' => $app->id]);
  277.  
  278. factory(App\Models\TaskDetail::class)->create([
  279. 'task_id' => $task->id,
  280. 'user_id' => $user->id,
  281. 'step' => \App\Models\TaskDetail::WORKING
  282. ]);
  283.  
  284. $this->expectsEvents(\App\Events\TaskReportEvent::class);
  285. $taskReport->taskId = $task->id;
  286. $taskReport = $taskReport->toArray();
  287. unset($taskReport['id']);
  288. unset($taskReport['task_id']);
  289.  
  290. $this->signatureJson('api/v1/task/report', $taskReport, 'POST', $user, ['Authorization' => $authorization]);
  291.  
  292. $this->seeInDatabase('task_reports', [
  293. 'task_id' => $task->id
  294. ]);
  295.  
  296. $this->seeJsonContains([
  297. 'code' => 1,
  298. 'message' => 'success'
  299. ]);
  300. }
  301.  
  302. public function testUserValidateFailure()
  303. {
  304. $authorization = str_random(32);
  305. $task = factory(App\Models\Task::class)->create();
  306. $user = factory(App\User::class)->create(['authorization' => $authorization]);
  307.  
  308. $this->signatureJson('api/v1/task/draw', ['taskId' => $task->id], 'POST', $user, ['Authorization' => '1c4ca4238a0b923820dcc509a6f75849b']);
  309.  
  310. $this->seeJsonContains([
  311. 'code' => 0,
  312. 'message' => 'fail',
  313. "errors" => [
  314. "Unauthorized"
  315. ]
  316. ]);
  317. }
  318. }

  4.命令行执行 php artisan unit

lumen 框架的特殊使用的更多相关文章

  1. Lumen框架搭建指南

    新人从java转php,到新公司搭建lumen框架,lumen官方文档的坑不是一般的多,对新手极其不友好,记录下我搭建过程,希望对小白们有所帮助. 首先看下官方文档:https://lumen.lar ...

  2. Lumen框架—升级改造之路-开篇

    一.前言    首先,我先阐述下,为什么要做这件事.lumen是一款比较轻型的PHP框架,但是,作为项目开发来说,它还是缺少很多东西,比如Response返回值规范的自定义,异常抛出格式的自定义,以及 ...

  3. lumen框架使用Elasticsearch详解

    该博文是集合几个博客踩坑得来的,百度热搜前几篇都是缺胳膊少腿的,所以结合几篇博客实现了一遍. 一.lumen使用Elasticsearch 首先需要搭建好的elasticsearch环境: http: ...

  4. Laravel / Lumen 框架修改 创建时间 和 更新时间 对应字段

    为避免浪费时间--先上解决方案 在Model中重写 CREATED_AT 和 UPDATED_AT 两个类常量就可以了,这两个常量分别是创建时间和更新时间的字段名. ================= ...

  5. Lumen框架—升级改造之路-仓储层

    仓储层与逻辑层搭建  Lumen官方文档:https://lumen.laravel.com/docs/5.5 我的项目地址:https://github.com/BusinessL/big-lume ...

  6. Lumen框架-错误&日志

    介绍 当你开始一个新的Lumen项目的时候,错误和异常功能,已经在框架中注入了.此外,Lumen还集成了Monolog日志函数,支持和提供多种强大的日志处理功能. 配置 错误详情 大量的错误信息在你的 ...

  7. LUMEN框架多数据库连接配置方法

    LUMEN作为一款API导向很浓的框架,配置极简化,默认只支持一路DB配置 然而随着业务复杂度的提高,引入多个数据库连接似乎无法避免,下面介绍一下LUMEN连接多个数据库的配置方法: 修改.env文件 ...

  8. lumen框架

    1,获取配置 app(); 说明:app()返回的是全局唯一的application对象,该对象的原型是Laravel\Lumen\Application 加载配置文件(config/app.php) ...

  9. Lumen框架使用Redis与框架Cache压测比较

    使用命令 ab -c 20000 -n 100000 'http://127.0.0.1:9050/v1/api.store.xxx'进行压测,并同时进行了交叉测试,结果如下: 高并发情况下数据目前没 ...

  10. lumen框架的辅助函数

    简介 Laravel 包含一些多样化的 PHP 辅助函数函数.许多在 Laravel 自身框架中使用:如果你觉得实用,也可以在你应用当中使用. 可用方法 数组 array_add array_coll ...

随机推荐

  1. P4622 [COCI2012-2013#6] JEDAN

    题目背景 COCI 题目描述 有N个数排成一行(数值代表高度),最初所有的数都为零,你可以选择连续的一段等高的数,将它们都增加1(除了开头和结尾那个数)如下图表示了两次操作: 现在有一些数字看不清了, ...

  2. P2323 [HNOI2006]公路修建问题

    题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 输入输出样例 输入样例#1: 4 2 5 1 2 6 5 1 3 3 1 2 3 9 4 2 4 6 1 输出样例# ...

  3. 【BZOJ1565】【NOI2009】植物大战僵尸(网络流)

    [BZOJ1565][NOI2009]植物大战僵尸(网络流) 题面 BZOJ 洛谷 题解 做了这么多神仙题,终于有一道能够凭借自己智商能够想出来的题目了.... 好感动. 这就是一个比较裸的最小割模型 ...

  4. URAL1519:Formula 1——题解

    http://acm.timus.ru/problem.aspx?space=1&num=1519 https://vjudge.net/problem/URAL-1519 题目大意:给一个网 ...

  5. 洛谷 U14472 数据结构【比赛】 【差分数组 + 前缀和】

    题目描述 蒟蒻Edt把这个问题交给了你 ---- 一个精通数据结构的大犇,由于是第一题,这个题没那么难.. edt 现在对于题目进行了如下的简化: 最开始的数组每个元素都是0 给出nnn,optopt ...

  6. skip-external-locking --mysql配置说明

    MySQL的配置文件my.cnf中默认存在一行skip-external-locking的参数,即“跳过外部锁定”.根据MySQL开发网站的官方解释,External-locking用于多进程条件下为 ...

  7. 代码收藏系列--javascript--日期函数

    /** * 获取当前时间的简短函数 * @returns {String} * @@example getTimeStamp() 结果是:2017-07-12 09:21:30 */ function ...

  8. python基础----封装、封装与扩展性

    从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,还有egon和alex一起装进麻袋,然后把麻袋封上口子.但其实这种理解相当片面 首先我们要了解 要封装什么 你钱包的有多少钱(数 ...

  9. 简述this,call,apply,bind之间的关系

    一.什么是this? this是JavaScript语言的一个关键字,它是函数运行时在函数体内部自动生成的一个对象,只能在函数体内部使用.函数的不同使用场合,this的指向不同. 在ES5中,this ...

  10. Python2和Python3共存安装

    记录下: 先下载Python2.7.6,安装完成,不要添加到path中: 再下载Python3.4.3,安装,不要添加到path中. 进入 Python2: py -2 进入Python3: py - ...