← Назад к вопросам

Что такое query-параметры?

1.0 Junior🔥 171 комментариев
#Теория тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Query-параметры (Параметры строки запроса)?

Query-параметры (также известные как параметры строки запроса или URL-параметры) — это часть URL (Uniform Resource Locator), следующая за символом вопросительного знака ?. Они представляют собой набор пар «ключ-значение», разделенных символом амперсанда &, которые используются для передачи дополнительных данных и параметров от клиента (например, браузера или мобильного приложения) к серверу при выполнении HTTP-запроса.

Базовая структура URL с Query-параметрами

https://api.example.com/search?category=books&author=tolkien&limit=10

В этом примере:

  • Базовый URL (endpoint): https://api.example.com/search
  • Символ начала параметров: ?
  • Параметр 1: category=books
  • Разделитель параметров: &
  • Параметр 2: author=tolkien
  • Параметр 3: limit=10

Таким образом, серверу передаются три параметра: category со значением books, author со значением tolkien и limit со значением 10.

Основное назначение и использование

  1. Фильтрация, сортировка и поиск данных: Самый частый сценарий в RESTful API.
    *   `GET /api/products?category=electronics&min_price=500&sort_by=rating`
  1. Пагинация: Указание смещения и количества возвращаемых элементов.
    *   `GET /api/news?page=2&per_page=20`
  1. Настройка ответа API: Например, выбор языка или формата данных.
    *   `GET /api/user/123?lang=ru&fields=id,name,email`
  1. Передача состояния в веб-приложениях: Часто используется для сохранения состояния фильтров, которые можно добавить в закладки или которыми можно поделиться.
  2. Отслеживание в маркетинге (UTM-метки):
    *   `https://site.com/?utm_source=newsletter&utm_medium=email`

Особенности с точки зрения QA Automation

Для автоматизатора тестирования API понимание query-параметров критически важно по нескольким причинам:

  • Тест-дизайн: Необходимо планировать тесты на корректную обработку сервером как валидных, так и невалидных параметров.
  • Валидация: Сервер должен проверять типы данных (строки, числа), обязательность параметров, допустимые диапазоны значений.
  • Негативное тестирование: Проверка реакции API на:
    *   **Дублирующиеся ключи:** `?id=1&id=2` (Какой `id` будет использован?)
    *   **Отсутствующие значения:** `?key=&key2=value` или `?key`
    *   **Специальные символы и кодирование:** Пробелы, амперсанды, кириллица должны быть корректно закодированы (например, пробел становится `%20`). Используется **URL Encoding (Percent-Encoding)**.
    *   **Очень длинные строки параметров** (возможное ограничение длины URL).
    *   **Некорректные типы данных:** Передача строки вместо ожидаемого числа (`?limit=ten`).

Пример кода для работы с Query-параметрами в автотестах (Python, requests)

import requests
import pytest

BASE_URL = "https://api.example.com/products"

def test_filtering_by_category_and_price():
    """Позитивный тест: фильтрация по категории и минимальной цене."""
    params = {
        "category": "books",
        "min_price": 100,
        "sort": "price_asc"
    }
    response = requests.get(BASE_URL, params=params)
    
    assert response.status_code == 200
    data = response.json()
    # Проверяем, что все товары в ответе соответствуют фильтру
    for product in data["items"]:
        assert product["category"] == "books"
        assert product["price"] >= 100
    # Проверяем порядок сортировки (первые дешевле последних)
    if len(data["items"]) > 1:
        assert data["items"][0]["price"] <= data["items"][-1]["price"]

def test_pagination():
    """Тест корректности работы пагинации."""
    params_page_1 = {"page": BO1, "per_page": 5}
    params_page_2 = {"page": 2, "per_page": 5}
    
    resp1 = requests.get(BASE_URL, params=params_page_1)
    resp2 = requests.get(BASE_URL, params=params_page_2)
    
    data1 = resp1.json()
    data2 = resp2.json()
    
    # Проверяем, что это разные наборы данных
    assert data1["items"][0]["id"] != data2["items"][0]["id"]
    # Проверяем соблюдение лимита на количество элементов
    assert len(data1["items"]) <= 5
    assert len(data2["items"]) <= 5

@pytest.mark.negative
def test_invalid_parameter_type():
    """Негативный тест: передача строки вместо числа для числового параметра."""
    params = {"limit": "not_a_number"}
    response = requests.get(BASE_URL, params=params)
    
    # Ожидаем ошибку клиента (4xx), например, 400 Bad Request или 422 Unprocessable Entity
    assert response.status_code == 400
    error_data = response.json()
    assert "error" in error_data
    assert "limit" in error_data["message"].lower()

Ключевые выводы для автоматизатора

  1. Query–параметры — это механизм GET-запросов. Хотя технически их можно передать и в теле других типов запросов, это противоречит лучшим практикам REST. Для передачи данных в POST, PUT, PATCH запросах используется тело запроса (request body), обычно в формате JSON или XML.
  2. Они видны в истории браузера и логах. Это важно с точки зрения безопасности — никогда не передавайте в query-параметрах чувствительные данные (пароли, токены, персональные данные). Для этого используются заголовки (headers), например, Authorization: Bearer <token>.
  3. Тестирование должно быть комплексным. Помимо позитивных сценариев, обязательно покрывайте граничные значения, некорректные типы, спецсимволы и отсутствующие обязательные параметры. Именно в обработке ошибок часто кроются уязвимости и баги.