В `MainController.addMessage` вместо `return "main"` сделал редирект `return success ? "redirect:/main" : "main"`. При тестировании возникла проблема "Premature end of file" (класс `MainControllerTest.addMessageTest`). Решение. Сначала проверяем на `.andExpect(authenticated()).andExpect(status().is3xxRedirection()) .andExpect(redirectedUrl("/main"))` (как в `LoginTest.correctLoginTest`), а потом еще раз `mockMvc.perform(get("/main"))` и далее как в видео. Автору огромное спасибо за материал!
У меня другой проект, я адаптировал тесты под него. Обычно авторов приходится ускорять, а данный автор сам какой-то суперускоренный=) Спасибо за ваши старания, очень содержательное и полезное видео для меня
Если у кого-то будет выдавать ошибку в тесте mainPageTest, когда мы смотрим что у нас в навбаре - xpath может брать значение с кучей пробелов и тест будет падать хотя значение самой строки вроде тоже. нужна функция normalize-space для xpath Выглядеть будет как-то так: xpath("normalize-space(//*[@id='navbarSupportedContent']/div)").string("admin")
Для MySQL в файле messages-list-before.sql вместо : alter sequence hibernate_sequence restart with 10; нужно писать : alter table message AUTO_INCREMENT 10;
С такими настройками не заработало. Получилось вот так : messages-list-before.sql > delete from message; delete from hibernate_sequence; сообщения... insert into hibernate_sequence values (10);
У кого не видит @TestPropertySource("/application-test.properties") сделайте следущее: Intellij Idea - File - Project Structure - Modules - src - test - java - resources - mark resources as "Test Resources". Мне сегодня помогло. На 22:15 два теста заработали.
Первый раз глянул и скопипастил - почти ничего не поняв, прочекав больше инфы снова пересмотрел и уже с понимаем всё подстроил под свой проект, ещё раз благодарствую, всё очень сжато и крайне информативно!)
Спасибо большое автору. Да, Lombok мне тоже пришлось "выпилить". Как говорится, explicit всегда лучше чем implicit. Гайд на сайте SpringBoot немного изменился, повторяла за автором. В остальном все замечательно, все работает :) Спасибо, Андрей!
Если вы на 10 минуте и вас не проходит correctLoginTest то скорее всего у вас тесты смотрят не в ту базу, и нужно сделать в классе аннотацию @TestPropertySource("/application-dev.properties")
Не совсем понял смысл теста badCredentials(). Как я понял мы проверяем, что будет forbidden, если ввести неверного пользователя. Но в этом случае он вернет не forbidden, а редирект на /login?error, а forbidden он вернул в видео потому что csrf не передали. т.е. тест на не правильные данные должен быть типа public void badCredentials() throws Exception { MockHttpServletRequestBuilder with = post("/login") .param("username", "admin123") .with(csrf()); this.mockMvc.perform(with) .andDo(print()) .andExpect(redirectedUrl("/login?error")); } или я не так понял смысл теста?
вопрос по тестированию MainController. В sql-скриптах для тестов мы чистим таблицы и потом заносим в них данные. Я что-то не отразил, а каким образом они у нас создались вообще в бд первоначально. Подумал, что это благодаря свойству ...ddl-auto в properties, но он же у нас задан как validate, те не создаются таблицы автоматически, как я понял. Работает только, если я задаю update вместо validate. update. Сам себе отвечу. Только сейчас понял, что тут в проекте использовался flyway, далее нашел db/migration в ресурсах и врубился
Все видосы просто потрясающие, но конкретно этот с первого и даже со второго раза не заходит. После половины вообще потерялся) Видимо придется возвращаться к этой теме позже
была у кого-нибудь такая проблема: Spring норм поднимается, если запускать через мавен plugin run, при запуске через зелёный треугольник, то падает из-за того что не все бины инициализировались. Мб каких конфигов не хватает?
Может ошибусь, но, imho, большинству подписчиков было бы не плохо объяснить вначале сам механизм тестирования с помощью JUnit... По-моему, слишком круто с места в карьер!
будут и модульные тесты. Интеграционные легче понять в плане логики "что тестируем", unit тесты сложнее в восприятии, ибо тестируем не какой-то функционал, а что-то более абстрактное и сфера примерения уже. Я не сторонник написания юнит тестов для сервисов, которые что-то из БД тянут (которую еще и подменяют на H2). Юнит тесты в идеале должны тестировать чистые функции, чтобы не пришлось много mock объектов создавать
Вот об этом я и говорю - я, например, про тесты знаю, только то, что Maven библиотеку JUnit автоматически прибавляет в pom-файл. И написал про JUnit, потому что увидел, что аннотации у Вас от этой библиотеки. А про сам механизм тестирования могу только догадываться (молчу уже про его градации - "интеграционные", "модульные" и т.п. - вообще чума!).
Однозначно крутой ролик. У меня есть вопрос, в строку @SpringBootTest мне приходится добавлять (classes = {Application.class}) точка запуска моего приложения, можете сказать почему у меня не работает без него?
В общем столкнулся с весьма неприятной ситуацией. Если кто захочет всё это делать на Kotlin то учтите что Repetable annotation не поддерживаются до сих пор. То есть выполнить аннотацию @Sql before и следом поставить @Sql after не получится. В гайдах у спринга нашел что в тестах можно использовать такие аннотации у функций как @BeforeAll и @AfterAll которые собственно означают что данная функция исполняется до остальных либо после. В общем пришлось создавать отдельный класс компонент в котором заавтовайрил JdbcTemplate и уже в нём руками написал теже запросы что и были созданы в ресурсах.
Автору как всегда - респект. Подскажите , не проходит последний тест (addMessageToListTest). Что это может быть. Искал - не нашёл. С Вашими исходниками сверял. Подскажите , где искать?. Спасибо org.springframework.web.util.NestedServletException: Request processing failed; nested exception is freemarker.core.InvalidReferenceException: The following has evaluated to null or missing: ==> message.id [in template "parts/messageEdit.ftl" at line 37, column 68] ---- Tip: It's the step after the last dot that caused this error, not those before it. ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use when-presentwhen-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${message.id} [in template "parts/messageEdit.ftl" at line 37, column 66] - Reached through: #include "parts/messageEdit.ftl" [in template "main.ftl" at line 17, column 1] ~ Reached through: #nested [in template "parts/common.ftl" in macro "page" at line 20, column 9] ~ Reached through: @c.page [in template "main.ftl" at line 3, column 1]
Интересно, здорово на реальных +- примерах всё смотреть, но сложновато для начала, как по мне, а с другой стороны когда показывают слишком лёгкие примеры, тоже думаешь, что шутка, спасибо за видео!
потому что он тебя редиректит на другую страницу. У себя я немного поменял тест и он прошел (у меня идет редирект на страницу с параметром error): .andExpect(status().is3xxRedirection()) .andExpect(redirectedUrl("/showMyLoginPage?error"));
Добрый день. Спасибо за отличные видео. У меня вопрос, может кто подскажет. Если я на добавление сообщения поставил редирект, то у меня не отрабатывает тест на добавление сообщения. Куда и как правильно указать редирект чтобы тест проходил?
Привет, спасибо за уроки, можешь объяснить про, web socket (а точнее разработка на spring web messenger) если можно, так же на этом примере. Заранее спасибо!
Все очень классно и круто! спасибо тебе. Столько всяких тонкостей с написанием кода, сколько же нужно было времени чтобы с этим разобраться если писать все в первый раз?
С ломбоком (@Data) не проходит тесты. Сначала теряется сесссию( лечится запуском теста с аннотацией @Transactional), потом вываливается в StackoverflowError .
Доброго времени суток. Автору спасибо за видео. У меня две проблемы в этой теме badLogin выводит 302 статус , а не 403. Тест не проходит. correctLoginTest() редирект делает на login?error, в место той странице которую задаю я. помогите разобраться.
А в чем проблема кидать данные в базу один раз перед всеми тестами, пометив сами тесты как @Transactional, чтобы все изменения после завершения теста откатывались?
Не могу понять, сделал все полностью как у автора для запуска первого теста, со всеми зависимостями и аннотациями, но всё равно нету кнопки запуска теста. Примеры из гайда тоже брал, не запускает. В настройках проекта папка для тестов как надо определена. Подскажите пожалуйста, с чем это может быть связано?
Привет у меня проблем при mainPageTest() org.xml.sax.SAXParseException; lineNumber: 176; columnNumber: 3; The markup in the document following the root element must be well-formed. В чем может быть проблемммма?
MySQL У кого выдавало такую ошибку при запуске теста : Caused by: java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails нужно в create-user-after и create-user-before перед удалением таблицы поставить SET FOREIGN_KEY_CHECKS=0;
решая проблемы с MySQL пришлось изменить: - в messages-list-before.sql: DELETE FROM message; ALTER TABLE message AUTO_INCREMENT=1; INSERT INTO message(id, text, tag, user_id) VALUES (NULL, 'first', 'my-tag', 1), (NULL, 'second', 'more', 1), (NULL, 'third', 'my-tag', 1), (NULL, 'fourth', 'another', 1); ALTER TABLE message AUTO_INCREMENT=10; - в dommain/dto/message GenerationType у id = IDENTITY, а не AUTO: @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; - в SQL миграций у полей id добавить "auto_increment": create table message ( id bigint not null auto_increment,
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) Caused by: org.postgresql.util.PSQLException: ОШИБКА: UPDATE или DELETE в таблице "usr" нарушает ограничение внешнего ключа "user_subscriptions_channel_id_fkey" таблицы "user_subscriptions" Подробности: На ключ (id)=(1) всё ещё есть ссылки в таблице "user_subscriptions".
Знаю тупой вопрос но почему в тесте логина с плохими кренделями у нас статус 403(forbidden) а когда логинимся неуспешно статус 302 редирект на страницу логина? P.S: сорри за мой русский я укр
Норм у тя русский :) Потому что в случае плохих кренделей ты ошибся в вводе данных, а при попытке входа без кренделей, ты вообще данных не предоставил. Разный вход - разный выход :)
@@letsCodeDru Наверное плохо описал ситуацию но я имел в виду что когда я логинюсь в браузере и задаю неправильные параметри то в окне проверить (ctrl+shift+i) network пишет статус 302 и происходит редирект вместо 403 :( Upd:1 Если поменять post() на formlogin() тест валиться , логи: Expected :403 Actual :302 Upd2: Нужно добавить .with(csrf()) иначе будет 403 вот мой тест gist.github.com/Alex12367/6e2d02e9da41a05e97cc8dfa86153cf2 Upd3: Забыл сказать спасибо за уроки Дрю :)
Спасибо за видосы. Может кто подскажет как протестировать input (когда редактируешь сообщение). Единственное что понял так это проверить на наличие самого input .andExpect(xpath("//input[@id='inputMSG']").exists()). Как узнать value?
Затем, что когда у тебя больше 20 страниц на сайте, ты забьёшь проверять все страницы после каждого изменения и пропустишь ошибку. Более того, что в 90% случаев ты даже не угадаешь, что именно может отвалиться, когда ты правишь какой-то сервис, ибо в голове всего не удержишь. С ростом приложения количество таких мест только будет расти
Блин, падает MainControllerTest org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Premature end of file. И неясно даже на каком файле, все файлы проверил, на первой позиции у всех находится , может символ какой-то запрещенный или корявый, типа BOM.
Как говорят от дурной головы.... Разобрался, у меня нет страницы "/main" и в итоге Dom parser пытался распознать несуществующую страницу, уже позже воссоздав тест с тестовой страницей "/test" понял, что в статусе запроса пишет следующую информацию: ...... MockHttpServletResponse: Status = 404 ..... тоесть страницы не существует, если кто столкнется с ошибкой lineNumber: 1; columnNumber: 1; Premature end of file. - значит в первую очередь проверьте а есть ли запрашиваемая страница. Потому как тесты: @Test @WithUserDetails("Admin") public void mainPageTest() throws Exception{ this.mockMvc.perform(get("/main")) .andDo(print()) .andExpect(authenticated()); пройдут успешно, а при попытке получить контент получите ошибку.
@Dru сколько времени у тебя уходит на то что-бы вот в этом все разобраться? Просто смотрю не могу оторваться, и понимаю, какой объем инфы нужно перелопатить, что-бы вникнуть! А еще вот это: "...и для этого есть аннотация, и для этого, и ....∞ " и походу это только вершина айсберга))
XPath //div[@id='message-list']/div[@data-id=10] does not exist java.lang.AssertionError: XPath //div[@id='message-list']/div[@data-id=10] does not exist У кого то была такая ошибка? помогите пожалуйста в решении, который час уже сижу
Спасибо за подробные и наглядные примеры, видео полезное. Но монтаж... я бы лучше посмотрел полную версию в час и 20 минут чем настолько дерганый монтаж, от которого просто голова закипает
Оставлю на всякий случай: не сразу разобрался почему у меня последние 2 теста по data-id не проходили. Оказалось, что помимо тегов, которые указывает автор, необходимо смотреть еще и на свои теги, которые Вы могли добавить когда оформляли приложение. У меня это выглядело так: --------------------------------
На youtube не так много каналов, где все четко и по делу. Спасибо за труды.
В `MainController.addMessage` вместо
`return "main"`
сделал редирект
`return success ? "redirect:/main" : "main"`.
При тестировании возникла проблема "Premature end of file" (класс `MainControllerTest.addMessageTest`).
Решение. Сначала проверяем на
`.andExpect(authenticated()).andExpect(status().is3xxRedirection())
.andExpect(redirectedUrl("/main"))`
(как в `LoginTest.correctLoginTest`),
а потом еще раз `mockMvc.perform(get("/main"))`
и далее как в видео.
Автору огромное спасибо за материал!
Спасибо, целый день игрался, и ни за что бы не додумался, что надо тестить в два захода.
Не возможно найти слова благодарности... Автор ты лучший)))))))))))))))
У меня другой проект, я адаптировал тесты под него.
Обычно авторов приходится ускорять, а данный автор сам какой-то суперускоренный=)
Спасибо за ваши старания, очень содержательное и полезное видео для меня
Он сам ускоряет перед загрузкой в 2 раза, сверху можно обратить внимание на время)
Наконец появилось свободное время. Вернулся к sweater =)
Кстати, хочу сказать большое спасибо автору, отличный контент.
Если у кого-то будет выдавать ошибку в тесте mainPageTest, когда мы смотрим что у нас в навбаре - xpath может брать значение с кучей пробелов и тест будет падать хотя значение самой строки вроде тоже. нужна функция normalize-space для xpath
Выглядеть будет как-то так:
xpath("normalize-space(//*[@id='navbarSupportedContent']/div)").string("admin")
Спасибо очень круто! Будет интересно про Rest посмотреть!
Для MySQL в файле messages-list-before.sql вместо :
alter sequence hibernate_sequence restart with 10;
нужно писать :
alter table message AUTO_INCREMENT 10;
С такими настройками не заработало.
Получилось вот так :
messages-list-before.sql >
delete from message;
delete from hibernate_sequence;
сообщения...
insert into hibernate_sequence values (10);
@@xirurr У MySQL нет секвенций, поэтому создавать и пихать что-то в таблицу секвенций бессмысленно.
Спасибо
Для меня только такая комбинацтя сработала:
alter sequence message_id_seq restart with 10;
PostgreSQL 12.3 version
@@xirurr Спасибо! Помогло!
У кого не видит @TestPropertySource("/application-test.properties") сделайте следущее: Intellij Idea - File - Project Structure - Modules - src - test - java - resources - mark resources as "Test Resources". Мне сегодня помогло. На 22:15 два теста заработали.
Низкий поклон тебе, мил человек! :)
Круто, спасибо за труд) Будет ещё очень интересно послушать про CI ) если такое планируется))
А давай сниму, чего нет-то? Подумаю как обыграть
letsCode круто, буду ждать))
Первый раз глянул и скопипастил - почти ничего не поняв, прочекав больше инфы снова пересмотрел и уже с понимаем всё подстроил под свой проект, ещё раз благодарствую, всё очень сжато и крайне информативно!)
Ничего лишнего, только код и объяснение нужных вещей. Спасибо!
Твои видосики облегчают мою жизнь. Прям очень сильно. Спасибо большое!
Спасибо большое автору. Да, Lombok мне тоже пришлось "выпилить". Как говорится, explicit всегда лучше чем implicit. Гайд на сайте SpringBoot немного изменился, повторяла за автором. В остальном все замечательно, все работает :) Спасибо, Андрей!
просто в восторге от автора и его уроков
Если вы на 10 минуте и вас не проходит correctLoginTest то скорее всего у вас тесты смотрят не в ту базу, и нужно сделать в классе аннотацию @TestPropertySource("/application-dev.properties")
мерси
Александр, спасибо огромное. 3 дня искал это. Нагуглить не смог, а тут ваш коммент.
Ну наконец-то из коробки нормальные вещи увидел! а не абракадабры всякие!)
велике дякую що находиш час на відео)
Не совсем понял смысл теста badCredentials(). Как я понял мы проверяем, что будет forbidden, если ввести неверного пользователя. Но в этом случае он вернет не forbidden, а редирект на /login?error, а forbidden он вернул в видео потому что csrf не передали.
т.е. тест на не правильные данные должен быть типа
public void badCredentials() throws Exception {
MockHttpServletRequestBuilder with = post("/login")
.param("username", "admin123")
.with(csrf());
this.mockMvc.perform(with)
.andDo(print())
.andExpect(redirectedUrl("/login?error"));
}
или я не так понял смысл теста?
почти, в вашем тесте не хватает после .param(username) ещё .param("password", "somePassword"). Иначе будет всегда ошибка
Спасибо! Отличный и лаконичный материал!
хорошая подача материала, подписка, лайк
Чтобы найти все незакрытые тэги может потребоваться поиск по всему проекту: CTRL + SHIFT + F
вопрос по тестированию MainController. В sql-скриптах для тестов мы чистим таблицы и потом заносим в них данные. Я что-то не отразил, а каким образом они у нас создались вообще в бд первоначально. Подумал, что это благодаря свойству ...ddl-auto в properties, но он же у нас задан как validate, те не создаются таблицы автоматически, как я понял.
Работает только, если я задаю update вместо validate.
update. Сам себе отвечу. Только сейчас понял, что тут в проекте использовался flyway, далее нашел db/migration в ресурсах и врубился
Спасибо, Андрей. Открывай свою школу))
а из какого класса импортировать get("/")?
Все видосы просто потрясающие, но конкретно этот с первого и даже со второго раза не заходит. После половины вообще потерялся) Видимо придется возвращаться к этой теме позже
была у кого-нибудь такая проблема: Spring норм поднимается, если запускать через мавен plugin run, при запуске через зелёный треугольник, то падает из-за того что не все бины инициализировались. Мб каких конфигов не хватает?
Ты мега крут!
Может ошибусь, но, imho, большинству подписчиков было бы не плохо объяснить вначале сам механизм тестирования с помощью JUnit...
По-моему, слишком круто с места в карьер!
будут и модульные тесты. Интеграционные легче понять в плане логики "что тестируем", unit тесты сложнее в восприятии, ибо тестируем не какой-то функционал, а что-то более абстрактное и сфера примерения уже. Я не сторонник написания юнит тестов для сервисов, которые что-то из БД тянут (которую еще и подменяют на H2). Юнит тесты в идеале должны тестировать чистые функции, чтобы не пришлось много mock объектов создавать
Вот об этом я и говорю - я, например, про тесты знаю, только то, что Maven библиотеку JUnit автоматически прибавляет в pom-файл.
И написал про JUnit, потому что увидел, что аннотации у Вас от этой библиотеки.
А про сам механизм тестирования могу только догадываться (молчу уже про его градации - "интеграционные", "модульные" и т.п. - вообще чума!).
Мир тестов не менее разнообразие, чем мир разработки :)
letsCode
Тогда беда... в моём случае так точно!
Благодарю за материал!
Спасибо огромное)) Видео просто супер!!!)))))
Однозначно крутой ролик.
У меня есть вопрос, в строку @SpringBootTest мне приходится добавлять (classes = {Application.class}) точка запуска моего приложения, можете сказать почему у меня не работает без него?
Вот спасибо тебе, хороший человек )) Час копал, почему у меня ошибки сыплет. Прописал точку запуска - всё заработало!
Ты меня спас своим коментарием) Второй час копаю почему не работает, а тут все так просто!
В общем столкнулся с весьма неприятной ситуацией. Если кто захочет всё это делать на Kotlin то учтите что Repetable annotation не поддерживаются до сих пор. То есть выполнить аннотацию @Sql before и следом поставить @Sql after не получится. В гайдах у спринга нашел что в тестах можно использовать такие аннотации у функций как @BeforeAll и @AfterAll которые собственно означают что данная функция исполняется до остальных либо после. В общем пришлось создавать отдельный класс компонент в котором заавтовайрил JdbcTemplate и уже в нём руками написал теже запросы что и были созданы в ресурсах.
Автору как всегда - респект. Подскажите , не проходит последний тест (addMessageToListTest). Что это может быть. Искал - не нашёл. С Вашими исходниками сверял. Подскажите , где искать?. Спасибо
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is freemarker.core.InvalidReferenceException: The following has evaluated to null or missing:
==> message.id [in template "parts/messageEdit.ftl" at line 37, column 68]
----
Tip: It's the step after the last dot that caused this error, not those before it.
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use when-presentwhen-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: ${message.id} [in template "parts/messageEdit.ftl" at line 37, column 66]
- Reached through: #include "parts/messageEdit.ftl" [in template "main.ftl" at line 17, column 1]
~ Reached through: #nested [in template "parts/common.ftl" in macro "page" at line 20, column 9]
~ Reached through: @c.page [in template "main.ftl" at line 3, column 1]
Спасибо Дрю!!!
Интересно, здорово на реальных +- примерах всё смотреть, но сложновато для начала, как по мне, а с другой стороны когда показывают слишком лёгкие примеры, тоже думаешь, что шутка, спасибо за видео!
У меня тест badCredentials не проходит почему-то, хотя код такой же. Expected :403
Actual :302. Почему так?
потому что он тебя редиректит на другую страницу. У себя я немного поменял тест и он прошел (у меня идет редирект на страницу с параметром error):
.andExpect(status().is3xxRedirection())
.andExpect(redirectedUrl("/showMyLoginPage?error"));
Добрый день. Спасибо за отличные видео. У меня вопрос, может кто подскажет. Если я на добавление сообщения поставил редирект, то у меня не отрабатывает тест на добавление сообщения. Куда и как правильно указать редирект чтобы тест проходил?
Привет, спасибо за уроки, можешь объяснить про, web socket (а точнее разработка на spring web messenger) если можно, так же на этом примере.
Заранее спасибо!
Поддерживаю, будет полезно!
Websocket будет, не переживайте
почему то не работает фишка по переклучению баз данных.. может кто знает в какую сторону хотя бы копать ?
Все очень классно и круто! спасибо тебе. Столько всяких тонкостей с написанием кода, сколько же нужно было времени чтобы с этим разобраться если писать все в первый раз?
Кто-то может подсказать какой screen recorder использует автор? Спасибо!
У меня почему-то постоянно выпадает 405 ошибка на последнем тесте и ссылается на 80 строку.
С ломбоком (@Data) не проходит тесты. Сначала теряется сесссию( лечится запуском теста с аннотацией @Transactional), потом вываливается в StackoverflowError
.
как-то решил это или просто откатился до времен без ломбока?
Та же ошибка. Кто нашел уже решение?
Помогите с лумбуком...
StackoverflowError
fails for toString() generated by @Data.
Declare it directly for each entity:
- Message: @ToString(of = {"id", "text", "tag"})
- User: @ToString(of = {"id", "username", "active", "email"})
Доброго времени суток. Автору спасибо за видео. У меня две проблемы в этой теме
badLogin
выводит 302 статус , а не 403. Тест не проходит.
correctLoginTest()
редирект делает на login?error, в место той странице которую задаю я.
помогите разобраться.
я у себя сделал так (не знаю, правильно ли, вроде ок):
.andExpect(status().is3xxRedirection())
.andExpect(redirectedUrl("/showMyLoginPage?error"));
А в чем проблема кидать данные в базу один раз перед всеми тестами, пометив сами тесты как @Transactional, чтобы все изменения после завершения теста откатывались?
Привет. Если можно, сможешь сделать урок по тестированию с использованием Spock?
Не могу понять, сделал все полностью как у автора для запуска первого теста, со всеми зависимостями и аннотациями, но всё равно нету кнопки запуска теста. Примеры из гайда тоже брал, не запускает. В настройках проекта папка для тестов как надо определена. Подскажите пожалуйста, с чем это может быть связано?
Лучше использовать конечно инжект через конструктор в тестах вместо @Autowired
Как всегда👍
Евгений борисов использовать аннотацию springboottest не рекомендует, слишком тяжелая. Лучше использовать webmvctest и конфигурацию с бинами и моки.
Привет у меня проблем при mainPageTest()
org.xml.sax.SAXParseException; lineNumber: 176; columnNumber: 3; The markup in the document following the root element must be well-formed.
В чем может быть проблемммма?
решили проблему?))
Скопируй сюда свой шаблон и увидишь то, что не видно:validator.w3.org/nu/#textarea
Дальше в логах идет описание проблемы: закритт тэг....
MySQL
У кого выдавало такую ошибку при запуске теста : Caused by: java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails
нужно в create-user-after и create-user-before перед удалением таблицы поставить SET FOREIGN_KEY_CHECKS=0;
решая проблемы с MySQL пришлось изменить:
- в messages-list-before.sql:
DELETE FROM message;
ALTER TABLE message AUTO_INCREMENT=1;
INSERT INTO message(id, text, tag, user_id) VALUES
(NULL, 'first', 'my-tag', 1),
(NULL, 'second', 'more', 1),
(NULL, 'third', 'my-tag', 1),
(NULL, 'fourth', 'another', 1);
ALTER TABLE message AUTO_INCREMENT=10;
- в dommain/dto/message GenerationType у id = IDENTITY, а не AUTO:
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
- в SQL миграций у полей id добавить "auto_increment":
create table message (
id bigint not null auto_increment,
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
Caused by: org.postgresql.util.PSQLException: ОШИБКА: UPDATE или DELETE в таблице "usr" нарушает ограничение внешнего ключа "user_subscriptions_channel_id_fkey" таблицы "user_subscriptions"
Подробности: На ключ (id)=(1) всё ещё есть ссылки в таблице "user_subscriptions".
Дрю делает вещи)
Большое спасибо !
супер, только не совсем ясно, для чего в каждом тесте обращаться к mockMvc через this.mockMvc? почему нельзя писать просто mockMvc?
Чётенько )
Круто!
большое спасибо!
Благодаря тестам узнал, что у меня в коде по какой то причине дублируются имена и плейлхолдеры в инпутах и вообще весь код кривой и косой.
А не проще добавлять пользователей и записи для тестов не через sql, а через репозитории в коде?
Очень содержательное видео
Знаю тупой вопрос но почему в тесте логина с плохими кренделями у нас статус 403(forbidden) а когда логинимся неуспешно статус 302 редирект на страницу логина?
P.S: сорри за мой русский я укр
Норм у тя русский :)
Потому что в случае плохих кренделей ты ошибся в вводе данных, а при попытке входа без кренделей, ты вообще данных не предоставил. Разный вход - разный выход :)
@@letsCodeDru Наверное плохо описал ситуацию но я имел в виду что когда я логинюсь в браузере и задаю неправильные параметри то в окне проверить (ctrl+shift+i) network пишет статус 302 и происходит редирект вместо 403 :(
Upd:1 Если поменять post() на formlogin() тест валиться , логи: Expected :403
Actual :302
Upd2: Нужно добавить .with(csrf()) иначе будет 403 вот мой тест gist.github.com/Alex12367/6e2d02e9da41a05e97cc8dfa86153cf2
Upd3: Забыл сказать спасибо за уроки Дрю :)
@@letsCodeDru Надо было просто досмотреть видео до конца и в последном тесте есть решения :(
Профессионально!
Спасибо за видосы. Может кто подскажет как протестировать input (когда редактируешь сообщение). Единственное что понял так это проверить на наличие самого input .andExpect(xpath("//input[@id='inputMSG']").exists()). Как узнать value?
Спасибо тебе ЧЕловечищее
простите, выглядит будто controller не нужен?
indeed for MainControllerTest
Один глупый вопрос: _зачем столько много кода (тестирование HTML, например), если можно запустить и увидеть всё глазами?_
Затем, что когда у тебя больше 20 страниц на сайте, ты забьёшь проверять все страницы после каждого изменения и пропустишь ошибку. Более того, что в 90% случаев ты даже не угадаешь, что именно может отвалиться, когда ты правишь какой-то сервис, ибо в голове всего не удержишь. С ростом приложения количество таких мест только будет расти
Ok!
Убедительно!
Хочу с помощью интеграционных тестов проверить добавление пользователя. Тест ругается на капчу. Как правильно сымитировать проверку капчи?
Captcha в тестах не надо проверять. Т.е. надо добавить проперти в окружение, которое будет отключать проверку Captcha для тестов
@@letsCodeDru Подскажите, пожалуйста, какое нужно добавить проперти? Не могу найти нигде.
Best! Спасибо
Блин, падает MainControllerTest
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Premature end of file.
И неясно даже на каком файле, все файлы проверил, на первой позиции у всех находится , может символ какой-то запрещенный или корявый, типа BOM.
Как говорят от дурной головы....
Разобрался, у меня нет страницы "/main" и в итоге Dom parser пытался распознать несуществующую страницу, уже позже воссоздав тест с тестовой страницей "/test" понял, что в статусе запроса пишет следующую информацию:
......
MockHttpServletResponse:
Status = 404
.....
тоесть страницы не существует, если кто столкнется с ошибкой lineNumber: 1; columnNumber: 1; Premature end of file. - значит в первую очередь проверьте а есть ли запрашиваемая страница. Потому как тесты:
@Test
@WithUserDetails("Admin")
public void mainPageTest() throws Exception{
this.mockMvc.perform(get("/main"))
.andDo(print())
.andExpect(authenticated());
пройдут успешно, а при попытке получить контент получите ошибку.
Спаси Бог.
@Dru сколько времени у тебя уходит на то что-бы вот в этом все разобраться? Просто смотрю не могу оторваться, и понимаю, какой объем инфы нужно перелопатить, что-бы вникнуть!
А еще вот это: "...и для этого есть аннотация, и для этого, и ....∞ " и походу это только вершина айсберга))
Именно. Мне жизни не хватит по всему спрингу видосов наснимать
XPath //div[@id='message-list']/div[@data-id=10] does not exist
java.lang.AssertionError: XPath //div[@id='message-list']/div[@data-id=10] does not exist
У кого то была такая ошибка?
помогите пожалуйста в решении, который час уже сижу
Solved for my Postgres DB: alter sequence message_id_seq restart with 10;
Thank you so much.
Супер
Спасибо!
Спасибо за подробные и наглядные примеры, видео полезное. Но монтаж... я бы лучше посмотрел полную версию в час и 20 минут чем настолько дерганый монтаж, от которого просто голова закипает
Much better xpath will: "//div[@id='message-list']/div" instead of "//*[...]"
Все очень здорово и по делу, НО очень сильно спешишь. Можно немного помедленнее.
78 common frames omitted
земля пухом тем, кто как и я мог оставлять незакрытые тэги, типа вместо
на MVCшном гомне аж до 2018 года писали. Думал оно уже засохло давным давно.
Как то очень медленно всё.
Очень медленно, можно ещё паузы между словами убирать и х2
Как сложно и не понятно автор подаёт материал
Полностью согласен. Хотим больше HelloWorldов и видосы, по типу какой язык программирования выбрать в 2019-2020 гг.
@@ms_shifu7047 улыбнуло
Оставлю на всякий случай:
не сразу разобрался почему у меня последние 2 теста по data-id не проходили. Оказалось, что помимо тегов, которые указывает автор, необходимо смотреть еще и на свои теги, которые Вы могли добавить когда оформляли приложение. У меня это выглядело так:
--------------------------------
Спасибо! Отличный и лаконичный материал!
Спасибо!
Супер
Спасибо! Отличный и лаконичный материал!
Спасибо! Отличный и лаконичный материал!
Спасибо большое
Спасибо! Отличный и лаконичный материал!
Спасибо! Отличный и лаконичный материал!