Тестирование Web и API
Основы клиент-серверного взаимодействия для тестировщика — методы и статус-коды HTTP, REST против SOAP, JSON, аутентификация и разбор запросов/ответов.
19 вопросов
JuniorТеорияОчень частоКакие есть диапазоны статус-кодов HTTP и назовите ключевой код в каждом?
Какие есть диапазоны статус-кодов HTTP и назовите ключевой код в каждом?
1xx — информационные, 2xx — успех (200 OK, 201 Created, 204 No Content), 3xx — перенаправление (301/302), 4xx — ошибка клиента (400 Bad Request, 401, 403, 404), 5xx — ошибка сервера (500, 502, 503). Первая цифра говорит, кто виноват: клиент прислал что-то неверное (4xx) или сервер не справился (5xx).
Типичные ошибки
- ✗Путать, какой диапазон значит ошибку клиента, а какой сервера
- ✗Считать 401 и 403 одним и тем же кодом
- ✗Думать, что любой код кроме 200 означает падение сервера
Уточняющие вопросы
- →Какой статус-код вернёт неверный логин и пароль?
- →Чем отличаются редиректы 301 и 302?
JuniorТеорияОчень частоЧто такое API и зачем тестировать его отдельно от UI?
Что такое API и зачем тестировать его отдельно от UI?
API — это контракт, позволяющий системам обмениваться данными без графического экрана: клиент шлёт запрос, сервер возвращает структурированный ответ. Тестировать его отдельно быстрее, можно начать до готовности UI, это изолирует баги бэкенда от багов интерфейса и упрощает покрытие негативных и граничных случаев и автоматизацию.
Типичные ошибки
- ✗Путать API с UI, который он обслуживает
- ✗Считать, что API-тесты можно начать только после готовности UI
- ✗Думать, что UI-тестирование делает API-тестирование лишним
Уточняющие вопросы
- →Какие классы багов легче найти на уровне API, чем UI?
- →Каким инструментом вы вручную отправите сырой API-запрос?
MiddleТеорияОчень частоЧем GET отличается от POST и как передаются параметры GET?
Чем GET отличается от POST и как передаются параметры GET?
GET читает данные и передаёт параметры в query-строке URL (?a=1&b=2), поэтому он кэшируемый, идемпотентный, ограничен по длине и виден в логах. POST создаёт или отправляет данные в теле запроса, не кэшируется и не идемпотентен.
Типичные ошибки
- ✗Менять местами, какой метод кэшируемый и идемпотентный
- ✗Говорить, что
GETне может передавать параметры - ✗Считать, что данные
POSTвидны в URL
Уточняющие вопросы
- →Почему помещать чувствительные данные в query-строку
GETрискованно? - →Почему
GETсчитают идемпотентным, аPOST— нет?
JuniorТеорияЧастоЧто такое клиент-серверная архитектура и что может быть клиентом?
Что такое клиент-серверная архитектура и что может быть клиентом?
В клиент-серверной архитектуре клиент посылает запрос, сервер обрабатывает его и возвращает ответ; они общаются по сетевому протоколу, например HTTP. Клиентом может быть всё, что инициирует запросы — браузер, мобильное приложение, другой backend-сервис, CLI-утилита или IoT-устройство, а не только человек у экрана.
Типичные ошибки
- ✗Думать, что клиентом может быть только браузер
- ✗Менять роли местами — считать, что запрос инициирует сервер
- ✗Считать, что клиент и сервер обязаны быть на одной машине
Уточняющие вопросы
- →Как сервер узнаёт, с какого устройства и на каком языке пришёл запрос?
- →Назовите не-браузерного клиента и протокол, который он использует.
JuniorТеорияЧастоНазовите основные методы HTTP и назначение каждого.
Назовите основные методы HTTP и назначение каждого.
Четыре базовых метода соответствуют CRUD: GET читает ресурс, POST создаёт новый, PUT заменяет или полностью обновляет, DELETE удаляет. PATCH применяет частичное обновление. GET передаёт параметры в query-строке URL, а POST, PUT и PATCH — данные в теле запроса.
Типичные ошибки
- ✗Менять местами роли чтения/создания у
GETиPOST - ✗Считать, что
GETпередаёт данные в теле - ✗Путать
PUT(полная замена) сPATCH(частичное обновление)
Уточняющие вопросы
- →Чем
GETиPOSTотличаются по кэшированию и передаче параметров? - →Какие из этих методов идемпотентны и почему?
MiddleТеорияЧастоКакие методы HTTP идемпотентны и что значит идемпотентность?
Какие методы HTTP идемпотентны и что значит идемпотентность?
Идемпотентность означает, что повтор одного запроса любое число раз оставляет сервер в том же состоянии, что и однократная отправка. GET, PUT, DELETE и HEAD идемпотентны; POST — нет, так как каждый вызов создаёт новый ресурс. Идемпотентность не требует одинаковых ответов — только одинакового итогового состояния.
Типичные ошибки
- ✗Называть
POSTидемпотентным из-за наличия тела - ✗Требовать одинаковых ответов вместо одинакового состояния
- ✗Считать
DELETEнеидемпотентным, потому что второй вызов может дать 404
Уточняющие вопросы
- →Почему
DELETEвсё равно идемпотентен, даже если второй вызов вернёт 404? - →Чем идемпотентность помогает при повторе запросов после таймаута?
MiddleДизайнЧастоСпроектируйте аккуратный REST API для системы пользователей биржи. Для каждой операции укажите URL, HTTP-метод и код успешного ответа: создать пользователя для конкретной биржи, получить всех пользователей, получить одного конкретного пользователя на конкретной бирже и дать пользователю доступ к конкретной бирже. Объясните выбор именования ресурсов и версионирования, почему выбрали каждый метод и статус-код и что делает дизайн RESTful.
Спроектируйте аккуратный REST API для системы пользователей биржи. Для каждой операции укажите URL, HTTP-метод и код успешного ответа: создать пользователя для конкретной биржи, получить всех пользователей, получить одного конкретного пользователя на конкретной бирже и дать пользователю доступ к конкретной бирже. Объясните выбор именования ресурсов и версионирования, почему выбрали каждый метод и статус-код и что делает дизайн RESTful.
Используйте ресурсы-существительные во множественном числе и префикс версии: POST /v1/exchanges/{id}/users → 201 Created (создание на бирже); GET /v1/users → 200 OK (все пользователи); GET /v1/exchanges/{id}/users/{userId} → 200 OK (один пользователь на одной бирже); выдача доступа — это создание ресурса доступа: POST /v1/exchanges/{id}/users/{userId}/access → 201 либо PUT членства → 200. Дизайн RESTful, потому что ресурсы — существительные в URL, HTTP-глагол несёт действие, статус-коды используются верно, а дизайн без состояния и единообразно версионирован.
Типичные ошибки
- ✗Помещать глаголы в URL вместо использования HTTP-методов
- ✗Возвращать 200 при создании вместо 201
- ✗Использовать GET для операций, меняющих состояние
Уточняющие вопросы
- →Какие из этих эндпоинтов идемпотентны и почему это важно?
- →Как версионировать API, не ломая существующих клиентов?
SeniorТеорияЧастоКакие способы аутентификации через HTTP вы знаете и чем они различаются?
Какие способы аутентификации через HTTP вы знаете и чем они различаются?
Распространённые схемы: Basic Auth (base64 от учётных данных в заголовке, безопасен только по HTTPS), токены Bearer/JWT, API-ключи, OAuth 2.0, Digest, сессионные cookies и mTLS. Различаются тем, где живёт секрет, истекает ли он и делегируется ли доступ.
Типичные ошибки
- ✗Считать Basic Auth безопасным без HTTPS
- ✗Путать OAuth 2.0 (делегированную авторизацию) с обычным входом
- ✗Считать токены и API-ключи равноценными по безопасности
Уточняющие вопросы
- →Почему Basic Auth всегда должен работать по HTTPS?
- →Что OAuth 2.0 добавляет сверх обычного API-ключа?
JuniorТеорияИногдаКакие типы данных поддерживает JSON и каковы его правила синтаксиса?
Какие типы данных поддерживает JSON и каковы его правила синтаксиса?
В JSON шесть типов значений: строка (всегда в двойных кавычках), число, булево (true/false), null, объект {} и массив []. Ключи должны быть строками в двойных кавычках. Формат запрещает висячие запятые, комментарии, одинарные кавычки и ведущие нули, а числа используют точку как десятичный разделитель.
Типичные ошибки
- ✗Забывать, что строки и ключи должны быть в двойных кавычках
- ✗Оставлять висячую запятую после последнего элемента
- ✗Использовать запятую вместо точки как десятичный разделитель
Уточняющие вопросы
- →В чём разница между JSON и XML?
- →Почему ведущие нули недопустимы в числе JSON?
MiddleТеорияИногдаОтправлены неверные логин и пароль — какой статус-код вернёт сервер?
Отправлены неверные логин и пароль — какой статус-код вернёт сервер?
Точный ответ — 401 Unauthorized: запросу не хватает валидных учётных данных. 403 Forbidden — другое: пользователь аутентифицирован, но ему не разрешено. Некоторые API отдают 400 Bad Request, если само тело некорректно, но для верно оформленных, но неправильных данных правильно 401.
Типичные ошибки
- ✗Путать 401 (не аутентифицирован) с 403 (не разрешено)
- ✗Возвращать 200 с флагом ошибки вместо кода 4xx
- ✗Считать отклонённый вход ошибкой сервера 5xx
Уточняющие вопросы
- →Когда 403 будет более правильным кодом, чем 401?
- →Почему API может вернуть 401 и для неизвестного пользователя, и для неверного пароля?
MiddleТеорияИногдаВ чём разница между HTTP и HTTPS?
В чём разница между HTTP и HTTPS?
HTTPS — это HTTP поверх TLS: трафик шифруется, сервер аутентифицируется сертификатом, а данные защищены от подмены. Обычный HTTP — открытый текст, доступный любому на пути. Оба имеют одну структуру сообщения: строка статуса, заголовки, тело.
Типичные ошибки
- ✗Путать, какой из них шифрует трафик
- ✗Думать, что HTTPS прячет статус-коды или заголовки
- ✗Считать, что HTTPS аутентифицирует клиента, а не сервер
Уточняющие вопросы
- →Как убедиться, что сайт действительно использует валидный TLS-сертификат?
- →Какие три гарантии TLS добавляет поверх HTTP?
MiddleТеорияИногдаКак сервер узнаёт устройство, браузер, ОС и язык клиента?
Как сервер узнаёт устройство, браузер, ОС и язык клиента?
Он читает заголовки запроса, которые шлёт клиент. User-Agent несёт браузер, ОС и устройство; Accept-Language — предпочитаемый язык; IP клиента и cookies добавляют контекст. Сервер использует их для согласования контента — отдавая локализованную страницу или ответ под устройство — поэтому один URL может вернуть разный контент разным клиентам.
Типичные ошибки
- ✗Думать, что сервер сканирует устройство, а не читает заголовки
- ✗Путать
User-AgentсAccept-Language - ✗Считать, что один URL обязан вернуть одинаковый контент всем
Уточняющие вопросы
- →Как
Accept-Languageможет дать одному устройству другой файл? - →Почему тестировщику не стоит доверять
User-Agentкак доказательству устройства?
MiddleТеорияИногдаЧем отличаются подходы к веб-сервисам REST и SOAP?
Чем отличаются подходы к веб-сервисам REST и SOAP?
REST — это архитектурный стиль вокруг ресурсов и URL, переиспользующий HTTP-глаголы, без состояния и обычно с JSON — лёгкий и гибкий. SOAP — это строгий протокол, оборачивающий каждое сообщение в XML-конверт, описанный контрактом WSDL, не зависящий от транспорта и несущий встроенные стандарты вроде WS-Security — тяжелее, но формальнее.
Типичные ошибки
- ✗Называть REST протоколом, а не архитектурным стилем
- ✗Привязывать SOAP к одному транспорту вроде HTTP
- ✗Считать, что REST не умеет XML или что SOAP нельзя тестировать
Уточняющие вопросы
- →Для чего нужен контракт формата данных WSDL?
- →Когда строгость SOAP предпочтительнее REST?
SeniorТеорияИногдаВ чём разница между синхронным и асинхронным взаимодействием?
В чём разница между синхронным и асинхронным взаимодействием?
При синхронном взаимодействии вызывающий блокируется и ждёт ответа, прежде чем продолжить. При асинхронном вызывающий сразу продолжает, а результат приходит позже через callback, опрос, webhook или очередь сообщений. Для тестировщика async привносит таймауты, отложенную согласованность и гонки, которых нет в синхронных потоках.
Типичные ошибки
- ✗Путать, какой режим блокирует вызывающего
- ✗Забывать, что async нужны callbacks, опрос или очереди
- ✗Упускать таймауты и гонки, которые вносит async
Уточняющие вопросы
- →Как бы вы проверили, что асинхронная задача в итоге завершится?
- →Какие гонки возможны только в асинхронных потоках?
MiddleТеорияРедкоС точки зрения тестировщика, почему в Kafka появляются дубли и как с ними борются?
С точки зрения тестировщика, почему в Kafka появляются дубли и как с ними борются?
Kafka (брокер сообщений, передающий сообщения между сервисами) группирует сообщения в partitions, а consumer groups читают их параллельно. Дубли появляются при доставке at-least-once: consumer обработал сообщение, но упал до коммита offset, и оно доставляется повторно. С ними борются дедупликацией — идемпотентной обработкой по уникальному ключу сообщения или idempotent producer, чтобы повторная обработка не давала лишнего эффекта. At-most-once избегает дублей, но рискует терять сообщения.
Типичные ошибки
- ✗Считать Kafka exactly-once по умолчанию
- ✗Путать семантику at-least-once и at-most-once
- ✗Игнорировать идемпотентную обработку как механизм дедупа
Уточняющие вопросы
- →Как протестировать, что consumer идемпотентен?
- →Что произойдёт, если consumers больше, чем partitions?
MiddleТеорияРедкоЧто такое переменные в API-инструменте Postman и какой scope побеждает при совпадении имён?
Что такое переменные в API-инструменте Postman и какой scope побеждает при совпадении имён?
Переменные позволяют переиспользовать значения (URL, токены, id) между запросами вместо их жёсткой записи. Postman разрешает scope по правилу «уже — побеждает»: Local > Data > Environment > Collection > Global, так что локальная переменная бьёт глобальную с тем же именем. При запуске коллекции сначала идёт pre-request скрипт уровня коллекции, затем pre-request скрипт каждого запроса перед его отправкой.
Типичные ошибки
- ✗Думать, что глобальный scope побеждает локальный
- ✗Считать, что все переменные делят один плоский scope
- ✗Ожидать, что скрипты запроса идут раньше скрипта коллекции
Уточняющие вопросы
- →Почему самый узкий scope получает приоритет при совпадении имён?
- →Когда вы храните токен в переменной окружения, а не в глобальной?
MiddleТеорияРедкоЧто такое WSDL и для чего он используется?
Что такое WSDL и для чего он используется?
WSDL (Web Services Description Language) — это XML-документ, формально описывающий SOAP-веб-сервис: его операции, сообщения и типы данных, которыми они обмениваются, а также эндпоинты и привязки. Это машиночитаемый контракт, который клиент читает, чтобы точно знать, как вызывать сервис, так что инструменты могут генерировать клиентские заглушки автоматически.
Типичные ошибки
- ✗Связывать WSDL с REST/JSON вместо SOAP/XML
- ✗Думать, что WSDL — язык запросов или стилизации
- ✗Забывать, что это машиночитаемый контракт для клиента
Уточняющие вопросы
- →Как WSDL позволяет клиенту сгенерировать код для вызова сервиса?
- →Почему REST обычно не нуждается в документе вроде WSDL?
MiddleТеорияРедкоКакие различия между форматами данных XML и JSON?
Какие различия между форматами данных XML и JSON?
JSON легче и ложится прямо на объекты ключ-значение и массивы, родной для JavaScript и по умолчанию без схемы. XML многословнее, использует вложенные теги с атрибутами и пространствами имён, поддерживает комментарии и проверяется по XSD-схеме. Сервисы SOAP используют XML, а REST-API чаще JSON.
Типичные ошибки
- ✗Утверждать, что JSON не умеет вложенные структуры
- ✗Считать, что у XML нет проверки по схеме
- ✗Жёстко привязывать каждый формат только к REST или SOAP
Уточняющие вопросы
- →У каких типов значений JSON нет прямого аналога в XML?
- →Когда пространства имён и схема XML оправдывают его многословность?
SeniorДебаггингРедкоНайдите все синтаксические ошибки JSON в этом блоке конфигурации
Найдите все синтаксические ошибки JSON в этом блоке конфигурации
Блок нарушает несколько правил JSON: строковое значение без кавычек (73bf37d59d), ведущий ноль (01), запятая как десятичный разделитель (20,5 должно быть 20.5), ключ без кавычек (title_font_style), висячая запятая после "mobile" и пропущенная закрывающая } у объекта {type, title} перед его ]. Кавычки у "false" допустимы, но, вероятно, должно быть булево false.
Типичные ошибки
- ✗Пропустить ключ без кавычек
title_font_style - ✗Упустить пропущенную закрывающую скобку перед
]массиваitems - ✗Считать подозрительную строку
"false"строгой синтаксической ошибкой
Уточняющие вопросы
- →Почему JSON запрещает ведущий ноль в числе вроде
01? - →Какие из этих ошибок поймал бы линтер, а какие — валидатор схемы?