Обновить

Комментарии 12

Эка годнота какая. Плюс вам за старания. Хотя мне больше нравилось когда автотестеры такие тысты писали. E2E aka Функциональные. Мне как разработчику хочется Unit тесты написать и дальше уже отдавать автоматам. Ну это такое, не все всегда бывает как мы того хотим.

В unit-тестах тоже базу можно подымать. Т.е. чем ближе окружение тестов к проду, тем они реальнее тестируют код. А то так все замокать можно, и выплеснуть воду с младенцем.

Нынче все больше и больше продуктов идут с Continuous Deployment.
При этом разделение на разработчиков и автоматизаторов становится не актуальным — разработчик сам пишет и код и Е2Е тесты. Когда инфраструктурный код для Е2Е уже есть (привет девопсам) написание Е2Е теста — дело не хитрое :)
Хорошая статья, дельные советы.
А почему тесты на время стали падать именно в 11й?
Триггером стало изменение точности во внутреннем формате представления времени в Java 11.
А по факту, конечно, проблема в коде и тестах на него.

Таких проблем вообще много бывает. Как-то раз обновляли версию jdbc-драйвера для Постгреса. Тесты прошли, а в одном из окружений спринговый контекст не поднялся — приложение не смогло к БД подключиться. Оказалось, что на хостах нет нужных SSL-сертификатов, а раньше работало из-за баги в драйвере. Обновили драйвер, бага ушла — у нас всё сломалось.
Release notes нужно читать :)

Спасибо за совет с truncate для всех таблиц сразу.
Увы, не всегда применим. Например, если в некоторых таблицах нужно оставить отдельные записи — тут уж только delete from where.


Мы пошли другим путем (сразу оговорюсь — запускаем PG в докере):


  • используем delete
  • добавляем все в батч
  • выключаем все что можно выключить в postgresql.conf
    fsync = off
    synchronous_commit = off
    full_page_writes = off
    autovacuum = off

Насколько я понимаю, это имеет смысл делать когда в тестах гоняются большие объемы данных (больше данных -> больше WAL -> чаще срабатывают чекпоинты).
Не наш случай, но спасибо за линку. Николай всегда интересен )

Я бы ещё посоветовал вместо очистки по окончанию теста делать очистку перед тестом. Во-первых, если тест упал можно подсмотреть что в БД. Во-вторых, если процесс с тестами был убит с помощью сигналов, например если завис, то при следующем запуске не будет падения из-за нестёртых данных.

И ещё, очень полезно рандомизировать все сиквенсы перед тестами, каждый id будет начинаться со случайного большого числа, и в тестах исчезнет риск сравнить id апельсинов c id крокодилов.

Рандомизация сиквенсов у нас есть, но не везде — пока что не оформили как системное решение. Можно начинать сиквенсы, например, с Integer.MAX_VALUE + 1. Это позволяет отловить баги, когда в связанных таблицах используются неправильные типы — int вместо bigint. Но тут есть и обратная сторона медали — человекочитаемость снижается, дебажить код не так удобно из-за больших чисел.
Из-за сиквенсов перестали беспокоиться, когда сделали нормальную ссылочную целостность.

10_000_000_000 может будет читаемее?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации