Как настроить авторизацию для тестов в JUnit?

«Как настроить авторизацию для тестов в JUnit?» — вопрос из категории Автоматизация тестирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В JUnit авторизацию для тестов API настраивают, предварительно получая токен или учётные данные и передавая их в заголовках запросов. Основные подходы:

1. Использование @BeforeEach / @BeforeAll для настройки

Логика получения токена выполняется один раз перед всеми или каждым тестом.

import org.junit.jupiter.api.*;
import java.net.http.*;
import java.net.URI;

public class AuthorizedApiTest {
    private static String authToken;
    private HttpClient client;

    @BeforeAll
    static void obtainGlobalToken() throws Exception {
        // Получаем токен для всех тестов класса
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://api.example.com/login"))
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(
                        "{"username":"test","password":"secret"}"))
                .build();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        // Извлекаем токен из ответа (зависит от формата API)
        authToken = "Bearer " + parseTokenFromJson(response.body());
    }

    @BeforeEach
    void setupClient() {
        client = HttpClient.newHttpClient();
    }

    @Test
    void testGetProtectedResource() throws Exception {
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://api.example.com/protected/data"))
                .header("Authorization", authToken) // Используем заранее полученный токен
                .GET()
                .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        Assertions.assertEquals(200, response.statusCode());
    }
}

2. Распространённые методы авторизации в тестах:

  • Bearer Token: header("Authorization", "Bearer <token>")
  • Basic Auth: header("Authorization", "Basic " + Base64.getEncoder().encodeToString("user:pass".getBytes()))
  • API Key: header("X-API-Key", "your-api-key")
  • Cookies: Могут быть установлены после запроса на логин и автоматически передаваться клиентом в последующих запросах.

3. Использование библиотек для удобства

Для сложных сценариев (OAuth) используйте библиотеки, такие как RestAssured, которые упрощают добавление заголовков и аутентификацию.

given()
    .header("Authorization", "Bearer " + token)
    .when()
    .get("/api/resource")
    .then()
    .statusCode(200);