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 框架的特殊使用的更多相关文章

  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. 3.3 无连接运输:UDP

    3.3 无连接运输:UDP 简介: UDP提供不可靠的服务,它只做了运输层能做的最少工作,除了分解/复用以及少量的差错检测之外,几乎对IP没增加什么东西. 为什么应用开发人员宁愿再UDP之上构建应用, ...

  2. [CF1111C]Creative Snap

    题目大意:有一个长度为$2^n(n\leqslant30)$的格子,有$k(k\leqslant10^5)$个球,分布在这些格子中,有两种消灭格子的方法: 1. 若一段格子长度大于等于$2$,可以对半 ...

  3. Nowcoder 练习赛 23 D Where are you 解题报告

    Where are you 链接: https://ac.nowcoder.com/acm/contest/272/D 来源:牛客网 题目描述 小\(p\)和他的朋友约定好去游乐场游玩,但是他们到了游 ...

  4. Linux内核分析第七周———可执行程序的装载

    Linux内核分析第七周---可执行程序的装载 李雪琦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/US ...

  5. 洛谷P1948 [USACO08JAN]电话线Telephone Lines

    题目描述 Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is u ...

  6. Vue.js随笔三(npm init webpack my-project指令安装失败解决方案)

    如果没有安装淘宝给的镜像就先安装一下,指令如下,对!就是如此简单: npm install -g cnpm -registry=https://registry.npm.taobao.org 首先输入 ...

  7. 安装配置hexo icarus主题配置

    安装部分配置hexo icarus主题配置 安装icarus 直接下载主题模块放到blog项目 ,blog项目根目录执行 git clone https://github.com/ppoffice/h ...

  8. spring boot 2.0.3+spring cloud (Finchley)5、路由网关Spring Cloud Zuul

    Zuul作为微服务系统的网关组件,用于构建边界服务,致力于动态路由.过滤.监控.弹性伸缩和安全. 为什么需要Zuul Zuul.Ribbon以及Eureka结合可以实现智能路由和负载均衡的功能:网关将 ...

  9. Spring 5.0

    Spring 5.0都有什么新功能? 1.最低要求支持JDK8+, J2EE 7+. 2.移除了一些包.类及方法. 3.核心功能加强:全面应用jdk8并兼容jdk9等. 4.SpringMVC:支持s ...

  10. 10个基于 JavaScript 的 WYSIWYG 编辑器

    COMSHARP CMS 写道:在线编辑内容的时候,那些基于 JavaScript 的编辑器帮了我们大忙,这些所见即所得(WYSIWYG)编辑器,给我们提供了类似 Office 的操作体验.如今,任何 ...