Laravel

「Lumen」でテストを実装

Laravel」でAPIを実装する場合、テスト機能を使用して実装に問題がないか確認する事ができます。
しかし、「Lumen」では「Laravel」と違って、「php artisan test」が使用できません。
実行した場合に、以下のメッセージが表示されます。

ERROR  Command "test" is not defined.

「Lumen」でのユニットの実行

「Lumen」では、以下の様に「phpunit」を使ってテストします。

$ vendor/bin/phpunit

また個別にテストする場合は、以下の様にパスを指定します。

$ vendor/bin/phpunit tests/ExampleTest.php

テスト用データベースの設定

テストを実行する場合、テスト用のデータベースを作成してテストを行います。
今回は、そこまで手順をまとめます。
まずは「phpunit.xml」に、テスト用データベースを定義します。

...省略
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="QUEUE_CONNECTION" value="sync"/>
        <env name="DB_DATABASE" value="dbname_test"/>
    </php>
...省略

tests/TestCase.php」に、テストを実行時にテスト用のデータベースを作成しデータを登録するように処理を書きます。

<?php

namespace Tests;

use Laravel\Lumen\Testing\TestCase as BaseTestCase;
use Illuminate\Support\Facades\Artisan;

abstract class TestCase extends BaseTestCase
{
    /**
     * Creates the application.
     *
     * @return \Laravel\Lumen\Application
     */
    public function createApplication()
    {
        return require __DIR__.'/../bootstrap/app.php';
    }

    /**
     * テスト開始処理
     * @return void
     */
    public function setUp(): void
    {
        parent::setUp();

        // Database を作成
        Artisan::call('migrate');

        // Database テスト用データを作成
        Artisan::call('db:seed --class=TestDatabaseSeeder');
    }


    /**
     * テスト終了処理
     * @return void
     */
    public function tearDown(): void
    {
        // Database migration reset
        Artisan::call('migrate:reset');

        parent::tearDown();
    }
}

上記の処理で、テスト実行時に「setUp()」が実行されて、データベースの「migrate」を実行し、テストデータのSeederが実行されます。
そしてテスト終了後に「tearDown()」でデータベースをリセットして削除します。