Какие библиотеки вы используете для отправки HTTP-запросов в тестах?

«Какие библиотеки вы используете для отправки HTTP-запросов в тестах?» — вопрос из категории API тестирование, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Выбор библиотеки для HTTP-запросов в автотестах зависит от языка и контекста проекта. Вот мои основные инструменты:

1. Python: requests

  • Почему: Это де-факто стандарт. Имеет интуитивно понятный API, отличную документацию и широкую экосистему.
  • Пример использования в тесте с pytest:

    import requests
    import pytest
    
    BASE_URL = "https://api.example.com/v1"
    
    def test_get_user_returns_200_and_correct_schema():
        # Act
        response = requests.get(f"{BASE_URL}/users/1", headers={"Authorization": "Bearer token123"})
    
        # Assert
        assert response.status_code == 200
        data = response.json()
        assert "id" in data
        assert "name" in data
        assert isinstance(data["id"], int)
        # ... дальнейшие проверки по JSON Schema или Pydantic модели
    
    def test_post_user_creates_resource():
        payload = {"name": "John", "email": "john@test.com"}
        response = requests.post(f"{BASE_URL}/users", json=payload)
    
        assert response.status_code == 201
        assert "location" in response.headers  # Проверяем заголовок с ссылкой на новый ресурс

2. Java: REST Assured

  • Почему: Это не просто HTTP-клиент, а целый DSL (Domain Specific Language) для тестирования REST API. Позволяет в цепочке методов описывать запрос, отправлять его и проводить валидацию ответа.

    import static io.restassured.RestAssured.*;
    import static org.hamcrest.Matchers.*;
    
    @Test
    public void testUserEndpoint() {
        given()
            .header("Content-Type", "application/json")
            .auth().oauth2(accessToken)
        .when()
            .get("/api/users/1")
        .then()
            .statusCode(200)
            .body("id", equalTo(1))
            .body("name", notNullValue())
            .time(lessThan(2000L)); // Проверка времени ответа
    }

3. Для более сложных сценариев:

  • Асинхронные запросы: В Python для асинхронных фреймворков (FastAPI) использую httpx или aiohttp в асинхронных тестах.
  • Генерация клиента: В некоторых проектах мы генерируем типизированного API-клиента на основе OpenAPI/Swagger спецификации (с помощью openapi-generator), что делает тесты еще более надежными и соответствующими контракту.