Причины нестабильности тестов PHPUnit
Иногда PHPUnit тесты выполняются не с первого раза. Работают через раз. Или, например, каждый 10-й запуск фейлится. Вот кейсы, которые были у меня.
1. Нарушение уникальности в БД.
Лечение: добавить unique()
:
$this->faker->unique()->word();
2. webp
$name = sprintf('%s.%s', $this->faker->uuid(), $this->faker->fileExtension()); $file = UploadedFile::fake()->image($name); // тут ошибка
Иногда фейлился из-за отсутствия imagewebp в образе PHP. Причем в workspace это расширение стоит.
Лечение:
$name = sprintf('%s.jpg', $this->faker->uuid());
3. tearDown
Был кейс, когда идет уборка в tearDown
. Но из-за какой-то ошибки необходимая уборка не вызывалась. Поэтому после первого раза переставало работать.
4. Storage::fake()
Storage::fake()
прибирается не в конце теста, а наоборот в начале. Это может повлиять на соседний тест или повторный запуск.
5. dataProvider
PHPUnit перед тем как реально запускать тесты, обходит все тестовые файлы, а в них - запускает все dataProvider, чтобы составить карту запуска. Это первый проход. На основе его как раз и работает --filter
.
У меня был кейс, когда dataProvider менял состояние приложения, и поэтому работало через раз.
6. register_shutdown_function, destructor() контроллера
register_shutdown_function()
запускается, когда свою работу завершает не только сам тест, но и PHPUnit.
Деструктор контроллера также запускается слишком поздно.
Если в них разместить теструемую логику, тест вообще никогда не пройдет.
Решение:
public function __construct() { CacheClearJob::dispatch()->afterResponse(); }
Пишите еще кейсы, с которыми сталкивались.