Laravel6 PHPUnitテスト実行時に、前処理でseederを実行する


前提

  • Larave6
  • PHP7.4
  • データベース作成済み
  • マイグレーション作成済み
  • シーダー作成済み

PHPUnitテストの前処理でseederを実行

use Illuminate\Support\Facades\Artisan; //Artisan::callを使うためにuse

class HogeTest extends TestCase
{
    private static $isSetUp = false; // setUpを一度だけ実行するためのコード

    protected function setUp():void //TestCaseのsetUpメソッドをオーバーライド
    {
        parent::setUp(); // 親クラスのメソッドを呼び出す

        if(self::$isSetUp === false) {

            Artisan::call('migrate:fresh --seed'); 
            self::$isSetUp = true;  
        }
    }
}

setUpメソッドを定義したテストクラスの、最初のメソッド実行前に、
php artisan migrate:fresh --seedコマンドを実行します。

parent::setUp()は親のsetUpメソッドの機能を使うために呼び出しています。

テストを実行

$ ./vendor/bin/phpunit tests

テスト実行するとデータベースにテストデータが挿入されます。

補足

setUpBeforeClassArtisan::callが使えなかったため、代替案としてこの実装方法にしました。問題なく動作するのであれば今回実装したsetUpメソッドよりsetUpBeforeClassで実装した方が良いかもしれません。

  
以下はどちらも、テストクラスで最初に実行されるメソッドの直前で一度だけ実行されます

setUpメソッド

private static $isSetUp = false;

protected function setUp():void
{
      parent::setUp();

      if(self::$isSetUp === false) {

          self::$isSetUp = true; 
      }
}

setUpBeforeClassメソッド

public static function setUpBeforeClass(): void
{

}

参考