Как стать автором
Обновить

Универсальный шаблон для написания API-тестов на Java: просто, понятно, для новичков

Уровень сложностиПростой

API-тесты — это важная часть автоматизации тестирования. Они помогают проверить, как работает серверная часть приложения, и убедиться, что API корректно обрабатывает запросы и возвращает правильные ответы. В этой статье я покажу, как написать API-тесты на Java с использованием библиотеки RestAssured и фреймворка JUnit 5. Мы также разберём, как использовать аннотации @BeforeEach и @AfterEach для подготовки и очистки данных.

Что нам понадобится?

  1. Java (версия 8 или выше).

  2. Maven для управления зависимостями.

  3. RestAssured — библиотека для работы с HTTP-запросами.

  4. JUnit 5 — фреймворк для написания тестов.

Настройка проекта

Добавь следующие зависимости в pom.xml:

<dependencies>
    <!-- RestAssured для работы с API -->
    <dependency>
        <groupId>io.rest-assured</groupId>
        <artifactId>rest-assured</artifactId>
        <version>5.3.0</version>
        <scope>test</scope>
    </dependency>

    <!-- JUnit 5 -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.9.2</version>
        <scope>test</scope>
    </dependency>

    <!-- Для работы с JSON -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.14.0</version>
    </dependency>
</dependencies>

Пример API-теста для PetStore

Мы будем тестировать API сайта https://petstore.swagger.io/. Напишем тесты для создания, получения и удаления питомца.

Класс теста

import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import io.restassured.response.Response;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class PetStoreApiTest {

    private static final String BASE_URL = "https://petstore.swagger.io/v2";
    private static final String PET_ENDPOINT = "/pet";
    private Long petId; // ID созданного питомца

    @BeforeEach
    public void setUp() {
        // Настройка базового URL для всех запросов
        RestAssured.baseURI = BASE_URL;

        // Создание тестового питомца перед каждым тестом
        String petJson = """
                {
                    "id": 0,
                    "category": {
                        "id": 1,
                        "name": "dogs"
                    },
                    "name": "Buddy",
                    "photoUrls": ["https://example.com/buddy.jpg"],
                    "tags": [
                        {
                            "id": 1,
                            "name": "friendly"
                        }
                    ],
                    "status": "available"
                }
                """;

        Response response = RestAssured.given()
                .contentType(ContentType.JSON)
                .body(petJson)
                .post(PET_ENDPOINT);

        // Сохраняем ID созданного питомца
        petId = response.jsonPath().getLong("id");
        System.out.println("Created pet with ID: " + petId);
    }

    @Test
    public void testGetPetById() {
        // Получение информации о питомце по ID
        Response response = RestAssured.given()
                .get(PET_ENDPOINT + "/" + petId);

        // Проверки
        assertEquals(200, response.getStatusCode(), "Failed to get pet by ID");
        assertEquals("Buddy", response.jsonPath().getString("name"), "Pet name mismatch");
        assertEquals("available", response.jsonPath().getString("status"), "Pet status mismatch");
    }

    @Test
    public void testUpdatePet() {
        // Обновление информации о питомце
        String updatedPetJson = """
                {
                    "id": %d,
                    "category": {
                        "id": 1,
                        "name": "dogs"
                    },
                    "name": "Max",
                    "photoUrls": ["https://example.com/max.jpg"],
                    "tags": [
                        {
                            "id": 1,
                            "name": "friendly"
                        }
                    ],
                    "status": "sold"
                }
                """.formatted(petId);

        Response response = RestAssured.given()
                .contentType(ContentType.JSON)
                .body(updatedPetJson)
                .put(PET_ENDPOINT);

        // Проверки
        assertEquals(200, response.getStatusCode(), "Failed to update pet");
        assertEquals("Max", response.jsonPath().getString("name"), "Updated pet name mismatch");
        assertEquals("sold", response.jsonPath().getString("status"), "Updated pet status mismatch");
    }

    @AfterEach
    public void tearDown() {
        // Удаление питомца после каждого теста
        if (petId != null) {
            Response response = RestAssured.given()
                    .delete(PET_ENDPOINT + "/" + petId);

            assertEquals(200, response.getStatusCode(), "Failed to delete pet");
            System.out.println("Deleted pet with ID: " + petId);
        }
    }
}

Объяснение кода

Аннотации JUnit 5

  • @BeforeEach: Метод setUp() выполняется перед каждым тестом. Здесь мы создаём нового питомца и сохраняем его ID.

  • @Test: Методы, помеченные этой аннотацией, являются тестами. Мы написали два теста: один для получения питомца по ID, другой для обновления информации о питомце.

  • @AfterEach: Метод tearDown() выполняется после каждого теста. Здесь мы удаляем созданного питомца.

Шаги теста

  1. Создание питомца (setUp):

    • Отправляем POST-запрос на создание питомца.

    • Сохраняем ID созданного питомца для использования в тестах.

  2. Тест 1: Получение питомца по ID:

    • Отправляем GET-запрос для получения информации о питомце.

    • Проверяем, что имя и статус питомца соответствуют ожидаемым.

  3. Тест 2: Обновление питомца:

    • Отправляем PUT-запрос для обновления информации о питомце.

    • Проверяем, что имя и статус питомца изменились.

  4. Удаление питомца (tearDown):

    • Отправляем DELETE-запрос для удаления питомца.

    • Проверяем, что питомец успешно удалён.

Запуск тестов

Запусти тесты через IDE (например, IntelliJ IDEA) или с помощью Maven:

mvn test

Итог

Использование аннотаций @BeforeEach и @AfterEach позволяет сделать тесты независимыми и гарантирует, что данные создаются и удаляются для каждого теста. Этот подход можно легко адаптировать для тестирования других API.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.