📝

Laravel9 テスト用DBの作成と実行

2024/02/18に公開

はじめに

Laravelのテストを学習し始めて、テスト用DBの作成とDBのテストについて学んだので記録として残そうと思います。

環境

  • Docker-compose
  • Laravel 9.19
  • PHP 8.1

テスト準備手順

  1. テスト用DBの作成
    まずmysqlにログインして、テスト用DBを作成しておきます。
    mysql> create database test_laravel;
    
  2. .env.testingの作成
    プロジェクトのルートに.env.testingを作成することで、PHPUnitテストを実行するとき、または--env=testingオプションを指定してArtisanコマンドを実行するときに、.envファイルの代わりに使用されます。
    .env.exampleをコピーして、.env.testingファイルを作成。
    cp .env.example .env.testing
    
  3. .env.testingの編集
    test用のキーを作成する。
    php artisan key:generate --env=testing
    
    APP_ENVをtestingに変更。また、DB_DATABASEをMYSQLで作成した、DB名に変更する。
    .env.testing
    APP_ENV=testing
     
    DB_DATABASE=test_laravel
    
  4. phpunit.xmlの編集
    name="DB_DATABASE"の行のコメントアウトを外して、valueの値をMYSQLで設定したDB名に変更する。
    phpunit.xml
     <env name="DB_DATABASE" value="test_laravel"/>
    

テストの実行

  1. テストの作成
     php artisan make:test MainTest
    
    下記のテストでは、まずSeedを実行してテスト用データベースにダミーのデータを保存しています。
    また、新規ユーザーが登録されたときにデータベースに保存されているかのテストをしています。
    MainTest.php
    <?php
    
    namespace Tests\Feature;
    
    use Illuminate\Support\Facades\Artisan;
    use Illuminate\Foundation\Testing\RefreshDatabase;
    use Illuminate\Foundation\Testing\WithFaker;
    use Tests\TestCase;
    
    class MainTest extends TestCase
    {
        use RefreshDatabase;
    
        public function setUp(): void
        {
            parent::setUp();
    
            // テスト用データベースに seed を実行する
            Artisan::call('migrate:fresh --seed');
        }
    
        /**
         * A basic feature test example.
         *
         * @return void
         */
        public function test_ユーザーを新規登録してDBに保存ができるか()
        {
            $data = [
                'name'                  => 'test',
                'email'                 => 'test@email.com',
                'password'              => 'test12345',
                'password_confirmation' => 'test12345',
            ];
    
            $response = $this->postJson(route('register'), $data);
    
            $response->assertStatus(302)
                ->assertRedirect('/');
    
            $this->assertDatabaseHas('users', [
                'name'    => 'test',
                'email'   => 'test@email.com',
            ]);
        }
    }
    
  2. テストの実行
    php artisan test php artisan test tests/Feature/MainTest.php
    

Discussion