Спасибо, осилил урок спустя месяц, постоянно приходилось отвлекаться на что-то, а потом вспоминать, что же там было то неделю назад🤣 Урок познавательный
Спасибо за крутой урок! У меня не мог запуститься интеграционный тест на 36:50 APPLICATION FAILED TO START Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Добавил в Run Configuration теста переменную окружения SPRING_PROFILES_ACTIVE=standalone и всё заработало
Низкий поклон за отличный обучающий материал! Как всегда, очень интересно и наглядно. Саш, не думал выпускать короткие лёгкие ролики на отвлеченные темы? Например, на какой ОС работаешь, какие инструменты при разработке используешь, какими ресурсами пользуешься, какие-то лайфхаки по части разработки или ещё о чем-нибудь? Не призыв к действию, любопытно. Главное, чтобы основная тема канала развивалась в том же ключе и с тем же настроем в твоем лице с позитивом и без шумящих соседей) PS: очень быстро печатаешь на английской раскладке. Порой не успеваю) На русской - понятное дело, но на английской - моё почтение.
Еще вопрос возник - при интеграционном тестировании rest где требовался jwt декодер если самому написать подобный тест в системе с jwt токенами авторизации, вместо oauth2 то так же будет работать или @WithMockUser лучше для такого?
Всё зависит от того, насколько подробно хочется протестировать безопасность приложения. Если хочется протестировать полностью цепочку фильтров, что в целом правильно, когда есть какие-то самописные компоненты, то нужно обходиться без @WithMockUser и аналогичных аннотаций. Последние просто создают контекст безопасности с указанными параметрами и фактическая аутентификация не происходит.
Я отменил поход на Дюну, когда увидел, что вышел новый ролик) В видео тестконтейнеры поднимаются мгновенно, и даже неявно, у меня почему-то на винде всё поднимается долго и с кучей исключений, но мы явно делаем базовый класс-родитель, в котором поднимается контейнер бд и брокера очередей, от которого потом наследуются интеграционные тесты. Добавление кафки в проект не планируется?
здравствуйте. разобрались? потому что я сейчас сижу у меня этот контейнер (testcontainers/ryuk) никак на виндовс не запускается, можете помочь, если разобрались
самый простой вариант - через интеграцию TC в JDBC, в этом случае достаточно в spring.datasource.url добавить префикс tc: jdbc:tc:postgresql:16:///database_name
А почему зависимости дублируются в модульных pom файлах? Разве не стоит в случае, когда одни и те же зависимости используются в разных модулях - вынести их в общий (родительский) pom?
Отличное видео! Спасибо вам! Пытаюсь сделать то же самое, но опять столкнулся с проблемой - созданный в тесте по видео, он не отдает собственно метод createProduct, а при копировании выдает Cannot access com.example.managerapp.controller.ProductsController и подчеркивает красным, а при запуске теста java: method createProduct in class com.example.managerapp.controller.ProductsController cannot be applied to given types; А если убрать this обращение к controller и в аргументе response, то тест работает
Спасибо за видео! Узнал много нового! Хотел бы уточнить один вопрос. Юнит тесты нельзя писать в интеграционных тестах? Ведь в идее можно по отдельности тестировать каждый метод. Чем это не юнит тест?)
Важна разница между модульными и интеграционными тестами. Модульные должны максимально изолированно тестировать разрабатываемую логику и должны выполняться как можно быстрее. Интеграционные тесты в свою очередь тестируют связки компонентов и их взаимодействие с какими-то внешними инструментами (фреймворками, базами данных и т.д.), следовательно, они более ресурсоёмкие и занимают больше времени. Можно ли писать модульные тесты в интеграционных тестах? По факту - да, никто и ничто не запрещает этого делать. Но для запуска интеграционного теста (в контексте Spring) требуется запуск контекста приложения в том или ином его виде, что требует времени и ресурсов. И в результате получается какая-то странная ситуация - мы сначала запускаем контекст приложения, а затем выполняем модульный тест, которому этот контекст по факту не нужен. Более того, при таком подходе может и будет возникать ситуация, когда сначала выполняется какое-то количество интеграционных тестов, а лишь затем очередь доходит до модульных, а одна из задач модульных тестов заключается в как можно более раннем выявлении ошибок. Поэтому я стараюсь отделять модульные тесты от интеграционных и выполнять их на разных этапах сборки проекта (test и verify соответственно в Maven). Если ошибка выявляется модульными тестами, то это будет происходить достаточно быстро на ранних этапах сборки проекта, ещё до того, как сборка дойдёт до выполнения интеграционных тестов. Это в целом даже выгоднее с точки зрения использования ресурсов в CI/CD.
Спасибо за видео! и как обычно вопрос: что делать если функционал который нужно протестировать зависит от другого? пример: есть рабочий процесс из 10 шагов(раскидано по 10-15 API), последний шаг без добавления и обработки данных по всем предыдущим шагам протестировать не возможно. Вариант решения видел такой - поднят докер тестконтейнер и шарит БД на все тестируемые методы(позитивные и негативные сценарии) - насколько это ок? хоть вариант и рабочий, но выглядит не очень.
Есть два подхода: 1. Тестирование всего бизнес-процесс, такой подход в целом популярен при написании тестов для BPM. 2. Индивидуальное тестирование каждого шага. В целом я не вижу в этом проблем - состояние системы перед выполнением шага можно смоделировать, заполняя БД тестовыми данными.
Помимо тестирования логики кода, часто используются линтеры и всякого рода дополнительные стат.анализаторы, но тут у Вас об этом нет, вы не используете такое в своих проектах?
Здравствуйте Подскажите ,пожалуйста ,какие книги читать java backend разработчику Имеется ввиду человеку ,у которого уже неплохая база есть Спасибо заранее ❤
- Книги Роберта Мартина (в первую очередь "Чистый код" и "Чистая архитектура") - Паттерны объектно-ориентированного программирования - Книги про алгоритмы и структуры данных (Грокаем алгоритмы, Алгоритмы Скиены и Стивенса) - Книги посвящённые предметно-ориентированному проектированию (синюю и особенно красную) - Реактивные шаблоны проектирования
@@shurik_codes кстати, Александр, насчет DDD, как относитесь к rich model, использовал ли хоть раз хотя бы в пет-проектах? имхо крутой подход - очень упрощает написание фич, снижает баги и делает кодовую базу валидации модели и всех бизнес-процессов более естественной
Не понял, зачем при настройке тест-контейнеров в ямле задавать для них url, username и password - все эти данные генерятся контейнером автоматически, и все равно прямого доступа к поднимаемой бд не будет. По-моему оптимальнее делать отдельный конфигурационный класс, который имплементит ApplicationContextInitializer, а дальше просто подключать его через ContextConfiguration в те классы, где есть тесты с тест-контейнерами
Логин/пароль указывать не нужно, да, но вот создавать отдельный конфигурационный класс оптимальнее явно не будет, т.к. для запуска контейнера с БД достаточно указать специфичный для TC URL: java.testcontainers.org/modules/databases/jdbc/#database-containers-launched-via-jdbc-url-scheme
@shurik_codes Не могу понять, почему контекст интеграционного теста в вашем примере запускается без проблем. У меня требует dataSource. Анализ вашего репозитория не выявил каких-то специальных настроек, конфигов или моков в тестовом окружении. Я явно указал настройки постгри в ямле тестового окржения, после этого ИТ заработал, но хотелось бы понять, в чем магия, почему у вас работает без этой настройки.
@@shurik_codesДа, я подумал, что нужно уточнить, что речь про модуль менеджера, а не каталога, но отвлекся и не поправил. С каталогом все понятно, а в менеджере нет тестового контейнера постгреса, нет настроек в ямле, при этом работает в видео, но не работает локально.
почему происходит конфликт айдишников с файла product.sql и реальными данными в бд? не дает положить id1,2,3 и тд, говорит уже имеется. дроп бд спасает, но все же это ведь вообще не выход) после окончания тестов, как и предполагалось, бд пустая, а сиквен заполняется.
Еще не смотрел ролик, но сразу ставлю лайк и выражаю благодарность за проделанную работу!
Очень качественный материал, достаточно хорошее погружение в тему касательно каждого ролика с этого канала! Лучший
Огромное спасибо, что делитесь опытом! Благодаря таким людям наша страна еще держится!
Спасибо, осилил урок спустя месяц, постоянно приходилось отвлекаться на что-то, а потом вспоминать, что же там было то неделю назад🤣
Урок познавательный
Спасибо за крутой урок!
У меня не мог запуститься интеграционный тест на 36:50
APPLICATION FAILED TO START
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Добавил в Run Configuration теста переменную окружения SPRING_PROFILES_ACTIVE=standalone и всё заработало
Либо перед классом теста можно добавить аннотацию @ActiveProfiles(value = "standalone")
Спасибо, как обычно смотрю не туда, куда надо и туплю
Спасибо. Приятно смотреть ролики и обновлять свои знания.
Лайк. Отличный русскоязычный контент.
Ура. В тестах не очень много опыта. То, что надо
thanks
Низкий поклон за отличный обучающий материал! Как всегда, очень интересно и наглядно.
Саш, не думал выпускать короткие лёгкие ролики на отвлеченные темы? Например, на какой ОС работаешь, какие инструменты при разработке используешь, какими ресурсами пользуешься, какие-то лайфхаки по части разработки или ещё о чем-нибудь? Не призыв к действию, любопытно. Главное, чтобы основная тема канала развивалась в том же ключе и с тем же настроем в твоем лице с позитивом и без шумящих соседей)
PS: очень быстро печатаешь на английской раскладке. Порой не успеваю) На русской - понятное дело, но на английской - моё почтение.
Будучи программистом приходится больше писать на английском, так что это уже дело привычки) Насчёт коротких роликов думаю
Спасибо большое это то что нам всем было нужно. Надеюсь не обойдёте стороной вопрос как прицепить капчу.
Саня, спасибо большое! Жирный лайкос!!! Никогда не мог мокать oauth авторизацию в тестах, теперь понял)
Спасибо. Суперкрутой видос. Несколько раз был в Кургане - классный город☺
Серия видео огонь 🔥🔥🔥🔥🔥🔥
большое спасибо! тоже в свое время прихватил проблем с @Test не из нужного пакета) очень долго не мог понять, что происходит
лучший! спасибо за видео
Александр , для тестов rest api сервиса , для контроллеров лучше использовать интеграционные тесты или модульный ?
и то и другое
Еще вопрос возник - при интеграционном тестировании rest где требовался jwt декодер если самому написать подобный тест в системе с jwt токенами авторизации, вместо oauth2 то так же будет работать или @WithMockUser лучше для такого?
Всё зависит от того, насколько подробно хочется протестировать безопасность приложения. Если хочется протестировать полностью цепочку фильтров, что в целом правильно, когда есть какие-то самописные компоненты, то нужно обходиться без @WithMockUser и аналогичных аннотаций. Последние просто создают контекст безопасности с указанными параметрами и фактическая аутентификация не происходит.
Я отменил поход на Дюну, когда увидел, что вышел новый ролик)
В видео тестконтейнеры поднимаются мгновенно, и даже неявно, у меня почему-то на винде всё поднимается долго и с кучей исключений, но мы явно делаем базовый класс-родитель, в котором поднимается контейнер бд и брокера очередей, от которого потом наследуются интеграционные тесты.
Добавление кафки в проект не планируется?
Нет, кафки в рамках данного проекта не будет. Про кафку я буду рассказывать отдельно.
здравствуйте
не очень понятно как подключить бд через докер и testcontainers
у вас есть на канале видео,которое затрагивает данную тему ?
здравствуйте. разобрались? потому что я сейчас сижу у меня этот контейнер (testcontainers/ryuk) никак на виндовс не запускается, можете помочь, если разобрались
самый простой вариант - через интеграцию TC в JDBC, в этом случае достаточно в spring.datasource.url добавить префикс tc: jdbc:tc:postgresql:16:///database_name
А почему зависимости дублируются в модульных pom файлах? Разве не стоит в случае, когда одни и те же зависимости используются в разных модулях - вынести их в общий (родительский) pom?
Отличное видео! Спасибо вам! Пытаюсь сделать то же самое, но опять столкнулся с проблемой - созданный в тесте по видео, он не отдает собственно метод createProduct, а при копировании выдает Cannot access com.example.managerapp.controller.ProductsController и подчеркивает красным, а при запуске теста java: method createProduct in class com.example.managerapp.controller.ProductsController cannot be applied to given types; А если убрать this обращение к controller и в аргументе response, то тест работает
эх, вот бы на работу затащить testcontainers :( (у нас оракл)
Спасибо за видео! Узнал много нового!
Хотел бы уточнить один вопрос.
Юнит тесты нельзя писать в интеграционных тестах? Ведь в идее можно по отдельности тестировать каждый метод. Чем это не юнит тест?)
Важна разница между модульными и интеграционными тестами. Модульные должны максимально изолированно тестировать разрабатываемую логику и должны выполняться как можно быстрее. Интеграционные тесты в свою очередь тестируют связки компонентов и их взаимодействие с какими-то внешними инструментами (фреймворками, базами данных и т.д.), следовательно, они более ресурсоёмкие и занимают больше времени.
Можно ли писать модульные тесты в интеграционных тестах? По факту - да, никто и ничто не запрещает этого делать. Но для запуска интеграционного теста (в контексте Spring) требуется запуск контекста приложения в том или ином его виде, что требует времени и ресурсов. И в результате получается какая-то странная ситуация - мы сначала запускаем контекст приложения, а затем выполняем модульный тест, которому этот контекст по факту не нужен. Более того, при таком подходе может и будет возникать ситуация, когда сначала выполняется какое-то количество интеграционных тестов, а лишь затем очередь доходит до модульных, а одна из задач модульных тестов заключается в как можно более раннем выявлении ошибок.
Поэтому я стараюсь отделять модульные тесты от интеграционных и выполнять их на разных этапах сборки проекта (test и verify соответственно в Maven). Если ошибка выявляется модульными тестами, то это будет происходить достаточно быстро на ранних этапах сборки проекта, ещё до того, как сборка дойдёт до выполнения интеграционных тестов. Это в целом даже выгоднее с точки зрения использования ресурсов в CI/CD.
Спасибо за видео! и как обычно вопрос: что делать если функционал который нужно протестировать зависит от другого? пример: есть рабочий процесс из 10 шагов(раскидано по 10-15 API), последний шаг без добавления и обработки данных по всем предыдущим шагам протестировать не возможно. Вариант решения видел такой - поднят докер тестконтейнер и шарит БД на все тестируемые методы(позитивные и негативные сценарии) - насколько это ок? хоть вариант и рабочий, но выглядит не очень.
Замокать эти апи, как вариант. Вайрмок вроде позволяет задать джсоном ответ на джсон-респонс.
@@user-007-1 к сожалению ответом от API был не json, а csv
Есть два подхода:
1. Тестирование всего бизнес-процесс, такой подход в целом популярен при написании тестов для BPM.
2. Индивидуальное тестирование каждого шага. В целом я не вижу в этом проблем - состояние системы перед выполнением шага можно смоделировать, заполняя БД тестовыми данными.
Помимо тестирования логики кода, часто используются линтеры и всякого рода дополнительные стат.анализаторы, но тут у Вас об этом нет, вы не используете такое в своих проектах?
Использую сонар в своих проектах
@@shurik_codes а почему в этом цикле видео не показали? или планируется во втором сезоне?🙂 это же все таки важная часть разработки
Изначально не было в планах, может быть, ролик появится как продолжение серии
Жизненный момент на моменте 49:00 😂
Здравствуйте
Подскажите ,пожалуйста ,какие книги читать java backend разработчику
Имеется ввиду человеку ,у которого уже неплохая база есть
Спасибо заранее ❤
- Книги Роберта Мартина (в первую очередь "Чистый код" и "Чистая архитектура")
- Паттерны объектно-ориентированного программирования
- Книги про алгоритмы и структуры данных (Грокаем алгоритмы, Алгоритмы Скиены и Стивенса)
- Книги посвящённые предметно-ориентированному проектированию (синюю и особенно красную)
- Реактивные шаблоны проектирования
@@shurik_codes кстати, Александр, насчет DDD, как относитесь к rich model, использовал ли хоть раз хотя бы в пет-проектах? имхо крутой подход - очень упрощает написание фич, снижает баги и делает кодовую базу валидации модели и всех бизнес-процессов более естественной
@@AlexSmile-y2x Отношусь положительно, использую в реальных проектах
@@shurik_codes как считаете, почему этот подход менее популярен, чем стандартный с анемичной моделю?
@@AlexSmile-y2x сложнее во многих аспектах проектирования и проработки
Не понял, зачем при настройке тест-контейнеров в ямле задавать для них url, username и password - все эти данные генерятся контейнером автоматически, и все равно прямого доступа к поднимаемой бд не будет. По-моему оптимальнее делать отдельный конфигурационный класс, который имплементит ApplicationContextInitializer, а дальше просто подключать его через ContextConfiguration в те классы, где есть тесты с тест-контейнерами
Логин/пароль указывать не нужно, да, но вот создавать отдельный конфигурационный класс оптимальнее явно не будет, т.к. для запуска контейнера с БД достаточно указать специфичный для TC URL: java.testcontainers.org/modules/databases/jdbc/#database-containers-launched-via-jdbc-url-scheme
@shurik_codes
Не могу понять, почему контекст интеграционного теста в вашем примере запускается без проблем. У меня требует dataSource. Анализ вашего репозитория не выявил каких-то специальных настроек, конфигов или моков в тестовом окружении.
Я явно указал настройки постгри в ямле тестового окржения, после этого ИТ заработал, но хотелось бы понять, в чем магия, почему у вас работает без этой настройки.
47:40
@@shurik_codesДа, я подумал, что нужно уточнить, что речь про модуль менеджера, а не каталога, но отвлекся и не поправил. С каталогом все понятно, а в менеджере нет тестового контейнера постгреса, нет настроек в ямле, при этом работает в видео, но не работает локально.
@@ГенрихАвдеев-ь9з Уберите депенденси spring-data из проекта менеджера, она там не нужна)
@@ГенрихАвдеев-ь9з аналогичная ситуация
@@ГенрихАвдеев-ь9з Аналогичная ошибка возникает. Удалось разобраться?
почему происходит конфликт айдишников с файла product.sql и реальными данными в бд? не дает положить id1,2,3 и тд, говорит уже имеется. дроп бд спасает, но все же это ведь вообще не выход) после окончания тестов, как и предполагалось, бд пустая, а сиквен заполняется.