phpunit & paratest & Laravel - Случайные сбои при создании каталога хранилища тестов - PullRequest
2 голосов
/ 29 мая 2020

Я использую модуль параллельного тестирования для 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, не связана, поскольку исключение выбирает последнюю зарегистрированную ошибку, а не ошибку, связанную с ошибкой.

Это происходит время от времени, поэтому оно должно быть последовательностью операции или проблемой времени.

Тесты выполняются и не работают в среде кодовой сборки AWS против php 7.3 и 7.4.

У кого-нибудь есть идеи?

Ответы [ 2 ]

1 голос
/ 08 июня 2020

Если кто-то еще сталкивается с этим, проблема была решена путем создания каталога хранилища тестов перед выполнением тестов.

mkdir -p storage/framework/testing/disks/local
vendor/bin/paratest

Это немного хрупко, но пока что у нас отлично работает.

0 голосов
/ 08 июня 2020

По моему опыту, это обычно не проблема файловой системы. В большинстве случаев у меня тест не очищался правильно.

В зависимости от файловой системы и Паратеста ваши тесты выполняются в другом порядке, и затем возникают эти ошибки.

Есть несколько вещи, которые вы можете сделать, чтобы отследить это:

  1. Включите режим --debug при выполнении тестов в вашей среде сборки и проверьте все тесты, которые были выполнены ранее.
  2. По состоянию на PHPUnit 7.3 используйте --order-by=random локально, чтобы выполнять тесты в другом порядке, чем они появляются при чтении из файловой системы. Выполните это несколько раз, возможно, вы сможете смоделировать это локально.
  3. Я вижу, что вы используете Flysystem: попробуйте выполнить тесты с адаптером файловой системы памяти , чтобы убедиться, что это на самом деле это не проблема файловой системы.
  4. Убедитесь, что каждый тест создает структуру файловой системы до (Testcase::setUp()) и очищает ее при завершении работы (TestCase::teatDown()), иначе один тест может повлиять на другой.
  5. Убедитесь, что ваши тесты не зависят от значений, которые могут измениться. Например, у меня были проблемы с тестами, которые включали даты, и я выполнил тесты на Jenkins в 23:59, и они потерпели неудачу, потому что дата переключилась на следующий день. В таких случаях укажите дату, с которой можно работать через тест.
...