LaravelのPHPUnitによるテストはテスト関数毎にsetUpとtearDownが実行され、クラスにuse RefreshDatabase;を書いておくとテスト関数ごとにDBが初期化される…と信じてテストを書いていたのですが何故かテスト関数単体指定だとテスト成功しファイル全体でテストした時だけ失敗することがありました。
対処
Laravelのルートにあるphpunit.xml
processIsolation="false"
を
processIsolation="true"
に変えるとテストが通るようになりました。
正直詳細はよくわかっていませんが、テスト間でリソース等が干渉してしまう可能性があり、processIsolationによって全て別プロセスで実行することにより解消できたようです。
参考:PHPUnit の TestCase のメンバはテストが完了するまで解放されない
TestCase クラスはテストの開始前にテストメソッドの数だけインスタンス化され(↑のように @dataProvider を使っている場合はさらにデータごと)、テストがすべて終わるまで解放されません(TestSuite が TestCase を握りっぱなしにするため)。
そのため、TestCase のメンバにオブジェクトや変数を保持させるとそれらはテストが完了するまで解放されません。
コメント