«1. Обзор

В этом руководстве мы рассмотрим использование библиотеки REST-assured с Groovy.

Поскольку REST-assured использует Groovy под капотом, у нас фактически есть возможность использовать необработанный синтаксис Groovy для создания более мощных тестовых случаев. Вот где фреймворк действительно оживает.

Для получения информации о настройке, необходимой для использования REST-assured, ознакомьтесь с нашей предыдущей статьей.

2. API коллекций Groovy

Давайте начнем с краткого обзора некоторых основных концепций Groovy – с несколькими простыми примерами, которые помогут нам понять, что нам нужно.

2.1. Метод findAll

В этом примере мы просто обратим внимание на методы, замыкания и неявную переменную it. Давайте сначала создадим набор слов Groovy:

def words = ['ant', 'buffalo', 'cat', 'dinosaur']

Теперь создадим еще один набор слов, длина которых превышает четыре буквы:

def wordsWithSizeGreaterThanFour = words.findAll { it.length() > 4 }

Здесь findAll() — это метод, применяемый к коллекция с закрытием, примененным к методу. Метод определяет, какую логику применять к коллекции, а замыкание дает методу предикат для настройки логики.

Мы говорим Groovy перебрать коллекцию и найти все слова, длина которых превышает четыре, и вернуть результат в новую коллекцию.

2.2. Переменная it

Неявная переменная it содержит текущее слово в цикле. Новая коллекция wordsWithSizeGreaterThanFour будет содержать слова buffalo и динозавр.

['buffalo', 'dinosaur']

Кроме findAll() существуют и другие методы Groovy.

2.3. Итератор сбора

Наконец, есть сбор, он вызывает замыкание для каждого элемента в коллекции и возвращает новую коллекцию с результатами каждого. Давайте создадим новую коллекцию из размеров каждого элемента в коллекции слов:

def sizes = words.collect{it.length()}

Результат:

[3,7,3,8]

Мы используем сумму, как следует из названия, чтобы сложить все элементы в коллекции. Мы можем суммировать элементы в коллекции размеров следующим образом:

def charCount = sizes.sum()

и результатом будет 21, количество символов во всех элементах в коллекции слов.

2.4. Операторы max/min

Операторы max/min интуитивно названы так, чтобы найти максимальное или минимальное число в наборе:

def maximum = sizes.max()

Результат должен быть очевидным: 8.

2.5. Итератор find

Мы используем find для поиска только одного значения коллекции, соответствующего предикату закрытия.

def greaterThanSeven=sizes.find{it>7}

Результат, 8, первое вхождение элемента коллекции, удовлетворяющего предикату.

3. Проверка JSON с помощью Groovy

Если у нас есть служба по адресу http://localhost:8080/odds, она возвращает список коэффициентов наших любимых футбольных матчей, например:

{
    "odds": [{
        "price": 1.30,
        "status": 0,
        "ck": 12.2,
        "name": "1"
    },
    {
        "price": 5.25,
        "status": 1,
        "ck": 13.1,
        "name": "X"
    },
    {
        "price": 2.70,
        "status": 0,
        "ck": 12.2,
        "name": "0"
    },
    {
        "price": 1.20,
        "status": 2,
        "ck": 13.1,
        "name": "2"
    }]
}

И если мы хотим проверить, что коэффициенты со статусом больше 1 имеют цены 1,20 и 5,25, то делаем так:

@Test
public void givenUrl_whenVerifiesOddPricesAccuratelyByStatus_thenCorrect() {
    get("/odds").then().body("odds.findAll { it.status > 0 }.price",
      hasItems(5.25f, 1.20f));
}

Здесь происходит вот что; мы используем синтаксис Groovy для загрузки массива JSON под ключевыми коэффициентами. Поскольку в нем более одного элемента, мы получаем коллекцию Groovy. Затем мы вызываем метод findAll для этой коллекции.

Предикат закрытия указывает Groovy создать другую коллекцию с объектами JSON, состояние которых больше нуля.

Мы заканчиваем наш путь ценой, которая указывает groovy создать еще один список только цен шансов в нашем предыдущем списке объектов JSON. Затем мы применяем к этому списку сопоставитель hasItems Hamcrest.

4. Проверка XML с помощью Groovy

Предположим, у нас есть служба по адресу http://localhost:8080/teachers, которая возвращает список учителей по их идентификатору, факультету и предметам, которые преподаются, как показано ниже:

<teachers>
    <teacher department="science" id=309>
        <subject>math</subject>
        <subject>physics</subject>
    </teacher>
    <teacher department="arts" id=310>
        <subject>political education</subject>
        <subject>english</subject>
    </teacher>
</teachers>

~ ~~ Теперь мы можем убедиться, что учитель естественных наук, возвращенный в ответе, преподает и математику, и физику:

@Test
public void givenUrl_whenVerifiesScienceTeacherFromXml_thenCorrect() {
    get("/teachers").then().body(
      "teachers.teacher.find { [email protected] == 'science' }.subject",
        hasItems("math", "physics"));
}

Мы использовали XML-путь Teachers.teacher, чтобы получить список учителей по XML-атрибуту, отделу. Затем мы вызываем метод find в этом списке.

Наш предикат закрытия, чтобы найти, гарантирует, что в итоге мы получим только учителей из отдела естественных наук. Наш XML-путь заканчивается на теге subject.

Поскольку существует более одного субъекта, мы получим список, который мы проверим с помощью сопоставителя hasItems Hamcrest.

5. Заключение

«В этой статье мы увидели, как можно использовать библиотеку с поддержкой REST с языком Groovy.

Полный исходный код статьи можно найти в нашем проекте на GitHub.