Какие преимущества дает возможность менять бины в зависимости от профиля приложения в Spring
Что проверяют
Понимаете ли вы, почему одно и то же приложение ведёт себя по-разному на стендах и как этим пользоваться в тестах. Следом спрашивают, как включить профиль в автотестах и чем подмена бинов опасна для достоверности проверки.
Как отвечать
Профиль это именованный набор настроек и бинов. Бин с @Profile("dev") создаётся, только если профиль dev активен, работают и отрицания вроде @Profile("!prod"). Spring Boot вдобавок накладывает application-{profile}.yml поверх общего application.yml.
Профиль задают свойством spring.profiles.active: переменной окружения SPRING_PROFILES_ACTIVE, аргументом --spring.profiles.active=test или в тесте аннотацией @ActiveProfiles("test").
Что это даёт с точки зрения QA:
- подмена внешних зависимостей: в профиле
testвместо платёжного шлюза или отправки SMS работает заглушка, тесты не зависят от чужих систем и не шлют настоящих сообщений; - одна сборка на все стенды: артефакт один, отличается только конфигурация, поэтому в прод уезжает ровно то, что проверили;
- тестовые данные: профиль может включать скрипты начального наполнения базы для быстрых прогонов;
- изоляция опасного: боевые интеграции вне
prodпросто не создаются.
Сильный ответ называет и обратную сторону. Чем больше различий между профилями, тем меньше тест доказывает про прод. Для интеграционных тестов лучше реальная база в контейнере через Testcontainers, чем H2 в отдельном профиле: у H2 свой диалект SQL и своё поведение.
Где спотыкаются
Путают профили Spring с профилями Maven. Maven решает, как собрать артефакт, Spring решает, какие бины создать при запуске.
Не знают, что происходит без явного профиля. Тогда активен профиль default, бины без @Profile создаются всегда, а бины из других профилей пропадают, и приложение может не стартовать из-за отсутствующей зависимости.
Считают зелёные тесты на заглушках доказательством работы в проде. Заглушка проверяет только ваш код, контракт с настоящим сервисом нужно проверять отдельно, например контрактными тестами.