Laravel 的 JSON API 接口自动化测试

更新日期: 2018-09-10 阅读次数: 16197 分类: Laravel

这两天写了几个接口,赶得急,完全没有测试。上线之后,前端的同事一调用,各种 500 错误。。。

甚是尴尬,老脸有点兜不住,所以今天决定把新增的接口 API 都加上自动化测试。

Laravel 自带了两种测试类型

  • Feature Test: 功能测试。针对类似接口这种流程性的测试。
  • Unit Test: 单元测试。针对单个函数这种输入输出结果的测试。

新建一个 Feature Test

php artisan make:test FinishOrderTest

项目根目录下多了一个文件

tests/Feature/FinishOrderTest.php

安装 phpunit

要执行测试案例,就需要安装 phpunit,否则会报错

zsh: command not found: phpunit

安装方法

composer require --dev phpunit/phpunit

注意,最好不要指定版本安装

[InvalidArgumentException] Package phpunit/phpunit at version ^7 has a PHP requirement incompatible with your PHP version (7.0.18)

执行测试案例

./vendor/bin/phpunit

一个订单相关的测试案例

cat tests/Feature/FinishOrderTest.php 
<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
use App\User;
use App\Models\Order;

class FinishOrderTest extends TestCase
{
    // use RefreshDatabase;
    
    public function testFinishOrderAPI()
    {
        $user = factory(User::class)->create(['email' => 'user4@test.com']);
        $token = $user->createToken('token', [])->accessToken;
        $headers = ['Authorization' => "Bearer $token"];
        $order = Order::orderBy("id", "desc")->first();

        $this->json('post', '/api/finish_order',
            ["order_id" => $order->order_id,], $headers)
                        ->assertStatus(200);
    }
}

测试数据重置

对于没有使用 migraton 的项目,不要作死使用

use RefreshDatabase;

他的重置原理是重新运行 migrate, 删除所有数据表,然后执行 migrate 重建。。。

在没有 migration 文件的情况下,这就是作死。。。

为何要使用 factory

参考: https://laravel-news.com/learn-to-use-model-factories-in-laravel-5-1

可以同时使用在 seed 和 test case 中。用于自动生成伪造数据,例如 name, email 等。

参考代码

cat database/factories/UserFactory.php 
<?php

use Faker\Generator as Faker;

$factory->define(App\User::class, function (Faker $faker) {
    static $password;

    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => $password ?: $password = bcrypt('secret'),
        'remember_token' => str_random(10),
    ];
});

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式

谈笑风生

chaly

使用测试配置,.env.testing,JWT_SECRET也重新生成了。但是生成的token就是无法认证,一直401?