«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.