В `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"))` и далее как в видео. Автору огромное спасибо за материал!
У меня другой проект, я адаптировал тесты под него. Обычно авторов приходится ускорять, а данный автор сам какой-то суперускоренный=) Спасибо за ваши старания, очень содержательное и полезное видео для меня
Первый раз глянул и скопипастил - почти ничего не поняв, прочекав больше инфы снова пересмотрел и уже с понимаем всё подстроил под свой проект, ещё раз благодарствую, всё очень сжато и крайне информативно!)
Спасибо большое автору. Да, Lombok мне тоже пришлось "выпилить". Как говорится, explicit всегда лучше чем implicit. Гайд на сайте SpringBoot немного изменился, повторяла за автором. В остальном все замечательно, все работает :) Спасибо, Андрей!
Для 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);
Если у кого-то будет выдавать ошибку в тесте mainPageTest, когда мы смотрим что у нас в навбаре - xpath может брать значение с кучей пробелов и тест будет падать хотя значение самой строки вроде тоже. нужна функция normalize-space для xpath Выглядеть будет как-то так: xpath("normalize-space(//*[@id='navbarSupportedContent']/div)").string("admin")
У кого не видит @TestPropertySource("/application-test.properties") сделайте следущее: Intellij Idea - File - Project Structure - Modules - src - test - java - resources - mark resources as "Test Resources". Мне сегодня помогло. На 22:15 два теста заработали.
Не совсем понял смысл теста 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")); } или я не так понял смысл теста?
Если вы на 10 минуте и вас не проходит correctLoginTest то скорее всего у вас тесты смотрят не в ту базу, и нужно сделать в классе аннотацию @TestPropertySource("/application-dev.properties")
Все очень классно и круто! спасибо тебе. Столько всяких тонкостей с написанием кода, сколько же нужно было времени чтобы с этим разобраться если писать все в первый раз?
Может ошибусь, но, imho, большинству подписчиков было бы не плохо объяснить вначале сам механизм тестирования с помощью JUnit... По-моему, слишком круто с места в карьер!
будут и модульные тесты. Интеграционные легче понять в плане логики "что тестируем", unit тесты сложнее в восприятии, ибо тестируем не какой-то функционал, а что-то более абстрактное и сфера примерения уже. Я не сторонник написания юнит тестов для сервисов, которые что-то из БД тянут (которую еще и подменяют на H2). Юнит тесты в идеале должны тестировать чистые функции, чтобы не пришлось много mock объектов создавать
Вот об этом я и говорю - я, например, про тесты знаю, только то, что Maven библиотеку JUnit автоматически прибавляет в pom-файл. И написал про JUnit, потому что увидел, что аннотации у Вас от этой библиотеки. А про сам механизм тестирования могу только догадываться (молчу уже про его градации - "интеграционные", "модульные" и т.п. - вообще чума!).
вопрос по тестированию MainController. В sql-скриптах для тестов мы чистим таблицы и потом заносим в них данные. Я что-то не отразил, а каким образом они у нас создались вообще в бд первоначально. Подумал, что это благодаря свойству ...ddl-auto в properties, но он же у нас задан как validate, те не создаются таблицы автоматически, как я понял. Работает только, если я задаю update вместо validate. update. Сам себе отвечу. Только сейчас понял, что тут в проекте использовался flyway, далее нашел db/migration в ресурсах и врубился
Автору как всегда - респект. Подскажите , не проходит последний тест (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]
Все видосы просто потрясающие, но конкретно этот с первого и даже со второго раза не заходит. После половины вообще потерялся) Видимо придется возвращаться к этой теме позже
Однозначно крутой ролик. У меня есть вопрос, в строку @SpringBootTest мне приходится добавлять (classes = {Application.class}) точка запуска моего приложения, можете сказать почему у меня не работает без него?
была у кого-нибудь такая проблема: Spring норм поднимается, если запускать через мавен plugin run, при запуске через зелёный треугольник, то падает из-за того что не все бины инициализировались. Мб каких конфигов не хватает?
Интересно, здорово на реальных +- примерах всё смотреть, но сложновато для начала, как по мне, а с другой стороны когда показывают слишком лёгкие примеры, тоже думаешь, что шутка, спасибо за видео!
С ломбоком (@Data) не проходит тесты. Сначала теряется сесссию( лечится запуском теста с аннотацией @Transactional), потом вываливается в StackoverflowError .
потому что он тебя редиректит на другую страницу. У себя я немного поменял тест и он прошел (у меня идет редирект на страницу с параметром error): .andExpect(status().is3xxRedirection()) .andExpect(redirectedUrl("/showMyLoginPage?error"));
Привет, спасибо за уроки, можешь объяснить про, web socket (а точнее разработка на spring web messenger) если можно, так же на этом примере. Заранее спасибо!
Добрый день. Спасибо за отличные видео. У меня вопрос, может кто подскажет. Если я на добавление сообщения поставил редирект, то у меня не отрабатывает тест на добавление сообщения. Куда и как правильно указать редирект чтобы тест проходил?
@Dru сколько времени у тебя уходит на то что-бы вот в этом все разобраться? Просто смотрю не могу оторваться, и понимаю, какой объем инфы нужно перелопатить, что-бы вникнуть! А еще вот это: "...и для этого есть аннотация, и для этого, и ....∞ " и походу это только вершина айсберга))
Доброго времени суток. Автору спасибо за видео. У меня две проблемы в этой теме badLogin выводит 302 статус , а не 403. Тест не проходит. correctLoginTest() редирект делает на login?error, в место той странице которую задаю я. помогите разобраться.
Привет у меня проблем при mainPageTest() org.xml.sax.SAXParseException; lineNumber: 176; columnNumber: 3; The markup in the document following the root element must be well-formed. В чем может быть проблемммма?
А в чем проблема кидать данные в базу один раз перед всеми тестами, пометив сами тесты как @Transactional, чтобы все изменения после завершения теста откатывались?
Затем, что когда у тебя больше 20 страниц на сайте, ты забьёшь проверять все страницы после каждого изменения и пропустишь ошибку. Более того, что в 90% случаев ты даже не угадаешь, что именно может отвалиться, когда ты правишь какой-то сервис, ибо в голове всего не удержишь. С ростом приложения количество таких мест только будет расти
Не могу понять, сделал все полностью как у автора для запуска первого теста, со всеми зависимостями и аннотациями, но всё равно нету кнопки запуска теста. Примеры из гайда тоже брал, не запускает. В настройках проекта папка для тестов как надо определена. Подскажите пожалуйста, с чем это может быть связано?
В общем столкнулся с весьма неприятной ситуацией. Если кто захочет всё это делать на Kotlin то учтите что Repetable annotation не поддерживаются до сих пор. То есть выполнить аннотацию @Sql before и следом поставить @Sql after не получится. В гайдах у спринга нашел что в тестах можно использовать такие аннотации у функций как @BeforeAll и @AfterAll которые собственно означают что данная функция исполняется до остальных либо после. В общем пришлось создавать отдельный класс компонент в котором заавтовайрил JdbcTemplate и уже в нём руками написал теже запросы что и были созданы в ресурсах.
Знаю тупой вопрос но почему в тесте логина с плохими кренделями у нас статус 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: Забыл сказать спасибо за уроки Дрю :)
решая проблемы с 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,
Спасибо за видосы. Может кто подскажет как протестировать input (когда редактируешь сообщение). Единственное что понял так это проверить на наличие самого input .andExpect(xpath("//input[@id='inputMSG']").exists()). Как узнать value?
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;
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".
Блин, падает 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()); пройдут успешно, а при попытке получить контент получите ошибку.
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 =)
Кстати, хочу сказать большое спасибо автору, отличный контент.
Не возможно найти слова благодарности... Автор ты лучший)))))))))))))))
Круто, спасибо за труд) Будет ещё очень интересно послушать про CI ) если такое планируется))
А давай сниму, чего нет-то? Подумаю как обыграть
letsCode круто, буду ждать))
Спасибо очень круто! Будет интересно про Rest посмотреть!
Первый раз глянул и скопипастил - почти ничего не поняв, прочекав больше инфы снова пересмотрел и уже с понимаем всё подстроил под свой проект, ещё раз благодарствую, всё очень сжато и крайне информативно!)
Твои видосики облегчают мою жизнь. Прям очень сильно. Спасибо большое!
Спасибо большое автору. Да, Lombok мне тоже пришлось "выпилить". Как говорится, explicit всегда лучше чем implicit. Гайд на сайте SpringBoot немного изменился, повторяла за автором. В остальном все замечательно, все работает :) Спасибо, Андрей!
просто в восторге от автора и его уроков
Ничего лишнего, только код и объяснение нужных вещей. Спасибо!
Для 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 Спасибо! Помогло!
Если у кого-то будет выдавать ошибку в тесте mainPageTest, когда мы смотрим что у нас в навбаре - xpath может брать значение с кучей пробелов и тест будет падать хотя значение самой строки вроде тоже. нужна функция normalize-space для xpath
Выглядеть будет как-то так:
xpath("normalize-space(//*[@id='navbarSupportedContent']/div)").string("admin")
велике дякую що находиш час на відео)
Спасибо! Отличный и лаконичный материал!
У кого не видит @TestPropertySource("/application-test.properties") сделайте следущее: Intellij Idea - File - Project Structure - Modules - src - test - java - resources - mark resources as "Test Resources". Мне сегодня помогло. На 22:15 два теста заработали.
Низкий поклон тебе, мил человек! :)
Не совсем понял смысл теста 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"). Иначе будет всегда ошибка
хорошая подача материала, подписка, лайк
Если вы на 10 минуте и вас не проходит correctLoginTest то скорее всего у вас тесты смотрят не в ту базу, и нужно сделать в классе аннотацию @TestPropertySource("/application-dev.properties")
мерси
Александр, спасибо огромное. 3 дня искал это. Нагуглить не смог, а тут ваш коммент.
Все очень классно и круто! спасибо тебе. Столько всяких тонкостей с написанием кода, сколько же нужно было времени чтобы с этим разобраться если писать все в первый раз?
Ну наконец-то из коробки нормальные вещи увидел! а не абракадабры всякие!)
Благодарю за материал!
Спасибо огромное)) Видео просто супер!!!)))))
Может ошибусь, но, imho, большинству подписчиков было бы не плохо объяснить вначале сам механизм тестирования с помощью JUnit...
По-моему, слишком круто с места в карьер!
будут и модульные тесты. Интеграционные легче понять в плане логики "что тестируем", unit тесты сложнее в восприятии, ибо тестируем не какой-то функционал, а что-то более абстрактное и сфера примерения уже. Я не сторонник написания юнит тестов для сервисов, которые что-то из БД тянут (которую еще и подменяют на H2). Юнит тесты в идеале должны тестировать чистые функции, чтобы не пришлось много mock объектов создавать
Вот об этом я и говорю - я, например, про тесты знаю, только то, что Maven библиотеку JUnit автоматически прибавляет в pom-файл.
И написал про JUnit, потому что увидел, что аннотации у Вас от этой библиотеки.
А про сам механизм тестирования могу только догадываться (молчу уже про его градации - "интеграционные", "модульные" и т.п. - вообще чума!).
Мир тестов не менее разнообразие, чем мир разработки :)
letsCode
Тогда беда... в моём случае так точно!
Спасибо, Андрей. Открывай свою школу))
вопрос по тестированию MainController. В sql-скриптах для тестов мы чистим таблицы и потом заносим в них данные. Я что-то не отразил, а каким образом они у нас создались вообще в бд первоначально. Подумал, что это благодаря свойству ...ddl-auto в properties, но он же у нас задан как validate, те не создаются таблицы автоматически, как я понял.
Работает только, если я задаю update вместо validate.
update. Сам себе отвечу. Только сейчас понял, что тут в проекте использовался flyway, далее нашел db/migration в ресурсах и врубился
Автору как всегда - респект. Подскажите , не проходит последний тест (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]
Спасибо Дрю!!!
Все видосы просто потрясающие, но конкретно этот с первого и даже со второго раза не заходит. После половины вообще потерялся) Видимо придется возвращаться к этой теме позже
Однозначно крутой ролик.
У меня есть вопрос, в строку @SpringBootTest мне приходится добавлять (classes = {Application.class}) точка запуска моего приложения, можете сказать почему у меня не работает без него?
Вот спасибо тебе, хороший человек )) Час копал, почему у меня ошибки сыплет. Прописал точку запуска - всё заработало!
Ты меня спас своим коментарием) Второй час копаю почему не работает, а тут все так просто!
Ты мега крут!
Чтобы найти все незакрытые тэги может потребоваться поиск по всему проекту: CTRL + SHIFT + F
была у кого-нибудь такая проблема: Spring норм поднимается, если запускать через мавен plugin run, при запуске через зелёный треугольник, то падает из-за того что не все бины инициализировались. Мб каких конфигов не хватает?
а из какого класса импортировать get("/")?
Большое спасибо !
Интересно, здорово на реальных +- примерах всё смотреть, но сложновато для начала, как по мне, а с другой стороны когда показывают слишком лёгкие примеры, тоже думаешь, что шутка, спасибо за видео!
С ломбоком (@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"})
У меня тест badCredentials не проходит почему-то, хотя код такой же. Expected :403
Actual :302. Почему так?
потому что он тебя редиректит на другую страницу. У себя я немного поменял тест и он прошел (у меня идет редирект на страницу с параметром error):
.andExpect(status().is3xxRedirection())
.andExpect(redirectedUrl("/showMyLoginPage?error"));
Привет, спасибо за уроки, можешь объяснить про, web socket (а точнее разработка на spring web messenger) если можно, так же на этом примере.
Заранее спасибо!
Поддерживаю, будет полезно!
Websocket будет, не переживайте
Очень содержательное видео
большое спасибо!
Круто!
У меня почему-то постоянно выпадает 405 ошибка на последнем тесте и ссылается на 80 строку.
Профессионально!
Евгений борисов использовать аннотацию springboottest не рекомендует, слишком тяжелая. Лучше использовать webmvctest и конфигурацию с бинами и моки.
Добрый день. Спасибо за отличные видео. У меня вопрос, может кто подскажет. Если я на добавление сообщения поставил редирект, то у меня не отрабатывает тест на добавление сообщения. Куда и как правильно указать редирект чтобы тест проходил?
@Dru сколько времени у тебя уходит на то что-бы вот в этом все разобраться? Просто смотрю не могу оторваться, и понимаю, какой объем инфы нужно перелопатить, что-бы вникнуть!
А еще вот это: "...и для этого есть аннотация, и для этого, и ....∞ " и походу это только вершина айсберга))
Именно. Мне жизни не хватит по всему спрингу видосов наснимать
Как всегда👍
Доброго времени суток. Автору спасибо за видео. У меня две проблемы в этой теме
badLogin
выводит 302 статус , а не 403. Тест не проходит.
correctLoginTest()
редирект делает на login?error, в место той странице которую задаю я.
помогите разобраться.
я у себя сделал так (не знаю, правильно ли, вроде ок):
.andExpect(status().is3xxRedirection())
.andExpect(redirectedUrl("/showMyLoginPage?error"));
Привет. Если можно, сможешь сделать урок по тестированию с использованием Spock?
Дрю делает вещи)
Чётенько )
Привет у меня проблем при 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
Дальше в логах идет описание проблемы: закритт тэг....
А в чем проблема кидать данные в базу один раз перед всеми тестами, пометив сами тесты как @Transactional, чтобы все изменения после завершения теста откатывались?
супер, только не совсем ясно, для чего в каждом тесте обращаться к mockMvc через this.mockMvc? почему нельзя писать просто mockMvc?
Thank you so much.
Лучше использовать конечно инжект через конструктор в тестах вместо @Autowired
почему то не работает фишка по переклучению баз данных.. может кто знает в какую сторону хотя бы копать ?
Кто-то может подсказать какой screen recorder использует автор? Спасибо!
Один глупый вопрос: _зачем столько много кода (тестирование HTML, например), если можно запустить и увидеть всё глазами?_
Затем, что когда у тебя больше 20 страниц на сайте, ты забьёшь проверять все страницы после каждого изменения и пропустишь ошибку. Более того, что в 90% случаев ты даже не угадаешь, что именно может отвалиться, когда ты правишь какой-то сервис, ибо в голове всего не удержишь. С ростом приложения количество таких мест только будет расти
Ok!
Убедительно!
Спасибо тебе ЧЕловечищее
Best! Спасибо
Не могу понять, сделал все полностью как у автора для запуска первого теста, со всеми зависимостями и аннотациями, но всё равно нету кнопки запуска теста. Примеры из гайда тоже брал, не запускает. В настройках проекта папка для тестов как надо определена. Подскажите пожалуйста, с чем это может быть связано?
В общем столкнулся с весьма неприятной ситуацией. Если кто захочет всё это делать на Kotlin то учтите что Repetable annotation не поддерживаются до сих пор. То есть выполнить аннотацию @Sql before и следом поставить @Sql after не получится. В гайдах у спринга нашел что в тестах можно использовать такие аннотации у функций как @BeforeAll и @AfterAll которые собственно означают что данная функция исполняется до остальных либо после. В общем пришлось создавать отдельный класс компонент в котором заавтовайрил JdbcTemplate и уже в нём руками написал теже запросы что и были созданы в ресурсах.
А не проще добавлять пользователей и записи для тестов не через 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 Надо было просто досмотреть видео до конца и в последном тесте есть решения :(
Супер
Спасибо!
простите, выглядит будто controller не нужен?
indeed for MainControllerTest
решая проблемы с 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,
Хочу с помощью интеграционных тестов проверить добавление пользователя. Тест ругается на капчу. Как правильно сымитировать проверку капчи?
Captcha в тестах не надо проверять. Т.е. надо добавить проперти в окружение, которое будет отключать проверку Captcha для тестов
@@letsCodeDru Подскажите, пожалуйста, какое нужно добавить проперти? Не могу найти нигде.
Спаси Бог.
Спасибо за видосы. Может кто подскажет как протестировать input (когда редактируешь сообщение). Единственное что понял так это проверить на наличие самого input .andExpect(xpath("//input[@id='inputMSG']").exists()). Как узнать value?
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;
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".
Блин, падает 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());
пройдут успешно, а при попытке получить контент получите ошибку.
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;
Спасибо за подробные и наглядные примеры, видео полезное. Но монтаж... я бы лучше посмотрел полную версию в час и 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 не проходили. Оказалось, что помимо тегов, которые указывает автор, необходимо смотреть еще и на свои теги, которые Вы могли добавить когда оформляли приложение. У меня это выглядело так:
--------------------------------
Спасибо! Отличный и лаконичный материал!
Спасибо!
Супер
Спасибо! Отличный и лаконичный материал!
Спасибо! Отличный и лаконичный материал!
Спасибо большое
Спасибо! Отличный и лаконичный материал!
Спасибо! Отличный и лаконичный материал!