
Testcontainers в CI: почему тесты зелёные локально и красные на пайплайне
badcasedaily1 3 минуты назад Testcontainers в CI: почему тесты зелёные локально и красные на пайплайне Средний 9 мин 8 Блог компании OTUS Тестирование IT-систем * Программирование * Java * DevOps * Туториал Привет,...
18 Temmuz'da Wellington'da en yüksek sıcaklık 14°C olacak mı?
В сфере искусственного интеллекта произошло заметное событие. badcasedaily1 3 минуты назад Testcontainers в CI: почему тесты зелёные локально и красные на пайплайне Средний 9 мин 8 Блог компании OTUS Тестирование IT-систем * Программирование * Java * DevOps * Туториал Привет, Хабр! Testcontainers Ричард Норт выкатил в 2015 году, изначально только под Java, и идея была простой: хватит подменять Postgres на H2, а Kafka на embedded‑заглушку, давайте поднимать в тесте ровно тот сервис, который стоит в проде, только в контейнере и на время прогона. За десять лет библиотека расползлась на Java,.
js, Python, Ruby, Rust и дальше по списку, обросла Testcontainers Cloud и Desktop, а компанию AtomicJar в конце 2023 года купил Docker. Мотивация не поменялась. H2 умеет не всё, что умеет Postgres, по‑своему трактует типы, планирует запросы иначе и молча прощает то, на чём настоящая СУБД падает.
Технические детали
Тест зелёный, прод красный. Testcontainers эту дыру закрывает целиком. Взамен приходит другой класс проблем.
Локально всё летает, а на пайплайне тесты падают в трёх запусках из ста, каждый раз на разных местах, и никакой связи с изменениями в коде не прослеживается. Логика приложения тут обычно ни при чём: причины лежат в жизненном цикле контейнеров, в сети, в дележе памяти между параллельными джобами. Ниже пять историй, которые повторяются на проектах любого размера.
Тег latest, который однажды съезжаетНачинается всё безобидно. @Container static PostgreSQLContainer postgres = new PostgreSQLContainer<>("postgres:latest Несколько недель полёт нормальный. Потом CI начинает валиться на паре тестов, диффа в коде почти нет.
Отраслевые последствия
Разбор показывает, что в реестре обновилась метка latest, агент подтянул свежий мажор Postgres, где поменялось значение параметра по умолчанию или поведение системного представления, и несколько запросов стали возвращать другое. latest в Docker означает не «последняя стабильная», а «то, что было помечено этим тегом на момент pull». Обновление приезжает без вашего участия и, как правило, в самый неудачный момент.
Мажорные версии Postgres, MySQL, Kafka и Redis выходят раз в год‑полтора и приносят изменения, обратно совместимые на бумаге и заметно разные на практике. Версия должна быть той же, что в проде, и написана явно:private static final String POSTGRES_IMAGE = System. getProperty("postgres.
image", "postgres:16. 4-alpine @Container static PostgreSQLContainer postgres = new PostgreSQLContainer<>(POSTGRES_IMAGE);Константа выносится в общий базовый класс или в properties, чтобы одна и та же версия использовалась и в тестах, и в docker‑compose для локальной разработки.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.




