В наше время автоматизаторов всё чаще просят заавтоматизировать не только функциональные тесты для веба с использованием Selenium, но и написать тесты на API. В частности, для веб сервисов архитектуры REST.

В этой записке я приведу пару простых примеров использования библиотеки Rest-Assured, предназначенной для тестирования REST сервисов. Она поддерживает все типы запросов: POST, GET, PUT, DELETE, OPTIONS, PATCH, HEAD и может быть использована для проверки ответов по посланным запросам.

В качестве системы сборки я использую Maven, как наиболее простую и удобную. Итак, добавим в pom.xml следующие зависимости:

        <dependency>
            <groupId>io.rest-assured</groupId>
            <artifactId>rest-assured</artifactId>
            <version>3.0.7</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20180130</version>
        </dependency>

Далее привожу собственно примеры кода. Я думаю, комментарии излишни.

Пример посылки GET-запроса

package com.example.tests;

import static io.restassured.RestAssured.get;

import io.restassured.response.Response;
import org.json.JSONArray;
import org.json.JSONException;
import org.testng.Assert;
import org.testng.annotations.Test;

public class RestAssuredTestArticle {

    @Test(description = "GET")
    public void getRequestExampleTest() throws JSONException {
        Response response = get("http://restcountries.eu/rest/v1/name/russia");
        JSONArray jsonResponse = new JSONArray(response.asString());
        String capital = jsonResponse.getJSONObject(0).getString("capital");
        Assert.assertEquals(capital, "Moscow");
    }

}

Пример посылки POST-запроса

package com.example.tests;

import io.restassured.RestAssured;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;
import org.json.JSONObject;
import org.testng.Assert;
import org.testng.annotations.Test;

import java.util.Date;

public class RestAssuredTestArticle {

    @Test(description = "POST")
    public void postRequestExampleTest() {
        String someRandomString = String.format("%1$TH%1$TM%1$TS", new Date());

        JSONObject requestBody = new JSONObject();
        requestBody.put("FirstName", someRandomString);
        requestBody.put("LastName", someRandomString);
        requestBody.put("UserName", someRandomString);
        requestBody.put("Password", someRandomString);
        requestBody.put("Email", someRandomString + "@gmail.com");

        RequestSpecification request = RestAssured.given();
        request.header("Content-Type", "application/json");
        request.body(requestBody.toString());
        Response response = request.post("http://restapi.demoqa.com/customer/register");

        int statusCode = response.getStatusCode();
        Assert.assertEquals(statusCode, 201);
        String successCode = response.jsonPath().get("SuccessCode");
        Assert.assertEquals(successCode, "OPERATION_SUCCESS");
        System.out.println(response.getBody().asString());
    }

}

Комментарии (8)


  1. Borz
    04.02.2019 02:51

    вместо "someRandomString" можно более осмысленные поля отправлять с помощью Java Faker


  1. tuxi
    04.02.2019 03:10
    +1

    Я так и не понял из статьи, в чем тут плюшки по сравнению с той же Apache Commons например


    1. sshikov
      04.02.2019 09:00

      Плюшки тут есть, в некоторой дополнительной гибкости (но не факт, что оно лучше нового fluent в commons) — и еще REST Assured это именно средство для тестирования, поэтому там проще писать проверки. Но автор этого не раскрыл нифига.


      1. tuxi
        04.02.2019 09:35
        +1

        А в REST Assured какая-нибудь валидация структуры json присутствует?


        1. sshikov
          04.02.2019 10:06

          Да, разумеется.


        1. Borz
          04.02.2019 10:13

          там не только целиком структуры, но провалидировать можно только часть структуры, а остальные проигнорить. А ещё не важен порядок объявления полей, но можно и потребовать строгую посследовательность. А ещё можно сделать для конкретного поля свою проверку


  1. qwez
    04.02.2019 09:24

    Автор, вы не уловили суть библиотеки Rest-Assured. Посмотрели бы примеры использования для начала. У вас она просто в качестве http-клиента, но это как из пушки по воробьям. Примерно вот так можно переписать ваш первый пример:

    import org.hamcrest.Matchers;
    import org.testng.annotations.Test;
    
    import static io.restassured.RestAssured.*;
    
    public class TestTest {
    
        @Test
        public void test() {
            given()
                    .get("http://restcountries.eu/rest/v1/name/russia")
                    .then()
                    .body("[0].capital", Matchers.equalTo("Moscow"));
        }
    }


    1. sshikov
      04.02.2019 10:08

      Ну, в качестве клиента она тоже неплоха. Но в целом вы правы — тема не раскрыта совершенно. При этом тут уже была пара постов на эту же тему, гораздо более подробных.