LaravelのRefreshDatabaseはいつ実行されるか、なにを実行しているか

いつ実行されるか

前提として、PHPUnitでのsetUp()等の実行タイミングから。

  1. setUpBeforeClass()がテストクラスごとに、最初のテストメソッドの実行前に。
  2. setUp()がテストメソッドごとに、テストメソッド実行前に。
  3. tearDown()がテストメソッドごとに、テストメソッド実行後に。
  4. tearDownAfterClass()がテストクラスごとに、最後のテストメソッドの実行後に。

以下が詳しい。

4. フィクスチャ — PHPUnit latest Manual

このうち、RefreshDatabaseの実行は、setUp()のタイミングで行われる。

ただし毎回は実行されない。一度実行されるとRefreshDatabaseState::$migratedが真になり、このクラス変数が真の場合は実行されないので、実質テストランナーの実行ごとに一度しか実行されない。

なにを実行しているか

php artisan migrate:fresh, ただしテストクラスでの指定によっては、--drop-views, --drop-types, --seedのオプションが有効になる。

たとえば--seedに関しては、テストクラスに$seedというプロパティを真で設定しておけば、有効になる。

おまけ

RefreshDatabaseは実際にはIlluminate\Foundation\Testing\TestCase内で実行されるため、PHPUnit\Framework\TestCaseを継承したクラスでuseしても駄目、Tests\TestCaseを継承する。