Автор: Баз Дейкстра (Bas Dijkstra) Оригинал статьи Перевод: Ольга Алифанова
В этой серии коротких статей я хочу поделиться рядом примеров использования RestAssured.Net для создания тестов REST/GraphQL API.
-
Начало работы и простые примеры (эта статья)
- Параметризация тестов
- Прямое и обратное преобразование
- Авторизация и повторное использование
- Тестирование GraphQL API
Все примеры из статьи можно найти на GitHub.
Введение
Я начал разрабатывать эту библиотеку по двум причинам:
- Искал способ улучшить свои навыки C#-разработки.
- Не мог найти хорошую библиотеку для создания тестов REST API на C#. RestSharp – превосходная библиотека, но создание тестов с ее помощью кажется излишне сложным делом.
Я годами восхищался библиотекой Java REST Assured, и решил портировать ее на C#. Йохан, создатель REST Assured, любезно дал мне разрешение использовать название и вдохновляться DSL "оригинальной" REST Assured, и даже дал мне ряд ценных подсказок и советов. Еще раз огромное спасибо!
Начало работы
Начать работать с RestAssured.NET очень просто:
- Создайте новый тестовый проект (примеры в этой статье используют NUnit).
- Добавьте RestAssured.NET как зависимость через NuGet.
- Добавьте директиву using static RestAssured.Dsl; напрямую в ваш тестовый класс.
- Пишите тесты!
Если вы работали с REST Assured в Java, то создание HTTP GET-вызова к конечной точке и проверка кода статуса ответа (я называю это "Hello, World!" в мире API-тестирования) должно выглядеть очень знакомым:
[Test] public void GetLocationsForUsZipCode90210_CheckStatusCode_ShouldBe200() { Given() .When() .Get("http://api.zippopotam.us/us/90210") .Then() .StatusCode(200); }
Как можно видеть, при помощи всего одной читабельной строки кода можно создать и выполнить HTTP-вызов, а также получить и проверить ответ. Для логирования деталей ответа в консоль можно сделать так:
[Test] public void GetLocationsForUsZipCode90210_LogResponseDetails() { Given() .When() .Get("http://api.zippopotam.us/us/90210") .Then() .Log().All(); }
Это вернет следующий результат, включающий код статуса, заголовки, тело ответа и его скорость:
HTTP 200 (OK) Date: Fri, 25 Nov 2022 15:36:42 GMT Connection: keep-alive X-Cache: hit charset: UTF-8 Vary: Accept-Encoding CF-Cache-Status: DYNAMIC Report-To: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=F%2B9%2Fc5yMtrMtkXrp2iRyG5%2BTMDQcFeUB4JOrSc0ABXVhONkyOZ3v7YaEIbJvYf8%2BISAuIB1hcqM6%2FXduvAewxDqpJgvmSaGELqH6hGYit7Xg86VKOdHNQQvQY0kd0h90T4wcu35VhRKaeztSyd7AAQ%3D%3D"}],"group":"cf-nel","max_age":604800} NEL: {"success_fraction":0,"report_to":"cf-nel","max_age":604800} Access-Control-Allow-Origin: * Server: cloudflare CF-RAY: 76fb761d6b090bce-AMS Alt-Svc: h3=":443", h3-29=":443" { "post code": "90210", "country": "United States", "country abbreviation": "US", "places": [ { "place name": "Beverly Hills", "longitude": "-118.4065", "state": "California", "state abbreviation": "CA", "latitude": "34.0901" } ] } Response time: 236,8491 ms
RestAssured.Net также позволяет проверять заголовки ответов, и там есть служебные методы верификации заголовка ответа Content-Type. Тут можно узнать больше о верификации заголовков ответов.
Верификация элементов тела ответа
Для верификации элементов тела ответа JSON нужно задать две вещи: выражение JsonPath, извлекающее элемент для верификации, и ожидание от его значения. Вот как извлечь значение одного элемента и проверить, что оно точно совпадает с предустановленным:
[Test] public void GetLocationsForUsZipCode90210_CheckCountry_ShouldBeUnitedStates() { Given() .When() .Get("http://api.zippopotam.us/us/90210") .Then() .Body("$.country", NHamcrest.Is.EqualTo("United States")); }
Как можно видеть, RestAssured.Net использует NHamcrest для выражения ожиданий от значений свойств ответа. Это позволяет гибко настраивать конкретные ожидания от конкретных свойств ответа, включая коды статуса и значения заголовков и тела.
Пример посложнее: верификация, что список мест содержит точное совпадение с конкретным местом:
[Test] public void GetLocationsForDeZipCode24848_CheckPlaces_ShouldContainKropp() { Given() .When() .Get("http://api.zippopotam.us/de/24848") .Then() .Body("$.places[*].['place name']", NHamcrest.Has.Item(NHamcrest.Is.EqualTo("Kropp"))); }
В следующей статье серии мы посмотрим, как задавать параметры запроса и пути и пользоваться ими для создания параметризованных тестов с RestAssured.Net. Обсудить в форуме |