web-dev-qa-db-ja.com

phpunit&paratest&Laravel-テストストレージディレクトリの作成におけるランダムな失敗

Phpunit、paratest、およびLaravelアプリケーションを使用して、テストスイートの実行を高速化するための並列テストアドオンを使用しています。これはほとんどの場合機能しますが、時々次のエラーが発生します。

League\Flysystem\Exception: Impossible to create the root directory "/codebuild/output/src0123456/src/github.com/org/repo/storage/framework/testing/disks/local". file_get_contents(/codebuild/output/src0123456/src/github.com/org/repo/.env): failed to open stream: No such file or directory

/codebuild/output/src0123456/src/github.com/org/repo/vendor/league/flysystem/src/Adapter/Local.php:112
/codebuild/output/src0123456/src/github.com/org/repo/vendor/league/flysystem/src/Adapter/Local.php:78
/codebuild/output/src0123456/src/github.com/org/repo/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.php:167
/codebuild/output/src0123456/src/github.com/org/repo/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:261
/codebuild/output/src0123456/src/github.com/org/repo/vendor/laravel/framework/src/Illuminate/Support/Facades/Storage.php:70
/codebuild/output/src0123456/src/github.com/org/repo/tests/TestCase.php:42

42行目のエラーは、テスト用のローカルストレージフォルダーを作成しているこの行に関連しています。

Storage::persistentFake();

例外は失敗に関連するエラーではなく、最後にログに記録されたエラーを選択するため、.envファイルに言及するエラーの後半は無関係です。

これはたまにしか発生しないため、一連の操作またはタイミングの問題である必要があります。

テストはPHP 7.3および7.4に対してAWSコードビルド環境内で実行され、失敗します。

誰かアイデアはありますか?

2
ArthurGuy

私の経験から、これは通常、ファイルシステムの問題ではありません。ほとんどの場合、正しくクリーンアップできないテストがありました。

ファイルシステムとParatestに応じて、テストは異なる順序で実行され、このエラーが発生します。

これを追跡するためにできることがいくつかあります。

  1. ビルド環境でテストを実行するときに_--debug_モードを有効にし、以前に実行されたすべてのテストを確認します。
  2. PHPUnit 7.3以降では、_--order-by=random_をローカルで使用してテストを異なる順序で実行し、ファイルシステムから読み取るときに表示されます。数回実行します。これをローカルでシミュレートできます。
  3. Flysystemを使用しているようです: Memory filesystem adapter を使用してテストを実行し、ファイルシステムの問題ではないことを確認してください。
  4. すべてのテストが(Testcase::setUp())の前にファイルシステムレイアウトを作成し、シャットダウン時にそれをクリーンアップすることを確認してください(TestCase::teatDown())。
  5. テストが変更される可能性のある値に依存しないことを確認してください。たとえば、日付を含むテストで問題が発生し、23:59にJenkinsでテストを実行しましたが、日付が翌日に切り替わったために失敗しました。それらのケースでは、テストを通じて作業する日付を渡します。
0
crash