API Автотесты с нуля Rest Assured
ฝัง
- เผยแพร่เมื่อ 3 ส.ค. 2024
- Курсы по автоматизации тестирования с нуля - threadqa.ru/courses.html
Написание автотестов и инфраструктуры с нуля на заказ - threadqa.ru/ В этом видео я рассказал про библиотеку Rest Assured и Pojo классы для тестирования Api. Автотесты написаны с нуля
Boosty - boosty.to/threadqa
Написание автотестов и инфраструктуры с нуля на заказ - threadqa.ru/
Вторая часть видео, где разобрана работа с Rest Assured без создания Pojo классов и проверки напрямую в запросе - • API Автотесты с нуля R...
Наш чат в телеграмме где можете общаться и задавать вопросы по автотестам - t.me/threadqa
Поддержать автора - www.tinkoff.ru/cf/Lo21kq4VNG
Ссылка на проект - github.com/penolegrus/TH-cam...
00:00 - Начало
01:26 - Добавление Rest Assured в проект
03:15 - Обзор тест кейса №1 (Get запрос)
06:13 - Обзор Json ответа и сайта помощника
07:25 - Создание Pojo класса
11:19 - Создание тестового класса
12:46 - Обзор метода GET у библиотеки Rest Assured
19:55 - Выполнение проверки для теста через Stream API
26:58 - Обзор Specifications для Rest Assured
34:21 - Обзор тест кейса №2 (Post запрос)
36:06 - Pojo классы для Post запроса
37:57 - Создание тестового метода
43:56 - Обзор тест кейса №3 (Post запрос)
51:09 - Обзор тест кейса №4 (Get запрос с сортировкой данных)
55:54 - Обзор тест кейса №5 (Delete запрос)
58:07 - Обзор тест кейса №6 (Put запрос)
01:04:35 - Получение текущего времени в формате JSON
01:07:35 - Заключение
Моя группа в вк - threadqa
Отправить свой тест кейс: epickonfetka@gmail.com
Как написать Api автотесты с нуля
Rest Assured Java тестовый класс
Pojo паттерн
Ребят в связи с тем, что у многих возникают ошибки компиляции, нужно дополнительно установить библиотеку 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.
Сначала решил проблему (подтянул все твои библиотеки, и отключал по одной что-бы оставить только нужные), а потом почитал коммент)
Не люблю я простые решения))
решается добавлением jackson-databind и принудительным проставлением @JsonCreator @JsonProperty анотаций
@@aleksandrivanov156 ты не одинок)
Сделал, как рекомендуете, всё равно была ошибка (дошёл до 40 минуты +/- видео). Полез в документацию Jackson - там почитал. Потом пролистал вниз и читал все комменты и нашёл совет добавить Геттеры и Сеттеры. В итоге добавил библиотеку lombok к проекту + аннотации перед POJO-Классами @Getter @Setter и заработали тесты) Возможно я пропустил / не расслышал такую инфу в видео, что нужно добавлять и их тоже (Геттеры/Сеттеры).
2 замечания. Первое - в начале видео когда добавляете rest-ashured в pom отображения того самого значка обновления не видно потому что на его месте месте ваше прекрасное лицо. Второе - не имейте привычки оставлять в видео то как вы едите/пьете это во первых не эстетично выглядит во вторых лично мне не приятно и не интересно что вы там пьете или едите.
P.S. не упрОщённый вариант а упрощЁнный
Кайф! Спасибо за полезнейший контент 🙌 Наконец-то RA, API тесты, да ещё и на русском, да простят меня индусы 😁
Супер видео! Пожалуйста, продолжай снимать. Было б круто увидеть серию видео о разработке целого фреймворка для авто тестов.
ТС - мега-круто! Все разжевано от и до! Большое спасибо за сам материал, и отдельное спасибо - за его такую подачу!
Очень классный урок. С нуля очень доходчиво объяснил, всё встало на свои места. Особенно понравились примеры реальных ситуаций тестирования функционала. Много смысла унёс от твоей работы со стримами. Но хотелось бы ещё руку набить.
Огромное спасибо. Идея с курсом - отличная. Все объясняется в очень доходчивой форме, никаких вопросов не возникает.
Было бы интересно посмотреть как написать полноценный фреймворк для апи тестирования. Как правильно все по пакетам разложить, как создать какой-то универсальный реквест метод, чтобы не писать каждый раз given() и тд. Большое спасибо, очень помог!
как можно поставить тысячи лайков разом?) Спасибо большое! Очень полезный материал, рада, что увидела.
Огромное спасибо, за полезный контент. Долго искал материал по RA, но не думал, что попадется такой, после которого не останется вопросов.
Комменты можно прямо с каналов индусов копипастить :)
Спасибо! Прекрасно разъяснено! И работает сразу. Очень полезный тутор.
молодец. Тебе надо курсы платные преподавать. Очень здорово объясняешь
ребята, если у кого то после добавления 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(){} и всё заработает. Почему в видео работает без дефолтного конструктора - не понятно
тоже не понял почему в видосе без пустого работает
Классно объясняешь! Очень приятно смотреть твои видео.
Мимишность подачи зашкаливает)
Спасибо за видео , очень доступно описано и показано!
Спасибо, завтра собес на мидла, а я в основном в кукумбере+ геркин тесты писал, на готовых шагах, изредко их изменяя. Твои уроки ёмкие и весьма помогли разобраться с написанием шагов под бэк. Фронт я собственно уже умею, поэтому усвоился урок легко, всё вполне аналогично
Для тех, у кого ругается последний тест: нужно создать вторую переменную regex1 и применить ее к currentTime, так как у меня например в currentTIme 11 символов пришлось убирать
Супер целый час, кайфффф!! Главное продолжай , уверен что соберешь аудиторию ! ps. продолжаю ждать видосик по pom хотя бы 20 минутный ))
спасибо)
попозже засниму про него)
Классно ведёшь урок, респект!
Спасибо за видос, очень качественно и без воды.
Хороший трюк со стаканом))) но надо было после приветствия, типа здрасти бла бла - глоток - а теперь начнем))
спасибо, сделайте еще видео с наиболее используемыми тестами API
Огонь, и тут комментарий в поддержку, самый полезный контент по автоматизации на ютубе.
Да прибудет с тобой сила!
Спасибо большое!
Очень классно! Все подробно и по делу! Желаю успехов каналу!
Спасибо)
Огромное благодарю! Очень полезно! Через два месяца буду Junior QA Automation, сейчас middle+ на большом проекте, но уйду в автоматизацию и посижу два месяца на джаве.
И как ?
Спасибо за качественный контент! В Рунете очень мало информации по Rest Assured
Ты крутой! Не забрасывай канал! Отлично объясняешь!
Спасибо за видос, ждем продолжения)
Автор Красавчик, круто все разобрал по полкам, однозначно лайк, хотелось бы побольше уроков по сиай
Отличный курс молодого бойца по Rest Assured 👍👍
Спасибо за это видео, и в целом за то что делишься своими знаниями!)
Вопрос - будет ли какое нибудь видео с автотестами апи, где ты уделяешь тому как проходить авторизацию, то есть использование токентов и разных методов в автотестах.
Спасибо ;)
Спасибо тебе за твои видео, они реально очень информативны и понятны. Если есть возможность, сделай видос про Cyprees и использование в нем GraphQL. Спасибо тебе, не останавливайся!!!
Спасибо дружище! подача на отлично. Респект!
Спасибо за урок!
Спасибо, тебя приятно слушать, продолжай.
Огонь ждём ещё
1:05:30 количество символов после точки может получиться и больше 5, и меньше 5.
Поэтому я предлагаю такую регулярку: String regex = "\\..*$";
Это выражение найдет точку и вместе с ней выберет все символы до конца строки. А т.к точка в данном формате времени/даты одна, то не должно быть плавающих багов.
Вот, например, сколько символов может быть после точки:
2022-10-18T11:19:41 *_.892960400Z_*
2022-10-18T11:21:26. *_995Z_*
Спасибо, очень помог твой комментарий !
Спасибо, благодаря твоему комментарию у меня получилось выровнять формат времени, но у меня почему-то все равно тест падает из за несовпадения актуального и фактического результата и всегда отличие 2 минуты
(.{3}\..*)$ что бы наверняка.
@@user-kl7sb9ng6v Спасибо!
Суперпонятно все рассказал!) Спасибо!
Спасибо за видеоурок. Очень доходчиво и понятно. Подписаться)
Спасибо за работу, полезное видео!
Спасибо за Ваш труд! Коммент в поддержку канала
Спасибо, отличная обучалка.
Однозначно Лайк + Подписка! Продолжай в том же духе! Не хватило только авторизации. Но за весь труд 10/10!
суперспасибо! то, что искала
Спасибо большое за контент!
Привет, спасибо за воркшоп, очень полезно. Хотел бы попросить снять следующе видео в котором ты бы рассказал как правильно строить архитектуру тестов (какие директории создавать), где и как хранить Bearer token. Ещё было бы круто если это все крутилось на gradle.
Спасибо за видео!!!
Спасибо за отличный контент
молодец парень!
очень доступно
Добрый день. Запишите свой курс по чему угодно))) выложите на любом платном ресурсе. Я куплю!!!) Вам бы преподавать. Видео потрясающие
Отличный Пивозавр !
шикарный видос
Bolishoe spasibo!
Олег, спасибо за контент, я понимаю почему так много внимания уделяется java, но фокус уводится от библиотеки playwright.Если будут силы было бы круто увидеть контент по этой теме.
Привет! Подскажи пожалуйста алгоритм действий, когда в ресте дополнительно нужно прокидывать куки (токен авторизации, например)
Видео понравилось спасибо. По самой джаве ничего не планируешь показать?))
Всё хорошо, но названия полей класса лучше всё же делать по code convention, а то, что не матчится с JSON полями, так это легко исправляется аннотациями.
Супер. Скиньте ссылку на 2 видео и если есть курс по Java, то тоже. Спс
18:52 в консоль выводит, но лист пустой. ошибка на .getList. Если у кого так, нужно в классе сделать пустой конструктор
спасибо что ты есть)
красавчик
Автор, ты везде создаешь конструкторы используя библиотеку Jacson для работы с json. (ИМХО GSON лучше). Но джексон не умеет нормально с ними (конструкторами) работать без аннотаций JsonProperty и JsonAutoDetect.
У новичков будет много проблем и падающие тесты. И для решения надо пометить все аннотациями или сделать дополнительно пустой конструктор.
Чисто мимолетом глянул ролик, может потом об этом говорилось. Если так, то сорян :)
Ну и идеи на будущие видосы, не приучай новичков все параметры хранить в классе с тестами. Есть те же енамчики..хотя бы туда скидывать ошибки, почты и тп. И вызывать их через USER.EMAIL.
Когда вся дата в одном месте за ней проще уследить. А не бегать в каждом тесте менять на новую почту после апдейта разрабами.
Ты лучший, GSON вылечил
@@Roch3z))рад, что помог мой коммент))
Лучший!
21:15 контейнс тут не подходит, если айди 1 а аватар с индексом 11, то проверка будет пройдена, но это не корректно, там через регулярку бы
25:25 Второй пример можно через консумер сделать, в консумере извлечь что нужно и сделать ассерты
спасибо за видео, очень понятно рассказываешь
а будет видео еще с тест кейсами для rest assured?
видео будет, разберу как без pojo классов работать с ответом сервера
кажется мы с тобой в одном чате Ланит)) столько уже посмотрел уроков на эту тему, этот один из лучших
@@fromthegreatunknown блин внатуре)))
И добавлю, что курсов по Java очень много, есть и очень качественные. Разве что углубленное что-то, с нуля не думаю что актуально. Или что-то вроде решение каких-либо практических заданий.
Спасибо, интересненько). У меня не парсился json пока не прописал gson в pom.xml. Не подскажешь почему я не могу запустить тест через дебагер? Постоянно Exception in thread "main"
Олег, привет! Большое спасибо за качественный контетн! Если не трудно, можешь подсказать, как быть, если изначально для POST запроса у нас есть огромный json объект? Как быть в таком случае? Какой способ лучше использовать для создания запроса?
Нужно ли использовать специальные библиотеки для JSON типа GSON или Jackson? RA видимо и так успешно сериализует и десериализует объекты.
привет, нужно Jackson устанавливать отдельно, но если есть Selenide в проекте, то дополнительно ничего не нужно
@@threadqa понял, спасибо
время с сервера можно проверять в диапазоне "время отправки"< time < "время получения". и тогда не будет флаки теста
на каждый метод классы думаю не надо плодить, на сущности создавать и к ним билд приделать
Если кто то залез в комментарии ,чтоб посмотреть почему тест выдает ошибку и уже сломал голову не может понять в чем дело( как это было у меня)
Попробуйте мой способ: создавайте в каждом классе дополнительно по пустому конструктору и все переменные класса я сделал публичными.
Все работает на ура)
В зекрепе сделал ответ на этот вопрос))
Подскажи, пожалуйста, почему не используешь проверки самого rest assured, а используешь Assert. К примеру asserEquals можно заменить на equalTo, assetNotNull - на .body("$", notNullValue() и т.д.
привет! у меня на канале есть вторая часть видео про Rest Assured, там я показал как делать проверки прямо в Rest Assured)
Добрый день, автор! Могли бы вы предоставить все зависимости из вашего проекта?
почему то когда добавляешь пустые конструкторы, у меня ошибки уходят
Сделал по примеру как в видео в итоге при запуске с руки тест отрабатывает. А если через mvn clean test то почему то приходит пустой джисон.
Такой вопрос - когда мы пишем jsonPath в методе jsonPath().getList библиотеки Rest Assured, то путь к блоку data будет просто "data": jsonPath().getList ("data", UserData.class), а в методе read библиотеки jayway.jsonpath путь (jsonPath) к блоку data будет read("$.data"). Получается, jsonPath пишется не универсально, как, например, xpath, а для каждой библиотеки по-своему?
А если сайт будет не в свободном доступе, а нужна будет авторизация? например используя Token, как это можно сделать?
Привет. Как ты учился использовать Rest Assured? В официальной документации метод jsonPath используется всего в двух местах и несколько иначе, чем ты показываешь в видео. У тебя всё выглядит логичнее, чем в доке.
привет, я без документации делал
просто интуитивно по названию метода)
@@threadqa а как понимаешь, что за чем должно идти? Как научиться пользоваться фреймворком без документации? И как ты понял, что удобнее сделать файл спецификации и pojo-классы?
Подскажите, почему на 18-й минуте не видно в консоле debagger?
16:36 тело обязательно извлекать? Я пробовал без body() - всё работает. body() же в разных местах цепочки можно вызывать. В body() до вызова extract() указывается условие для проверки, которое мы хотим проверить в ответе, правильно? А для чего вызывается body() после extract(), если и без него всё работает? Если в этом месте у body() указать условие, то оно подчёркивается красным, в этом месте у body стоит expected 0 arguments.
У меня вообще всё не так (как обычно), жаль скрин не приложить.
Парка java не зеленая, нет возможности создать Packege, вместо создания класса - создание java class diagram, файл формата java тоже нет возможности создавать, только просто файл и вручную задавать формат. Про то как всё происходит в RegresTest я вообще молчу(
Не понимаю почему так(
Но рассказываете очень понятно, спасибо.
Подскажите какие dependencies у вас кроме rest-assured
Какую библиотеку изучать для автоматизации api на c#?
Всем привет, все получается, но не понимаю как в 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("путь", класс для определения переменных);
Сделал все, как ты показал в видео, но почему то на примере с 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 я как понял, но не понял почему
Привет, нужно добавит библиотеку jackson databind к проекту
@@threadqa спасибо большое
@@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)
все, поняла, добавила пустой конструктор и все заработало, спасибо
Вопрос, зачем, для тестирования апи (если это не юнит тесты) использовать что-либо кроме постмана?
Привет, кодом можно гораздо больше сделать чем через постман)
НЕ могу понять, почему выводит ошибку:
io.restassured.path.json.exception.JsonPathException: Failed to parse the JSON document
Хотя всё делаю точь-в-точь
После запуска теста
Выбивает ошибку Failed to parse the JSON document
Что может быть?
Ребята когда вам прилетает какая-то коллекция , всегда проверяйте , что она не пустая))) а то получите false positive test
вопрос. А если мне нужен будет не только содержащийся массив "data", а еще и те данные, которые помимо него есть.
Что мне при этом нужно строку с extract написать?
Привет, тогда можно просто extract.as(ClassName.class);
@@threadqa а ClassName должен при этом быть с тремя вложенными классами, как POJO выдает? Типа
public class ClassName{
class Datum{}
class Root{}
class Support{}
}
@@YashchiK да, ты извлекаешь полный ответ сервера в большой поджо класс, которые в себе должен содержать вложенные классы
учусь автоматизировать, еще мало понимаю, делаю все в точности как в ролике, как указано в 18 минуте видео запускаю ReqresTest но в консоли вылазит ошибка E:\Auto learning\Auto 1\src\test\java\API\ReqresTest.java:12:5
java: illegal start of expression и что дальше делать не знаю(
привет, скорее всего что то не указал
посмотри у меня проект на гитхабе в описании под видео
@@threadqa Да спасибо, на тот момент я только начал обучение и просто забыл ; поставить). Теперь стоит задача сделать синхронный тест с 2 запросами, где для 2-го запроса будет использоваться тело ответа из первого запроса. Буду благодарен если подскажешь в каком видео можно это подсмотреть (с меня лайки и комменты)
вот что раздражает в видео по АТ, то что они быстро усторевают, дольше сидишь копаешься, в том что, что-то вырезали или надо какие-то зависимости тянуть что бы все работало ...
Популярная ошибка есть в зекрепе в комментариях
47:08 Почему для класса unSuccessReg в цепочке given() отсутствует when()?
методы when() и and() это необязательный синтаксический сахар и используется просто, чтобы отделить визуальную логику строения запроса)
@@threadqa А) Получается, в создании экземпляра класса успешной регистрации тоже можно было их не использовать?
Что делать если в given () просит вписать параметры, не получается как у вас написать
Сделай плиз разбор для GraphQL
Спасибо за видео, очень помогло. По Вашему мануалу все получилось, но у меня по моему тесту есть вот такая проблема..
мне в body надо передать такое
"headers":{"accept":"application/json","WAREHOUSE-TEST":"1"},
и вот куда бы я его не писал, и в поджо класс запроса и в сабо body теста и в спеку везде отдает одну и ту же ошибку
error": {
"message": "Validation error.",
"additional": {
"fieldName": "WAREHOUSE-TEST",
"message": "Header parameter is not passed.",
"bindings": [
Помогите плиз что я не так делаю( Если я запрос передаю весь стрингой тогда проходит все без ошибок и ответ правильный. Заранее спасибо.
Привет, тебе это в заголовки надо помещать в блок headers
@@threadqa Привет, забыл отписать, там как раз в заголовке и не подходило надо было именно в бади передать. Но в итоге проблема была в том что я не правильно импорт подтянул для @JsonProperty и поэтому не видело имени которое я присваивал. Сделал все с нуля и все заработало.
Спасибо большое за Ваши уроки.
спасибо за видео.Но валится эта ошибка Cannot deserialize object because no JSON deserializer found in classpath. Please put Jackson (Databind), Gson, Jackson, or Yasson in the classpath
Установи библиотеку Jackson Databind
@@threadqa спасибо !
23:00 Я написал другой окончания имаила все равно работало
зачем примитивы менять на Object? (int vs Integer)
А вдруг кто ответит) Подскажите кто как решил проблему запуска api тестов параллельно на rest assured ?
привет, а зачем паралельно апи тесты, они ведь и так быстро идут)
плюсом еще можешь блокировку поймать за слишком частое обращение к серверу
@@threadqa а как быть в случаях, когда количество апи тестов переваливает за 10к?
(Y)
стримом мап в инт лист
потом ещё раз стримом сорт?
Эмммм.... можно было сразу после map(...).sorted().collect(...)
Для того стримы и есть чтобы так работать с коллекциями.
Олег, большое тебе и IT-шное спасибо за видео с примерами по автоматизации тестирования! \о/ У меня не одного вижу все тесты сыпались с ошибками хоть я и выполнял всё точь-в-точь как по видео. Мне какого-то хрена помогла библиотека "lombok" (в pom.xml ->
org.projectlombok
lombok
1.18.24
). Далее в классах где писались конструктора и геттеры нужно обязательно добавить 3 аннотации (@Data
, @AllArgsConstructo, @NoArgsConstructor) выглядело так:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SuccessReg {
private Integer id;
private String token;
}
Эта библиотека сама создает конструктора, геттеры, сеттеры и т.п. Они будут, но они явно не прописаны. И все тесты перестали ругаться на, то что нихрена не сериализуется.
Привет, спасибо)
Про ломбок знаю библиотеку, она очень удобная