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. Ubuntu下搭建FTP服务器图解

    在Linux中ftp服务器的全名叫 vsftpd,我们需要利用相关命令来开启安装ftp服务器,然后再在vsftpd.conf中进行相关配置,下面我来介绍在Ubuntu中vsftpd安装与配置增加用户的 ...

  2. [BZOJ4027]兔子与樱花

    4027: [HEOI2015]兔子与樱花 Time Limit: 10 Sec  Memory Limit: 256 MB Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突 ...

  3. 【刷题】BZOJ 2152 聪聪可可

    Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一般情况下石头剪刀布就好 ...

  4. redis的自带VM(虚拟内存)

    Redis支持采用VM技术,以达到当数据超过设置的可使用的物理内存的时候能够正常运行.当数据超过物理内存的时候,把一部分数据写入磁盘中的一块空间来代替物理内存. vm-enabled no       ...

  5. HDU 4584 splay

    Shaolin Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  6. jquery动态添加的元素绑定的事件不生效的问题

    我们可以通过 $(document).on('click', '#xxx', callback) 这种形式解决. 原因,一般情况下,我们是通过 $('#xxx').click(callback) 这种 ...

  7. Ambari和ClouderaManager主要不同对比

    打算对新建的hadoop集群使用管理工具,列了以下主要的不同点: 主要的不同点 apache Ambari ClouderaManager Express(免费版) 配置版本控制和历史记录 支持 不支 ...

  8. 数据压缩算法之哈夫曼编码(HUFFMAN)的实现

    HUFFMAN编码可以很有效的压缩数据,通常可以压缩20%到90%的空间(算法导论).具体的压缩率取决于数据的特性(词频).如果采取标准的语料库进行编码,一般可以得到比较满意的编码结果(对不同文件产生 ...

  9. 「Python」python与微信

    pip3 install itchat 主要用到的方法: itchat.login() 微信扫描二维码登录 itchat.get_friends() 返回完整的好友列表,每个好友为一个字典, 其中第一 ...

  10. 分布式监控系统开发【day37】:监控数据如何存储(七)

    一.如何存储 二.目录结构 三.代码调用逻辑关系 四.实现代码 1.data_optimization 1.存筛选出来符合条件的数据 def get_data_slice(self,lastest_d ...