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. [codeforces743E]Vladik and cards

    E. Vladik and cards time limit per test  2 seconds memory limit per test  256 megabytes input standa ...

  2. 【CodeChef PREFIXOR】Prefix XOR

    https://odzkskevi.qnssl.com/f0fbdb108ec813b1294f8f714805963b?v=1502083692 网上搜到的题解: http://blog.csdn. ...

  3. Spring中使用要点集合

    1.InitializingBean和init-method方法 Spring的InitializingBean为bean提供了定义初始化方法的方式.InitializingBean是一个接口,它仅仅 ...

  4. Tornado----自定义异步非阻塞Web框架:Snow

    Python的Web框架中Tornado以异步非阻塞而闻名.本篇将使用200行代码完成一个微型异步非阻塞Web框架:Snow. 一.源码 本文基于非阻塞的Socket以及IO多路复用从而实现异步非阻塞 ...

  5. Redis基操

    Redis key-value类型的缓存数据库 指定IP和端口连接redis: ./redis-cli -h ip -p port Redis基本操作命令 命令 返回值 简介 ping PONG 测试 ...

  6. Mysql千万级大表优化策略

    1.优化sql以及索引 1.1优化sql 1.有索引但未被用到的情况(不建议) (1)避免like的参数以通配符开头时 尽量避免Like的参数以通配符开头,否则数据库引擎会放弃使用索引而进行全表扫描. ...

  7. spoj694 DISUBSTR - Distinct Substrings

    Given a string, we need to find the total number of its distinct substrings. Input T- number of test ...

  8. 对于redis底层框架的理解(五)

    之前总结了redis的通讯流程,基本框架,epoll的封装等等,这次介绍下 redis对于select模型的封装 //select 模型 typedef struct aeApiState { //读 ...

  9. div 画table尝试

    .left { float: left; } .table { border: solid 1px black; width: 750px; } .tr { width: 100%; height: ...

  10. js获取本周、上周的开始结束时间

    这两天在做一个报表体统,其中涉及到了一个根据本周,上周,本月,上月的时间来进行查询的问题,在这个我就教一下大家怎么实现,大家如果有更好的实现方法的,我也希望大家能说出来,我们交流交流. 首先呢,我写了 ...