Универсальный шаблон для написания API-тестов на Java: просто, понятно, для новичков
API-тесты — это важная часть автоматизации тестирования. Они помогают проверить, как работает серверная часть приложения, и убедиться, что API корректно обрабатывает запросы и возвращает правильные ответы. В этой статье я покажу, как написать API-тесты на Java с использованием библиотеки RestAssured и фреймворка JUnit 5. Мы также разберём, как использовать аннотации @BeforeEach и @AfterEach для подготовки и очистки данных.
Что нам понадобится?
Java (версия 8 или выше).
Maven для управления зависимостями.
RestAssured — библиотека для работы с HTTP-запросами.
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() выполняется после каждого теста. Здесь мы удаляем созданного питомца.
Шаги теста
Создание питомца (setUp):
Отправляем POST-запрос на создание питомца.
Сохраняем ID созданного питомца для использования в тестах.
Тест 1: Получение питомца по ID:
Отправляем GET-запрос для получения информации о питомце.
Проверяем, что имя и статус питомца соответствуют ожидаемым.
Тест 2: Обновление питомца:
Отправляем PUT-запрос для обновления информации о питомце.
Проверяем, что имя и статус питомца изменились.
Удаление питомца (tearDown):
Отправляем DELETE-запрос для удаления питомца.
Проверяем, что питомец успешно удалён.
Запуск тестов
Запусти тесты через IDE (например, IntelliJ IDEA) или с помощью Maven:
mvn test
Итог
Использование аннотаций @BeforeEach и @AfterEach позволяет сделать тесты независимыми и гарантирует, что данные создаются и удаляются для каждого теста. Этот подход можно легко адаптировать для тестирования других API.