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

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

.
Прямое и обратное преобразование JSON и XML в RestAssured.Net
29.06.2023 00:00

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

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

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

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

Преобразование

Преобразование – это процесс создания JSON или XML-представления объекта C#. RestAssured.Net поддерживает и JSON, и XML, и в этой статье мы разберем примеры для обоих случаев.

Для начала возьмем объект C#, представляющий собой пост в блоге:

public class Post
{
[JsonProperty("userId")]
public int UserId { get; set; }
    [JsonProperty("title")]
public string Title { get; set; } = string.Empty;
    [JsonProperty("body")]
public string Body { get; set; } = string.Empty;
    public Post()
{
}
}

Теперь, чтобы создать JSON или XML-представление копии этого класса, можно применить разные подходы. К примеру, можно построить JSON или XML "вручную" – однако тут высок риск ошибок, и это довольно громоздкий способ.

Мы также можем воспользоваться силой библиотек вроде Json.Net и System.Xml, чтобы переложить на них всю трудную работу. И именно это делает за вас RestAssured.Net – прямо из коробки.

Если мы хотим отправить JSON-представление объекта "пост в блоге", нам нужно просто передать его копию в метод Body():

[Test]
public void PostNewPostUsingPoco_CheckStatusCode_ShouldBe201()
{
Post myNewPost = new Post()
{
UserId = 1,
Title = "My new post title",
Body = "This is the body of my new post"
};
    Given()
.Body(myNewPost)
.When()
.Post("http://jsonplaceholder.typicode.com/posts")
.Then()
.StatusCode(201);
}

Запустив этот тест и логируя запрос стандартным образом, мы увидим, что копия Post преобразована в содержимое JSON:

{
"userId": 1,
"title": "My new post title",
"body": "This is the body of my new post"
}

Успех! Кстати, это также работает с анонимными объектами:

[Test]
public void PostNewPostUsingAnonymousObject_CheckStatusCode_ShouldBe201()
{
var myNewPost = new
{
userId = 1,
title = "My new post title",
body = "This is the body of my new post"
};
    Given()
.Body(myNewPost)
.When()
.Post("http://jsonplaceholder.typicode.com/posts")
.Then()
.StatusCode(201);
}

Если мы хотим преобразовать наш объект не в JSON, а в XML, нам нужно задать заголовок запроса Content-Type как application/xml:

[Test]
public void PostNewPostAsXmlUsingAnonymousObject_CheckStatusCode_ShouldBe201()
{
Given()
.ContentType("application/xml")
.Body(myNewPost)
.When()
.Post("http://jsonplaceholder.typicode.com/posts")
.Then()
.StatusCode(201);
}

В результате в конечную точку будет передано XML-содержимое:

<Post xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<UserId>1</UserId>
<Title>My new post title</Title>
<Body>This is the body of my new post</Body>
</Post>

Обратное преобразование

Содержимое ответов JSON или XML можно обратно трансформировать в сильно типизированные C#-объекты – такой процесс называется обратным преобразованием. В RestAssured.Net это делается при помощи метода As():

[Test]
public void GetPost_CheckTitle_ShouldBeExpectedValue()
{
Post myPost =
    (Post)Given()
.When()
.Get("http://jsonplaceholder.typicode.com/posts/1")
.As(typeof(Post));
    Assert.That(myPost.Title, Is.EqualTo("sunt aut facere repellat provident occaecati excepturi optio reprehenderit"));
}

Этот метод тоже работает и для JSON, и для XML. RestAssured.Net изучает значение заголовка ответа Content-Type и пытается преобразовать ответ в соответствии с этим значением – если значение заголовка не найдено, то по умолчанию это будет JSON.

Вот и все, что я хотел сказать про прямое и обратное преобразование при работе с содержимым JSON и XML в запросах и ответах RestAssured.Net. В следующей статье серии мы разберемся, как извлекать и повторно использовать свойства запроса и значения ответов, а также рассмотрим различные механизмы авторизации API, поддерживаемые RestAssured.Net.

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