Ответ
При тестировании REST API я проверяю соблюдение следующих ключевых принципов:
1. Единообразие интерфейса
- Ресурсы через URI: Проверяю, что эндпоинты используют существительные, а не глаголы
Правильно: GET /api/users Неправильно: GET /api/getUsers - HTTP-методы по назначению:
GET— получение данных (идемпотентный)POST— создание ресурсаPUT— полное обновление (идемпотентный)PATCH— частичное обновлениеDELETE— удаление (идемпотентный)
2. Stateless (Без состояния)
- Каждый запрос содержит всю необходимую информацию (обычно в headers)
- Проверяю, что аутентификация через токены, а не сессии
3. Кэширование
- Проверяю наличие соответствующих headers:
Cache-Control: max-age=3600 ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
4. Клиент-серверная архитектура
- Разделение ответственности: клиент — UI, сервер — логика и данные
5. Слоистая система
- Проверяю, что можно добавить прокси/балансировщик без изменения клиента
6. Код по требованию (опционально)
- Возможность передачи исполняемого кода (например, JavaScript)
Пример тест-кейсов для проверки REST принципов:
// Проверка корректного использования HTTP-методов
@Test
public void testPutMethodIdempotency() {
// Первый запрос
Response response1 = given()
.body(updatedUserData)
.put("/api/users/123");
// Второй идентичный запрос
Response response2 = given()
.body(updatedUserData)
.put("/api/users/123");
// Результаты должны быть одинаковыми
assertEquals(response1.getStatusCode(), response2.getStatusCode());
assertEquals(response1.getBody().asString(), response2.getBody().asString());
}
// Проверка stateless
@Test
public void testStatelessAuthentication() {
// Запрос без токена должен вернуть 401
given()
.get("/api/protected-data")
.then()
.statusCode(401);
// Запрос с токеном — 200
given()
.header("Authorization", "Bearer " + authToken)
.get("/api/protected-data")
.then()
.statusCode(200);
}
При тестировании также проверяю:
- Форматы данных (JSON/XML)
- Коды состояния HTTP
- HATEOAS (гипермедиа) если реализовано