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 ...
随机推荐
- 框架----Django之Form提交验证(一)
一.Form提交验证与Ajax提交验证的运用实例 Form表单提交时会刷新页面,输入失败时,输入框内内容也会随之刷新不能保留:而Ajax提交是在后台偷偷提交,不会刷新页面,因此也就可以保留页面输入框内 ...
- vector 一边遍历一边删除
for(std::vector<int>::iterator it = m_ConnectId.begin();it!=m_ConnectId.end();){ ) < ){ m_C ...
- linux根据进程pid查看进程详细信息
http://note.youdao.com/noteshare?id=af2fdd34e3adfacda2d34706e16e5045
- helm 安装prometheus operator 并监控ingress
1.helm安装 curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.shchmod 7 ...
- python--文件操作删除某行
使用continue跳过本次写循环就可以了 #文本内容 Yesterday when I was young 昨日当我年少轻狂 The tasting of life was sweet 生命的滋味是 ...
- cmd编译java程序出现:找不到或无法加载主类的原因以及解决办法 以及 给java的main方法传递args参数
原因: 1.java源程序中没有主类main方法. 2.java源程序中包含有eclipse等IDE工具生成的package包. 解决办法(对应以上的原因): 1.运行含有main的类 2.将java ...
- Java集合框架(list,Queue)
List和Queue都继承自Collection接口 list常规用法 List判断两个对象相等的标准:equals方法返回true class A2 { public boolean equals( ...
- jQuery中deferred的对象使用
什么是deferred对象 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作.其中,既有异步的操作(比如ajax读取服务器数据),也有同步的操作(比如遍历一个大型数组),它们都不是 ...
- Debian sudo自动补全
解决 debian sudo TAB 键不能自动补全命令的原因 一般情况,命令行输入 sudo apt-get ins 按 tab ,它后面会自动补全为 install 如果右面写了包的名的一部分,按 ...
- React-music 全家桶项目
React-Music 全家桶项目 一.简介 该项目是基于React全家桶开发的一个音乐播放器,技术栈采用:Webpack + React + React-redux + React-router + ...