Тестируем REST API с Retrofit2

У меня полностью разработана система на Java, которая тестирует запросы в REST API, получая заранее подготовленные данные из json файлов. Здесь я покажу минимальные куски кода, которые помогут понять, как создать Java классы, которые будут содержать все ендпоинты вашего REST API. Для начала нужно установить Retrofit 2 и кажется он требует okhttp3:

<dependency>
            <groupId>com.squareup.retrofit2</groupId>
            <artifactId>retrofit</artifactId>
            <version>2.1.0</version>
</dependency>
<dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>3.4.1</version>
</dependency>

Создадим файл ApiService.java, которые будет содержать запросы в API:

public interface ApiService {
    @GET("api/user")
    Call<JsonElement> getUser(@Header("Accept-Language") String locale,
                              @Header("Authorization") String token);
}

GET это тип запроса, в скобках путь к ендпоинту апи. Внутри - заголовки которые мы передаем.

Ещё мы создадим класс, который тоже будет содержать методы, каждый из которых будет вызывать методы из класса ApiService, но с индивидуальными обработчиками. Зачем это нужно? Ну, например, каждый из запросов порождает определенного формата ответ от сервера, и модели этих ответов мы можем создать заранее, и легко работать потом с данными из этих ответов прямо в тестах. Вот пример метода из класса с запросами ApiEndpoints.java:

public class ApiEndpoints {
  public static UserToken getUser(String token) throws IOException {
        String locale = ConfigurationInstance.getInstance().getLocale(); // получение значения из конфигурации
        String authHeaderValue = "Bearer " + token;
        Call<JsonElement> call = RestClient.getInstance().getApiService().getUser(locale, authHeaderValue);
        Response response = call.execute();
        Object responseObject = response.body();
        Gson gson = new Gson();
        String json = responseObject.toString();
        UserToken responseUserToken = gson.fromJson(json, UserToken.class);
        return responseUserToken;
    }
}

Тут ответ преобразуется в тип UserToken. Это модель ответа сервера на такой запрос и она создана заранее.

Ну и наконец вызов запроса из самого теста:

@Test(description = "GET /api/user", groups = {"User"})
    public void getUser(ITestContext context) throws IOException, InterruptedException {
        String token = (String) context.getAttribute("token"); //токен берется из конфигураций или прошлых запросов
        UserToken userTokenResponse = ApiEndpoints.getUser(token); //вызов запроса
    }

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

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

Сурсы в этом посте немного пообрезаны и могут не работать в чистом виде, но думаю разобраться что нужно добавить будет уже не сложно.