lumen 框架的特殊使用
1. 配置代码格式管理工具:
composer require squizlabs/php_codesniffer, 使用 php artisan cs 检查代码格式;
2.单元测试用例编写
1./database/factories/ModelFactory.php 中配置每个表的模拟数据,例:
- $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,其他的测试用例都继承这里,可以在这里配置统一的校验,统一响应格式,例,
- <?php
- use Laravel\Lumen\Testing\DatabaseMigrations;
- use Laravel\Lumen\Testing\DatabaseTransactions;
- abstract class TestCase extends \Laravel\Lumen\Testing\TestCase
- {
- use DatabaseTransactions;
- /**
- * Creates the application.
- *
- * @return \Laravel\Lumen\Application
- */
- public function createApplication()
- {
- return require __DIR__ . '/../bootstrap/app.php';
- }
- public function getData()
- {
- $this->assertResponseOk();
- return @json_decode($this->response->content(), true);
- }
- public function dump()
- {
- $content = $this->response->content();
- $data = @json_encode(@json_decode($content), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
- if (empty($data) || $data === 'null') {
- dd($content);
- }
- echo ($data) . PHP_EOL;
- die();
- }
- public function auth()
- {
- $user = factory('App\User')->make();
- return $this->actingAs($user);
- }
- public function signatureJson($uri, $data = [], $method = 'GET', $user = null, $header = ['Authorization' => 'c4ca4238a0b923820dcc509a6f75849b'])
- {
- if (empty($user)) {
- factory(App\User::class)->create(['authorization' => array_get($header, 'Authorization', '')]);
- }
- if (is_array($data) || is_string($data)) {
- $timestamp = \Carbon\Carbon::now()->getTimestamp();
- if (is_string($data)) {
- $data = @json_decode($data);
- }
- $data['timestamp'] = $timestamp;
- ksort($data);
- $signature = sha1(config('signature.key') . array_get($header, 'Authorization', '') . http_build_query($data));
- $data['signature'] = $signature;
- return $this->json($method, $uri, $data, $header);
- }
- $this->assertEquals(1, 0, 'params data invalid.');
- }
- }
- 3.用例的编写,例:
- <?php
- class TaskAPITest extends TestCase
- {
- public function testTaskListSuccess()
- {
- $apps = factory(App\Models\Application::class, 8)->create();
- foreach ($apps as $app) {
- $task = factory(App\Models\Task::class)->create(['app_id' => $app->id]);
- factory(App\Models\TaskDetail::class)->create([
- 'task_id' => $task->id,
- 'step' => \App\Models\TaskDetail::TASK_INITIAL,
- 'user_id' => 0
- ]);
- }
- $this->signatureJson('api/v1/task/list', [
- 'type' => 1,
- 'page' => 1,
- 'limit' => 10
- ]);
- $this->seeJsonContains([
- 'code' => 1,
- 'message' => 'success',
- ]);
- $data = $this->getData();
- $this->assertEquals(8, array_get($data, 'data.total'));
- }
- public function testTaskDetailSuccess()
- {
- $app = factory(App\Models\Application::class)->create();
- $task = factory(App\Models\Task::class)->create(['app_id' => $app->id]);
- $this->signatureJson('api/v1/task/info', ['taskId' => $task->id]);
- $data = $this->getData();
- $this->assertEquals($task->id, array_get($data, 'data.id'));
- $this->seeJsonContains([
- 'code' => 1,
- 'message' => 'success'
- ]);
- }
- public function testTaskGotDetailSuccess()
- {
- $app = factory(App\Models\Application::class)->create();
- $task = factory(App\Models\Task::class)->create(['app_id' => $app->id]);
- $authorization = str_random(32);
- $user = factory(App\User::class)->create(['authorization' => $authorization]);
- factory(App\Models\TaskDetail::class)->create([
- 'task_id' => $task->id,
- 'user_id' => $user->id,
- 'status' => \App\Models\TaskDetail::TASK_INITIAL
- ]);
- $this->expectsEvents(\App\Events\TaskGetEvent::class);
- $this->signatureJson('api/v1/task/draw', ['taskId' => $task->id], 'POST', $user, ['Authorization' => $authorization]);
- $this->signatureJson('api/v1/task/info', ['taskId' => $task->id]);
- $this->seeInDatabase('task_details', [
- 'task_id' => $task->id,
- 'user_id' => $user->id,
- 'status' => \App\Models\TaskDetail::TASK_INITIAL,
- 'step' => \App\Models\TaskDetail::WORKING
- ]);
- $data = $this->getData();
- $this->assertEquals(2, array_get($data, 'data.step'));
- $this->assertEquals($task->id, array_get($data, 'data.id'));
- $this->seeJsonContains([
- 'code' => 1,
- 'message' => 'success'
- ]);
- }
- public function testTaskErrorSuccess()
- {
- $authorization = str_random(32);
- $taskError = factory(App\Models\TaskError::class)->make();
- $app = factory(App\Models\Application::class)->create();
- $task = factory(App\Models\Task::class)->create(['app_id' => $app->id]);
- $user = factory(App\User::class)->create(['authorization' => $authorization]);
- factory(App\Models\TaskDetail::class)->create([
- 'task_id' => $task->id,
- 'user_id' => $user->id,
- 'status' => \App\Models\TaskDetail::WORKING,
- 'step' => \App\Models\TaskDetail::WORKING
- ]);
- $this->expectsEvents(\App\Events\TaskErrorEvent::class);
- $taskError->taskId = $task->id;
- $taskError = $taskError->toArray();
- $this->signatureJson('api/v1/task/error', $taskError, 'POST', $user, ['Authorization' => $authorization]);
- $this->seeInDatabase('task_errors', [
- 'task_id' => $task->id
- ]);
- $this->seeInDatabase('task_details', [
- 'task_id' => $task->id,
- 'user_id' => $user->id,
- 'step' => \App\Models\TaskDetail::INITIAL,
- ]);
- $this->seeJsonContains([
- 'code' => 1,
- 'message' => 'success'
- ]);
- }
- public function testTaskDoneSuccess()
- {
- $authorization = str_random(32);
- $user = factory(App\User::class)->create(['authorization' => $authorization]);
- $app = factory(App\Models\Application::class)->create();
- $task = factory(App\Models\Task::class)->create(['app_id' => $app->id]);
- factory(App\Models\TaskDetail::class)->create([
- 'task_id' => $task->id,
- 'user_id' => $user->id,
- 'step' => \App\Models\TaskDetail::WORKING,
- 'process' => 3,
- 'valid_status' => 1
- ]);
- $this->expectsEvents(\App\Events\TaskDoneEvent::class);
- $this->signatureJson('api/v1/task/complete', ['taskId' => $task->id], 'POST', $user, ['Authorization' => $authorization]);
- $this->seeInDatabase('task_details', [
- 'task_id' => $task->id,
- 'user_id' => $user->id,
- 'step' => \App\Models\TaskDetail::COMPLETED
- ]);
- $this->seeJsonContains([
- 'code' => 1,
- 'message' => 'success'
- ]);
- }
- public function testTaskDoneFailure()
- {
- $authorization = str_random(32);
- $user = factory(App\User::class)->create(['authorization' => $authorization]);
- $task = factory(App\Models\Task::class)->create();
- factory(App\Models\TaskDetail::class)->create([
- 'task_id' => $task->id,
- 'user_id' => $user->id,
- ]);
- $this->expectsEvents(\App\Events\TaskDoneEvent::class);
- $this->signatureJson('api/v1/task/complete', ['taskId' => $task->id], 'POST', $user, ['Authorization' => $authorization]);
- $this->assertResponseStatus(422);
- $this->seeJsonContains([
- 'code' => \App\Exceptions\BusinessException::EX_STEP_NO_VALIDATION,
- 'message' => 'fail'
- ]);
- }
- public function testTaskCancelNotFoundFailure()
- {
- $authorization = str_random(32);
- $user = factory(App\User::class)->create(['authorization' => $authorization]);
- $app = factory(App\Models\Application::class)->create();
- $task = factory(App\Models\Task::class)->create(['app_id' => $app->id]);
- factory(App\Models\TaskDetail::class)->create([
- 'task_id' => $task->id,
- 'user_id' => $user->id + 1,
- 'step' => \App\Models\TaskDetail::WORKING
- ]);
- $this->expectsEvents(\App\Events\TaskCancelEvent::class);
- $this->signatureJson('api/v1/task/giveUp', ['taskId' => $task->id], 'POST', $user, ['Authorization' => $authorization]);
- $this->assertResponseStatus(422);
- $this->seeJsonContains([
- 'code' => \App\Exceptions\BusinessException::EX_TASK_INFO_EMPTY,
- 'message' => 'fail'
- ]);
- }
- public function testTaskCancelNoPermissionSuccess()
- {
- $authorization = str_random(32);
- $user = factory(App\User::class)->create(['authorization' => $authorization]);
- $task = factory(App\Models\Task::class)->create();
- factory(App\Models\TaskDetail::class)->create([
- 'task_id' => $task->id,
- 'user_id' => $user->id,
- 'status' => \App\Models\TaskDetail::INITIAL
- ]);
- $this->expectsEvents(\App\Events\TaskCancelEvent::class);
- $this->signatureJson('api/v1/task/giveUp', ['taskId' => $task->id], 'POST', $user, ['Authorization' => $authorization]);
- $this->assertResponseStatus(422);
- $this->seeJsonContains([
- 'code' => \App\Exceptions\BusinessException::EX_STEP_NO_PERMISSION,
- 'message' => 'fail'
- ]);
- }
- public function testTaskCancelSuccess()
- {
- $authorization = str_random(32);
- $user = factory(App\User::class)->create(['authorization' => $authorization]);
- $app = factory(App\Models\Application::class)->create();
- $task = factory(App\Models\Task::class)->create(['app_id' => $app->id]);
- factory(App\Models\TaskDetail::class)->create([
- 'task_id' => $task->id,
- 'user_id' => $user->id,
- 'step' => \App\Models\TaskDetail::WORKING
- ]);
- $this->expectsEvents(\App\Events\TaskCancelEvent::class);
- $this->signatureJson('api/v1/task/giveUp', ['taskId' => $task->id], 'POST', $user, ['Authorization' => $authorization]);
- $this->notSeeInDatabase('task_details', [
- 'task_id' => $task->id,
- 'user_id' => $user->id,
- ]);
- $this->seeJsonContains([
- 'code' => 1,
- 'message' => 'success'
- ]);
- }
- public function testTaskReportSuccess()
- {
- $authorization = str_random(32);
- $taskReport = factory(App\Models\TaskReport::class)->make();
- $user = factory(App\User::class)->create(['authorization' => $authorization]);
- $app = factory(App\Models\Application::class)->create();
- $task = factory(App\Models\Task::class)->create(['app_id' => $app->id]);
- factory(App\Models\TaskDetail::class)->create([
- 'task_id' => $task->id,
- 'user_id' => $user->id,
- 'step' => \App\Models\TaskDetail::WORKING
- ]);
- $this->expectsEvents(\App\Events\TaskReportEvent::class);
- $taskReport->taskId = $task->id;
- $taskReport = $taskReport->toArray();
- unset($taskReport['id']);
- unset($taskReport['task_id']);
- $this->signatureJson('api/v1/task/report', $taskReport, 'POST', $user, ['Authorization' => $authorization]);
- $this->seeInDatabase('task_reports', [
- 'task_id' => $task->id
- ]);
- $this->seeJsonContains([
- 'code' => 1,
- 'message' => 'success'
- ]);
- }
- public function testUserValidateFailure()
- {
- $authorization = str_random(32);
- $task = factory(App\Models\Task::class)->create();
- $user = factory(App\User::class)->create(['authorization' => $authorization]);
- $this->signatureJson('api/v1/task/draw', ['taskId' => $task->id], 'POST', $user, ['Authorization' => '1c4ca4238a0b923820dcc509a6f75849b']);
- $this->seeJsonContains([
- 'code' => 0,
- 'message' => 'fail',
- "errors" => [
- "Unauthorized"
- ]
- ]);
- }
- }
4.命令行执行 php artisan unit
lumen 框架的特殊使用的更多相关文章
- Lumen框架搭建指南
新人从java转php,到新公司搭建lumen框架,lumen官方文档的坑不是一般的多,对新手极其不友好,记录下我搭建过程,希望对小白们有所帮助. 首先看下官方文档:https://lumen.lar ...
- Lumen框架—升级改造之路-开篇
一.前言 首先,我先阐述下,为什么要做这件事.lumen是一款比较轻型的PHP框架,但是,作为项目开发来说,它还是缺少很多东西,比如Response返回值规范的自定义,异常抛出格式的自定义,以及 ...
- lumen框架使用Elasticsearch详解
该博文是集合几个博客踩坑得来的,百度热搜前几篇都是缺胳膊少腿的,所以结合几篇博客实现了一遍. 一.lumen使用Elasticsearch 首先需要搭建好的elasticsearch环境: http: ...
- Laravel / Lumen 框架修改 创建时间 和 更新时间 对应字段
为避免浪费时间--先上解决方案 在Model中重写 CREATED_AT 和 UPDATED_AT 两个类常量就可以了,这两个常量分别是创建时间和更新时间的字段名. ================= ...
- Lumen框架—升级改造之路-仓储层
仓储层与逻辑层搭建 Lumen官方文档:https://lumen.laravel.com/docs/5.5 我的项目地址:https://github.com/BusinessL/big-lume ...
- Lumen框架-错误&日志
介绍 当你开始一个新的Lumen项目的时候,错误和异常功能,已经在框架中注入了.此外,Lumen还集成了Monolog日志函数,支持和提供多种强大的日志处理功能. 配置 错误详情 大量的错误信息在你的 ...
- LUMEN框架多数据库连接配置方法
LUMEN作为一款API导向很浓的框架,配置极简化,默认只支持一路DB配置 然而随着业务复杂度的提高,引入多个数据库连接似乎无法避免,下面介绍一下LUMEN连接多个数据库的配置方法: 修改.env文件 ...
- lumen框架
1,获取配置 app(); 说明:app()返回的是全局唯一的application对象,该对象的原型是Laravel\Lumen\Application 加载配置文件(config/app.php) ...
- Lumen框架使用Redis与框架Cache压测比较
使用命令 ab -c 20000 -n 100000 'http://127.0.0.1:9050/v1/api.store.xxx'进行压测,并同时进行了交叉测试,结果如下: 高并发情况下数据目前没 ...
- lumen框架的辅助函数
简介 Laravel 包含一些多样化的 PHP 辅助函数函数.许多在 Laravel 自身框架中使用:如果你觉得实用,也可以在你应用当中使用. 可用方法 数组 array_add array_coll ...
随机推荐
- P4622 [COCI2012-2013#6] JEDAN
题目背景 COCI 题目描述 有N个数排成一行(数值代表高度),最初所有的数都为零,你可以选择连续的一段等高的数,将它们都增加1(除了开头和结尾那个数)如下图表示了两次操作: 现在有一些数字看不清了, ...
- P2323 [HNOI2006]公路修建问题
题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 输入输出样例 输入样例#1: 4 2 5 1 2 6 5 1 3 3 1 2 3 9 4 2 4 6 1 输出样例# ...
- 【BZOJ1565】【NOI2009】植物大战僵尸(网络流)
[BZOJ1565][NOI2009]植物大战僵尸(网络流) 题面 BZOJ 洛谷 题解 做了这么多神仙题,终于有一道能够凭借自己智商能够想出来的题目了.... 好感动. 这就是一个比较裸的最小割模型 ...
- URAL1519:Formula 1——题解
http://acm.timus.ru/problem.aspx?space=1&num=1519 https://vjudge.net/problem/URAL-1519 题目大意:给一个网 ...
- 洛谷 U14472 数据结构【比赛】 【差分数组 + 前缀和】
题目描述 蒟蒻Edt把这个问题交给了你 ---- 一个精通数据结构的大犇,由于是第一题,这个题没那么难.. edt 现在对于题目进行了如下的简化: 最开始的数组每个元素都是0 给出nnn,optopt ...
- skip-external-locking --mysql配置说明
MySQL的配置文件my.cnf中默认存在一行skip-external-locking的参数,即“跳过外部锁定”.根据MySQL开发网站的官方解释,External-locking用于多进程条件下为 ...
- 代码收藏系列--javascript--日期函数
/** * 获取当前时间的简短函数 * @returns {String} * @@example getTimeStamp() 结果是:2017-07-12 09:21:30 */ function ...
- python基础----封装、封装与扩展性
从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,还有egon和alex一起装进麻袋,然后把麻袋封上口子.但其实这种理解相当片面 首先我们要了解 要封装什么 你钱包的有多少钱(数 ...
- 简述this,call,apply,bind之间的关系
一.什么是this? this是JavaScript语言的一个关键字,它是函数运行时在函数体内部自动生成的一个对象,只能在函数体内部使用.函数的不同使用场合,this的指向不同. 在ES5中,this ...
- Python2和Python3共存安装
记录下: 先下载Python2.7.6,安装完成,不要添加到path中: 再下载Python3.4.3,安装,不要添加到path中. 进入 Python2: py -2 进入Python3: py - ...