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. Round 403 div. 2

    B 可以二分相遇的坐标:也可以二分时间,判断是否存在两个人的区间没有交. An easy way to intersect a number of segments [l1, r1], ..., [l ...

  2. JAVA本地TXT文件解决中文乱码问题

    import java.io.*; public class ReadFile { public static void main(String[] args) { try { File file = ...

  3. Uoj308【UNR #2】UOJ拯救计划

    分析:比较难分析的一道题,先把式子写出来,ans=∑C(k,i)*f(i),f(i)是选i个颜色的方案数.这个模数有点奇怪,比较小而且是合数,说不定就会有某种规律,如果i >= 3,可以发现C( ...

  4. HDU 6038

    Function Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  5. OpenCV---Canny边缘提取

    一:Canny算法介绍 Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 好的检测- 算法能够尽可能多地标识出图像中的实际边缘. 好的定位- 标识出的边缘要尽可能与实际图像中的实 ...

  6. 解决vue路由与锚点冲突

    传统的锚点定位会与vue-router中的路由设置存在冲突,解决方法自定义锚点跳转: html: <ul> <li><a href="" @click ...

  7. angularJs 跨控制器与跨页面传值

    虽然网上概括了四种或更多的传值方式,但我现在用的顺手的就两种 首先要知道AngularJs可以构建一个单页面应用程序,所以我划分为跨控制器传值 和 跨页面传值 两类 1.跨控制器传值—— $rootS ...

  8. 817E. Choosing The Commander trie字典树

    LINK 题意:现有3种操作 加入一个值,删除一个值,询问pi^x<k的个数 思路:很像以前lightoj上写过的01异或的字典树,用字典树维护数求异或值即可 /** @Date : 2017- ...

  9. Keras学习笔记1--基本入门

    """ 1.30s上手keras """ #keras的核心数据结构是“模型”,模型是一种组织网络层的方式,keras 的主要模型是Sequ ...

  10. Network File System

    Network File System 2014-12-31 #system 接着上一篇博客Distributed Systems 分布式系统来扯淡,之前的博客一再在写文件系统,这次继续,只不过是分布 ...