Какие проблемы с тестированием возникают в Docker-среде
Что проверяют
Запускали ли вы PHPUnit или Pest в контейнерах сами, а не только читали про Docker. Интервьюеру важно, чтобы вы называли конкретные причины падений и медленных прогонов. Следом обычно спрашивают, как вы изолируете тестовую базу между прогонами.
Как отвечать
Разложите проблемы по типам и к каждой дайте решение:
- готовность зависимостей:
depends_onв Compose по умолчанию ждёт только старта контейнера, а не готовности MySQL или PostgreSQL. Первые тесты падают с отказом соединения. Решение:healthcheckу базы иcondition: service_healthy; - сеть: внутри контейнера
localhostэто сам контейнер. В.env.testingилиphpunit.xmlдолжен стоять хост сервиса, напримерdb, а не127.0.0.1; - права на файлы: при bind mount файлы в
storage/илиvar/cacheсоздаются отrootилиwww-data, и на хосте их потом не удалить. Решение: запускать процесс с UID и GID хоста черезuser:или аргументы сборки; - скорость: Xdebug замедляет прогон в разы, включайте его только для отладки через
XDEBUG_MODE, а покрытие снимайте через PCOV. На macOS bind mount медленный,vendorлучше держать в именованном томе; - состояние базы: том сохраняет данные между прогонами, и тесты начинают зависеть от порядка. Выручают транзакции на тест (
RefreshDatabaseв Laravel, DAMA DoctrineTestBundle в Symfony) и отдельная тестовая база, её каталог данных можно положить вtmpfs; - расхождение окружений: версия PHP и расширения на хосте, в образе и в CI разные, а Composer, запущенный на хосте, ставит пакеты не под ту платформу. Помогает
config.platform.phpвcomposer.jsonи правило гонять всё в одном образе.
Где спотыкаются
Ставят sleep 10 перед тестами вместо проверки готовности базы. Локально проходит, в загруженном CI регулярно падает.
Используют одну базу для разработки и тестов. Первый же прогон с очисткой таблиц стирает локальные данные.
Говорят «в Docker тесты медленные» и на этом останавливаются. Сильнее назвать причину: включённый Xdebug, bind mount на macOS, пересборка образа без кеша слоёв на каждом прогоне.