Laravel 的 JSON API 接口自动化测试

文章目录

    这两天写了几个接口,赶得急,完全没有测试。上线之后,前端的同事一调用,各种 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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式