Разделы портала

Онлайн-тренинги

.
Начало работы с RestAssured.Net
09.02.2023 00:43

Автор: Баз Дейкстра (Bas Dijkstra)
Оригинал статьи
Перевод: Ольга Алифанова

В этой серии коротких статей я хочу поделиться рядом примеров использования RestAssured.Net для создания тестов REST/GraphQL API.

  • Начало работы и простые примеры (эта статья)
  • Параметризация тестов
  • Прямое и обратное преобразование
  • Авторизация и повторное использование
  • Тестирование GraphQL API

Все примеры из статьи можно найти на GitHub.

Введение

Я начал разрабатывать эту библиотеку по двум причинам:

  1. Искал способ улучшить свои навыки C#-разработки.
  2. Не мог найти хорошую библиотеку для создания тестов REST API на C#. RestSharp – превосходная библиотека, но создание тестов с ее помощью кажется излишне сложным делом.

Я годами восхищался библиотекой Java REST Assured, и решил портировать ее на C#. Йохан, создатель REST Assured, любезно дал мне разрешение использовать название и вдохновляться DSL "оригинальной" REST Assured, и даже дал мне ряд ценных подсказок и советов. Еще раз огромное спасибо!

Начало работы

Начать работать с RestAssured.NET очень просто:

  1. Создайте новый тестовый проект (примеры в этой статье используют NUnit).
  2. Добавьте RestAssured.NET как зависимость через NuGet.
  3. Добавьте директиву using static RestAssured.Dsl; напрямую в ваш тестовый класс.
  4. Пишите тесты!

Если вы работали с 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.

Обсудить в форуме