Ребят в связи с тем, что у многих возникают ошибки компиляции, нужно дополнительно установить библиотеку Jackson DataBind и создавать пустые конструкторы в Pojo классах. У меня такой ошибки нет, потому что в проекте установлен Selenide, а в нем уже встроен этот функционал Ошибка: java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of UserData (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) Ошибка: Cannot deserialize object because no JSON deserializer found in classpath.
Сначала решил проблему (подтянул все твои библиотеки, и отключал по одной что-бы оставить только нужные), а потом почитал коммент) Не люблю я простые решения))
Сделал, как рекомендуете, всё равно была ошибка (дошёл до 40 минуты +/- видео). Полез в документацию Jackson - там почитал. Потом пролистал вниз и читал все комменты и нашёл совет добавить Геттеры и Сеттеры. В итоге добавил библиотеку lombok к проекту + аннотации перед POJO-Классами @Getter @Setter и заработали тесты) Возможно я пропустил / не расслышал такую инфу в видео, что нужно добавлять и их тоже (Геттеры/Сеттеры).
2 замечания. Первое - в начале видео когда добавляете rest-ashured в pom отображения того самого значка обновления не видно потому что на его месте месте ваше прекрасное лицо. Второе - не имейте привычки оставлять в видео то как вы едите/пьете это во первых не эстетично выглядит во вторых лично мне не приятно и не интересно что вы там пьете или едите. P.S. не упрОщённый вариант а упрощЁнный
молодец. Тебе надо курсы платные преподавать. Очень здорово объясняешь ребята, если у кого то после добавления users.forEach(x->Assert.assertTrue(x.getAvatar().contains(x.getId().toString()))); и попытки запустить, выводит ошибку от jackson "java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `api.UserData` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)" Это значит, что нужно добавить пустой конструктор в класс UserData. После конструктора с параметрами public UserData(Integer id, String email, String first_name, String last_name, String avatar) добавьте public UserData(){} и всё заработает. Почему в видео работает без дефолтного конструктора - не понятно
Очень классный урок. С нуля очень доходчиво объяснил, всё встало на свои места. Особенно понравились примеры реальных ситуаций тестирования функционала. Много смысла унёс от твоей работы со стримами. Но хотелось бы ещё руку набить.
Было бы интересно посмотреть как написать полноценный фреймворк для апи тестирования. Как правильно все по пакетам разложить, как создать какой-то универсальный реквест метод, чтобы не писать каждый раз given() и тд. Большое спасибо, очень помог!
Огромное благодарю! Очень полезно! Через два месяца буду Junior QA Automation, сейчас middle+ на большом проекте, но уйду в автоматизацию и посижу два месяца на джаве.
Спасибо, завтра собес на мидла, а я в основном в кукумбере+ геркин тесты писал, на готовых шагах, изредко их изменяя. Твои уроки ёмкие и весьма помогли разобраться с написанием шагов под бэк. Фронт я собственно уже умею, поэтому усвоился урок легко, всё вполне аналогично
1:05:30 количество символов после точки может получиться и больше 5, и меньше 5. Поэтому я предлагаю такую регулярку: String regex = "\\..*$"; Это выражение найдет точку и вместе с ней выберет все символы до конца строки. А т.к точка в данном формате времени/даты одна, то не должно быть плавающих багов.
Спасибо, благодаря твоему комментарию у меня получилось выровнять формат времени, но у меня почему-то все равно тест падает из за несовпадения актуального и фактического результата и всегда отличие 2 минуты
Для тех, у кого ругается последний тест: нужно создать вторую переменную regex1 и применить ее к currentTime, так как у меня например в currentTIme 11 символов пришлось убирать
Спасибо за это видео, и в целом за то что делишься своими знаниями!) Вопрос - будет ли какое нибудь видео с автотестами апи, где ты уделяешь тому как проходить авторизацию, то есть использование токентов и разных методов в автотестах. Спасибо ;)
Спасибо тебе за твои видео, они реально очень информативны и понятны. Если есть возможность, сделай видос про Cyprees и использование в нем GraphQL. Спасибо тебе, не останавливайся!!!
Автор, ты везде создаешь конструкторы используя библиотеку Jacson для работы с json. (ИМХО GSON лучше). Но джексон не умеет нормально с ними (конструкторами) работать без аннотаций JsonProperty и JsonAutoDetect. У новичков будет много проблем и падающие тесты. И для решения надо пометить все аннотациями или сделать дополнительно пустой конструктор. Чисто мимолетом глянул ролик, может потом об этом говорилось. Если так, то сорян :) Ну и идеи на будущие видосы, не приучай новичков все параметры хранить в классе с тестами. Есть те же енамчики..хотя бы туда скидывать ошибки, почты и тп. И вызывать их через USER.EMAIL. Когда вся дата в одном месте за ней проще уследить. А не бегать в каждом тесте менять на новую почту после апдейта разрабами.
Всё хорошо, но названия полей класса лучше всё же делать по code convention, а то, что не матчится с JSON полями, так это легко исправляется аннотациями.
21:15 контейнс тут не подходит, если айди 1 а аватар с индексом 11, то проверка будет пройдена, но это не корректно, там через регулярку бы 25:25 Второй пример можно через консумер сделать, в консумере извлечь что нужно и сделать ассерты
Привет, спасибо за воркшоп, очень полезно. Хотел бы попросить снять следующе видео в котором ты бы рассказал как правильно строить архитектуру тестов (какие директории создавать), где и как хранить Bearer token. Ещё было бы круто если это все крутилось на gradle.
И добавлю, что курсов по Java очень много, есть и очень качественные. Разве что углубленное что-то, с нуля не думаю что актуально. Или что-то вроде решение каких-либо практических заданий.
Если кто то залез в комментарии ,чтоб посмотреть почему тест выдает ошибку и уже сломал голову не может понять в чем дело( как это было у меня) Попробуйте мой способ: создавайте в каждом классе дополнительно по пустому конструктору и все переменные класса я сделал публичными. Все работает на ура)
Олег, спасибо за контент, я понимаю почему так много внимания уделяется java, но фокус уводится от библиотеки playwright.Если будут силы было бы круто увидеть контент по этой теме.
Олег, привет! Большое спасибо за качественный контетн! Если не трудно, можешь подсказать, как быть, если изначально для POST запроса у нас есть огромный json объект? Как быть в таком случае? Какой способ лучше использовать для создания запроса?
Всем привет, все получается, но не понимаю как в SINGLE USER (/api/users/2) достать значения чисто из "data". Получается, если создавать класс root, data and support и уже потом извлекать значения из "data". А можно как-то обойтись ТОЛЬКО созданием класса с переменными для "data" без root и support? В самом первом примере автор так сделал, только там был список "data", а у меня только один UPD: забавно, что через минуту догадался) SingleUser response = UserMethods.getUser().then().extract().jsonPath().getObject("data", SingleUser.class); в итоге для такого json нужен getObject("путь", класс для определения переменных);
вот что раздражает в видео по АТ, то что они быстро усторевают, дольше сидишь копаешься, в том что, что-то вырезали или надо какие-то зависимости тянуть что бы все работало ...
Подскажи, пожалуйста, почему не используешь проверки самого rest assured, а используешь Assert. К примеру asserEquals можно заменить на equalTo, assetNotNull - на .body("$", notNullValue() и т.д.
16:36 тело обязательно извлекать? Я пробовал без body() - всё работает. body() же в разных местах цепочки можно вызывать. В body() до вызова extract() указывается условие для проверки, которое мы хотим проверить в ответе, правильно? А для чего вызывается body() после extract(), если и без него всё работает? Если в этом месте у body() указать условие, то оно подчёркивается красным, в этом месте у body стоит expected 0 arguments.
Привет. Как ты учился использовать Rest Assured? В официальной документации метод jsonPath используется всего в двух местах и несколько иначе, чем ты показываешь в видео. У тебя всё выглядит логичнее, чем в доке.
@@threadqa а как понимаешь, что за чем должно идти? Как научиться пользоваться фреймворком без документации? И как ты понял, что удобнее сделать файл спецификации и pojo-классы?
Такой вопрос - когда мы пишем jsonPath в методе jsonPath().getList библиотеки Rest Assured, то путь к блоку data будет просто "data": jsonPath().getList ("data", UserData.class), а в методе read библиотеки jayway.jsonpath путь (jsonPath) к блоку data будет read("$.data"). Получается, jsonPath пишется не универсально, как, например, xpath, а для каждой библиотеки по-своему?
НЕ могу понять, почему выводит ошибку: io.restassured.path.json.exception.JsonPathException: Failed to parse the JSON document Хотя всё делаю точь-в-точь
У меня вообще всё не так (как обычно), жаль скрин не приложить. Парка java не зеленая, нет возможности создать Packege, вместо создания класса - создание java class diagram, файл формата java тоже нет возможности создавать, только просто файл и вручную задавать формат. Про то как всё происходит в RegresTest я вообще молчу( Не понимаю почему так( Но рассказываете очень понятно, спасибо.
У кого после этого com.fasterxml.jackson.core jackson-databind 2.13.4 ошибка не пропадает. Нужно еще добавить com.fasterxml.jackson.module jackson-module-scala_2.11 2.13.4
Спасибо, интересненько). У меня не парсился json пока не прописал gson в pom.xml. Не подскажешь почему я не могу запустить тест через дебагер? Постоянно Exception in thread "main"
Сделал все, как ты показал в видео, но почему то на примере с 18 минуты выдало ошибку "java.lang.IllegalStateException: Cannot deserialize object because no JSON deserializer found in classpath. Please put Jackson (Databind), Gson, Jackson, or Yasson in the classpath." Не подскажешь с чем может быть она связанна? Не понравился ему класс UserData я как понял, но не понял почему
@@threadqa Олег, а как идея сама понимает, что нужно использовать эту зависимость? Ведь никаких импортов пакетов в тестовом классе мы не делаем (и в pojo-классе тоже!), и не создаём условный Gson gson = new Gson(); ?
@@threadqa добавила библиотеку, теперь такая ошибка java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `api.UserData` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
У меня вконце упал тест (где со временем ассерт), я сделал вот так: String regex = "(.{8})$"; String regexResp = "(.{5})$"; String currentTime = Clock.systemUTC().instant().toString().replaceAll(regex,""); String respTime = response.getUpdatedAt().replaceAll(regexResp,""); Assertions.assertEquals(currentTime,respTime); также, по началу были ошибки связанные с джексоном, нужно было создать геттеры для всех полей + пустые конструкторы. и в тесте где создавали переменные для сравнения, я поменял вот так: (вынес значения сразу в ассерт) Assertions.assertEquals(4, successReg.getId()); Assertions.assertEquals("QpwL5tke4Pnpja7X4", successReg.getToken()); Спасибо тебе за урок) я раньше не юзал Pojo классы) просто скакал по элемента и через equals и contains сравнивал)
Столкнулся с той же проблемой. Помог вот такой regex: String regex = "(\\.?)(\\d{1,10})(\\w?)$"; Тест passed. Вывод обоих значений в консоль, оба показывают одинаковые pattern. 2022-08-05T14:54:39 2022-08-05T14:54:39
вопрос. А если мне нужен будет не только содержащийся массив "data", а еще и те данные, которые помимо него есть. Что мне при этом нужно строку с extract написать?
@@threadqa а ClassName должен при этом быть с тремя вложенными классами, как POJO выдает? Типа public class ClassName{ class Datum{} class Root{} class Support{} }
спасибо за видео.Но валится эта ошибка Cannot deserialize object because no JSON deserializer found in classpath. Please put Jackson (Databind), Gson, Jackson, or Yasson in the classpath
учусь автоматизировать, еще мало понимаю, делаю все в точности как в ролике, как указано в 18 минуте видео запускаю ReqresTest но в консоли вылазит ошибка E:\Auto learning\Auto 1\src\test\java\API\ReqresTest.java:12:5 java: illegal start of expression и что дальше делать не знаю(
@@threadqa Да спасибо, на тот момент я только начал обучение и просто забыл ; поставить). Теперь стоит задача сделать синхронный тест с 2 запросами, где для 2-го запроса будет использоваться тело ответа из первого запроса. Буду благодарен если подскажешь в каком видео можно это подсмотреть (с меня лайки и комменты)
Спасибо за видео, очень помогло. По Вашему мануалу все получилось, но у меня по моему тесту есть вот такая проблема.. мне в body надо передать такое "headers":{"accept":"application/json","WAREHOUSE-TEST":"1"}, и вот куда бы я его не писал, и в поджо класс запроса и в сабо body теста и в спеку везде отдает одну и ту же ошибку error": { "message": "Validation error.", "additional": { "fieldName": "WAREHOUSE-TEST", "message": "Header parameter is not passed.", "bindings": [ Помогите плиз что я не так делаю( Если я запрос передаю весь стрингой тогда проходит все без ошибок и ответ правильный. Заранее спасибо.
@@threadqa Привет, забыл отписать, там как раз в заголовке и не подходило надо было именно в бади передать. Но в итоге проблема была в том что я не правильно импорт подтянул для @JsonProperty и поэтому не видело имени которое я присваивал. Сделал все с нуля и все заработало. Спасибо большое за Ваши уроки.
стримом мап в инт лист потом ещё раз стримом сорт? Эмммм.... можно было сразу после map(...).sorted().collect(...) Для того стримы и есть чтобы так работать с коллекциями.