Начните с риска и oracle, затем выберите самый дешёвый уровень теста, который даст полезное доказательство. Название инструмента само по себе не является стратегией.
Вопросы и ответы
13 подробных ответов
01Опишите клиент-серверную архитектуру. Почему нельзя полагаться на валидацию только на клиенте?
junior
Короткий ответ: Клиент (браузер, мобильное приложение) отправляет запрос, сервер обрабатывает его и возвращает ответ — модель request/response поверх HTTP. Полагаться на клиентскую валидацию нельзя, потому что клиент полностью под контролем пользователя: форму можно обойти через curl, Postman или DevTools и отправить на сервер любые данные. Поэтому сервер обязан валидировать сам, а QA проверяет оба слоя независимо.
Подробно:
- Клиент — рисует UI, делает первичную валидацию для удобства (быстрый фидбек, без лишнего трафика), хранит токен.
- Сервер — источник правды: проверяет права, валидирует тело, пишет в БД. Это единственный слой, которому можно доверять.
- Что делает QA — не только кликает по UI, но и бьёт прямо в API в обход клиента: отправляет пустые/невалидные поля, чужой
id, инъекции — и смотрит, что сервер их отбил (400/403), а не сохранил.
КЛИЕНТ СЕРВЕР
┌────────┐ request (HTTP) ┌─────────┐
│ UI │ ─────────────────► │ API │
│ ✔ UX- │ │ ✔ обяза-│
│ валид. │ ◄───────────────── │ тельная │──► БД
└────────┘ response │ валид. │
▲ можно обойти: └─────────┘
└── curl / Postman / DevTools
⚠️ Частая ошибка: считать, что раз кнопка «Отправить» блокируется на форме, невалидные данные до сервера не дойдут. UI обходится за секунду — надёжная система проверяет всё на сервере.
02Назовите основные HTTP-методы. Какие из них идемпотентны?
middle
Короткий ответ: Основные методы — GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS. Идемпотентны GET, PUT, DELETE, HEAD, OPTIONS (повторный запрос не меняет состояние сверх первого). POST не идемпотентен — повторный вызов может создать ещё один ресурс или выполнить действие второй раз. PATCH идемпотентность не гарантирует: зависит от реализации.
Подробно:
Идемпотентность — свойство метода, при котором N одинаковых запросов дают тот же итог на сервере, что и один. Это про побочный эффект на сервере, а не про тело ответа.
| Метод | Назначение | Идемпотентен |
|---|---|---|
| GET | получить ресурс | да |
| HEAD | как GET, но без тела | да |
| OPTIONS | какие методы доступны | да |
| POST | создать / выполнить действие | нет |
| PUT | заменить ресурс целиком | да |
| PATCH | частично обновить | не гарантирован |
| DELETE | удалить ресурс | да |
DELETE идемпотентен по эффекту: ресурс удалён после первого вызова и остаётся удалён — хотя второй вызов может вернуть 404 (это ок, состояние не изменилось).
⚠️ Частая ошибка: назвать PATCH идемпотентным по аналогии с PUT. PATCH {"balance": +10} при повторе прибавит ещё 10 — а PUT кладёт абсолютное значение и потому идемпотентен. Спорные случаи сверяйте с MDN / RFC 9110.
03В чём разница между PUT и PATCH?
middle
Короткий ответ: PUT заменяет ресурс целиком — вы присылаете полное представление, и сервер перезаписывает объект им. PATCH обновляет частично — вы присылаете только изменяемые поля. PUT всегда идемпотентен; PATCH идемпотентность не гарантирует.
Подробно:
- PUT — полная замена. Тело должно содержать весь объект. Пропущенное поле трактуется как «этого поля нет» — сервер может обнулить его.
- PATCH — дельта. Присылаете только то, что меняете; остальные поля остаются как были.
- Связь с идемпотентностью. Повторный одинаковый PUT кладёт то же абсолютное состояние → идемпотентен. PATCH идемпотентен, только если операция абсолютная (
set city=Москва), и НЕ идемпотентен, если относительная (increment).
PUT /users/42 → тело: {name, email, city} — весь объект
PATCH /users/42 → тело: {city: "Москва"} — только дельта
Что тестировать: отправьте PUT без части полей и проверьте, обнулились ли они (частый баг); отправьте один и тот же PATCH дважды и сверьте, что состояние совпадает.
⚠️ Частая ошибка: слать PUT с неполным телом, ожидая частичного обновления. По спеке PUT — это замена: отсутствующие поля можно потерять.
04Чем 401 отличается от 403?
middle
Короткий ответ: 401 Unauthorized — сервер не знает, кто вы: креды не переданы, токен просрочен или невалиден. 403 Forbidden — сервер знает, кто вы, но у вас нет прав на это действие. Одним предложением: 401 — «не вошёл», 403 — «вошёл, но нельзя».
Подробно:
Это ровно пара аутентификация vs авторизация, разнесённая по статус-кодам:
| Код | Смысл | Причина | Что делать клиенту |
|---|---|---|---|
| 401 | не аутентифицирован | нет/битый/просроченный токен | залогиниться, обновить токен |
| 403 | нет прав | роль/скоуп не позволяет | логин не поможет — нужны права |
Сценарии:
- Дёрнули приватный эндпоинт вообще без заголовка
Authorization→ 401. - Обычный пользователь зашёл в
/adminс валидным токеном → 403. - Токен был, но истёк → 401 (клиенту стоит рефрешнуть и повторить).
⚠️ Частая ошибка: возвращать 403 на просроченный токен. Клиент решит, что не хватает прав, и не станет рефрешить токен — хотя достаточно было переаутентифицироваться (401). Из соображений безопасности API иногда намеренно отдаёт 404 вместо 403, чтобы не палить существование ресурса — это отдельно проговаривают.
05Чем 502 отличается от 504 и когда вы их увидите?
middle
Короткий ответ: И 502, и 504 отдаёт прокси/шлюз (nginx, балансировщик, API gateway), когда проблема в апстриме за ним. 502 Bad Gateway — апстрим ответил, но чем-то невалидным (мусор, разорванное соединение, упавший процесс). 504 Gateway Timeout — апстрим вообще не ответил вовремя, шлюз устал ждать.
Подробно:
Важно различать всю пятёрку 5xx рядом:
| Код | Кто виноват | Симптом |
|---|---|---|
| 500 | сам сервер | необработанное исключение в коде |
| 502 | апстрим за прокси | вернул невалидный ответ |
| 503 | сервис | временно недоступен (перегрузка, деплой) |
| 504 | апстрим за прокси | не ответил в отведённый таймаут |
КЛИЕНТ ──► ПРОКСИ / GATEWAY ──► АПСТРИМ (app)
(nginx, LB)
│ апстрим прислал мусор → 502
│ апстрим молчит, таймаут → 504
Как QA: увидев 502/504, не заводите баг на фронт — смотрите в логи апстрима и прокси. 504 часто про долгий запрос/таймаут gateway, 502 — про упавший или перезапускающийся сервис.
⚠️ Частая ошибка: перепутать пары местами — «502 это таймаут». Таймаут это 504; 502 это невалидный ответ живого, но сломанного апстрима.
06Какие классы HTTP статус-кодов существуют?
junior
Короткий ответ: Пять классов по первой цифре: 1xx — информационные, 2xx — успех, 3xx — редиректы, 4xx — ошибка клиента, 5xx — ошибка сервера. Ключевая граница — 4xx (виноват клиент: битый запрос, нет прав) против 5xx (виноват сервер).
Подробно:
| Класс | Смысл | Ходовой пример |
|---|---|---|
| 1xx | инфо, промежуточный ответ | 100 Continue |
| 2xx | успех | 200 OK, 201 Created, 204 No Content |
| 3xx | редирект | 301 Moved, 302 Found, 304 Not Modified |
| 4xx | ошибка клиента | 400, 401, 403, 404, 429 |
| 5xx | ошибка сервера | 500, 502, 503, 504 |
Что стоит помнить точечно:
- 201 Created — успешно создан ресурс (типичный ответ на POST).
- 204 No Content — успех без тела (часто DELETE).
- 304 Not Modified — кэш актуален, тело не пришлют.
- 429 Too Many Requests — сработал rate limit.
⚠️ Частая ошибка: отдавать 200 с телом {"error": ...}. Статус — часть контракта: ошибка должна ехать своим кодом (4xx/5xx), иначе клиенты и мониторинг считают запрос успешным.
07Чем REST отличается от SOAP и почему SOAP до сих пор живёт в банках?
middle
Короткий ответ: REST — это архитектурный стиль поверх HTTP: ресурсы по URL, стандартные методы, stateless, обычно JSON. SOAP — строгий протокол: XML-конверт фиксированной структуры, контракт в WSDL, свой стек стандартов (WS-Security и др.). SOAP тяжелее, но живёт в банках и enterprise из-за жёстких контрактов, встроенной безопасности и массы легаси-интеграций, которые никто не будет переписывать.
Подробно:
| Критерий | REST | SOAP |
|---|---|---|
| Что это | архитектурный стиль | протокол |
| Транспорт | только HTTP | HTTP, но и SMTP, MQ |
| Формат | обычно JSON (можно XML) | всегда XML-конверт |
| Контракт | OpenAPI (опц.) | WSDL (строго) |
| Безопасность | HTTPS + токены | WS-Security на уровне сообщения |
| Стиль | лёгкий, гибкий | строгий, многословный |
Почему банки держат SOAP: WSDL даёт машинно-проверяемый контракт, WS-Security и транзакционность прописаны в стандарте, а замена работающих межбанковских интеграций — это риск, который не окупается.
⚠️ Частая ошибка: назвать REST протоколом (это стиль) или поставить знак равенства REST = JSON. REST не привязан к формату — просто JSON стал де-факто выбором.
08Как протестировать API-эндпоинт без UI? Что именно проверяете в Postman?
middle
Короткий ответ: Бью прямо в эндпоинт из Postman/curl и проверяю не только статус, но и тело, схему, заголовки, авторизацию, негативные сценарии и время ответа. UI при этом не нужен — API тестируется как отдельный контракт.
Подробно:
- Статус-код — 200/201/204 на успех, ожидаемые 4xx на невалидный ввод.
- Тело и схема — поля на месте, типы верные, нет лишних/утёкших полей; валидирую по JSON-схеме, а не глазами.
- Заголовки —
Content-Type, кэш,Locationна 201. - Авторизация — без токена → 401; чужой токен → 403.
- Негативные кейсы — нет обязательного параметра, неверный тип, дубликат, граничные значения.
- Производительность — время ответа в рамках SLA.
- Chaining — вытащить токен/
idиз одного ответа и подставить в следующий запрос.
// Postman: тест ответа + сохранение токена для следующего запроса
pm.test("status 200", () => pm.response.to.have.status(200));
pm.test("has token", () => pm.expect(pm.response.json().token).to.exist);
pm.collectionVariables.set("token", pm.response.json().token);
// далее в заголовке: Authorization: Bearer {{token}}
⚠️ Частая ошибка: ограничиться assert 200. Сервис может вернуть 200 с пустым/битым телом или лишними полями — без проверки схемы и негативных кейсов это проходит мимо.
09В чём разница между аутентификацией и авторизацией?
junior
Короткий ответ: Аутентификация — доказать, кто ты (логин/пароль, код, токен); система убеждается в личности. Авторизация — что тебе можно (роли, скоупы, права); система проверяет доступ. Сначала аутентификация, потом авторизация.
Подробно:
- Аутентификация (AuthN) — «кто ты?». На входе креды, на выходе — сессия или токен (например, JWT). Провал → 401.
- Авторизация (AuthZ) — «что тебе разрешено?». Проверяются роли/скоупы, часто зашитые в клеймы JWT. Провал → 403.
- Порядок — нельзя авторизовать неизвестного: сперва подтверждаем личность, затем сверяем права на конкретное действие.
| Аутентификация | Авторизация | |
|---|---|---|
| Вопрос | кто ты? | что тебе можно? |
| Артефакт | логин, токен, OTP | роли, скоупы, ACL |
| Ошибка | 401 | 403 |
| Когда | первой | после |
⚠️ Частая ошибка: путать термины как синонимы. Валидный токен (аутентификация пройдена) не значит доступ ко всему — обычный пользователь с корректным токеном на /admin должен получить 403.
10Что такое TCP handshake и чем HTTPS отличается от HTTP?
middle
Короткий ответ: TCP handshake — трёхэтапное рукопожатие SYN → SYN-ACK → ACK, которым клиент и сервер устанавливают соединение до передачи каких-либо HTTP-данных. HTTPS — это HTTP поверх TLS: после TCP-рукопожатия идёт ещё TLS-рукопожатие (проверка сертификата, обмен ключами), и дальше весь HTTP-трафик шифруется.
Подробно:
- TCP handshake — гарантирует, что обе стороны готовы:
SYN(клиент),SYN-ACK(сервер),ACK(клиент). Только после этого соединение открыто. - TLS handshake (только HTTPS) — поверх TCP: сервер шлёт сертификат, стороны договариваются о ключах, включается шифрование.
- HTTP vs HTTPS — HTTP шлёт данные открытым текстом (порт 80); HTTPS — зашифрованно (порт 443), защита от перехвата и подмены.
TCP handshake TLS handshake (только HTTPS)
Клиент ── SYN ─────►
◄─ SYN-ACK ── Сервер
── ACK ──────►
── ClientHello ─────►
◄─ сертификат, ключи ─ Сервер
══ шифрованный HTTP ══►
⚠️ Частая ошибка: валить TCP- и TLS-рукопожатия в одно. Это два отдельных этапа: сначала устанавливается TCP-соединение, и только затем поверх него — TLS. HTTPS добавляет второй шаг, не заменяя первый.
11Кнопка на сайте не работает. Как понять, баг на клиенте или на сервере?
middle
Короткий ответ: Открываю DevTools: вкладка Console — есть ли JS-ошибка до/во время клика, и вкладка Network — ушёл ли вообще запрос, с каким статусом и телом. Если запрос не уходит или падает в JS — баг на клиенте; если запрос корректный, а ответ плохой (5xx / неверное тело) — баг на сервере.
Подробно:
- Console — красная JS-ошибка при клике часто означает, что обработчик упал и до сети дело не дошло → клиент.
- Network — смотрю, появился ли запрос. Нет запроса → клиент (не навесился хендлер, упал JS). Запрос есть → смотрю статус и тело.
- Разбор запроса/ответа — payload корректный, а ответ 500/битый → сервер. Payload кривой (не те поля) → клиент собрал запрос неправильно.
- Подтверждение — повторяю запрос в curl/Postman с тем же телом: воспроизвелось без UI → сервер, значит фронт ни при чём.
Клик
│
├─ JS-ошибка в Console? ─── да ─► КЛИЕНТ
│
├─ Запрос ушёл (Network)? ─ нет ─► КЛИЕНТ
│
└─ Ответ 5xx / битое тело? ─ да ─► СЕРВЕР
payload кривой? ───── да ─► КЛИЕНТ
⚠️ Частая ошибка: сразу писать «баг на бэке», не открыв Network. Если запрос вообще не ушёл — виноват клиент, и бэкендеру там делать нечего.
12Из чего состоит HTTP-запрос и HTTP-ответ?
junior
Короткий ответ: HTTP-запрос — это request line (метод, путь, версия), заголовки и опциональное тело. HTTP-ответ — status line (версия, статус-код, причина), заголовки и тело. Обе структуры разделяют заголовки и тело пустой строкой.
Подробно:
- Request line — метод (
GET/POST), путь (/users/42), версия (HTTP/1.1). - Заголовки — метаданные:
Host,Authorization,Content-Type,Accept. - Тело — данные запроса (JSON у POST/PUT); у GET обычно пустое.
- Status line (ответ) — версия, код (
200), причина (OK).
POST /api/login HTTP/1.1 ← request line
Host: api.example.com ← заголовки
Content-Type: application/json
← пустая строка
{ "email": "a@b.io", "pwd": "…" } ← тело
HTTP/1.1 200 OK ← status line
Content-Type: application/json ← заголовки
{ "token": "eyJhbGciOi…" } ← тело
Это фундамент для чтения вкладки Network и работы в Postman: там вы видите ровно эти части.
⚠️ Частая ошибка: путать заголовки и тело — например, слать токен в теле вместо заголовка Authorization, или искать данные POST в query-строке, а не в body.
13Как протестировать, что платёжный API безопасен при ретраях запроса?
senior
Короткий ответ: Проверяю idempotency key: клиент присылает уникальный ключ в заголовке (например, Idempotency-Key), и повторный POST с тем же ключом не создаёт второй платёж, а возвращает результат первого. Тестирую дубли, обрывы сети и параллельные ретраи — именно там всплывают двойные списания.
Подробно:
- Дубль запроса — два одинаковых POST с одним ключом → один платёж, второй ответ идентичен первому.
- Обрыв после списания — деньги списались, но ответ не дошёл; клиент ретраит с тем же ключом → повторного списания нет.
- Параллельные ретраи — два запроса с одним ключом одновременно (гонка) → создаётся ровно один платёж, второй ждёт/получает тот же результат.
- Другой ключ — тот же платёж, но новый ключ → это уже новый платёж (проверяю, что ключ реально влияет).
- Проверка на стороне БД — после серии ретраев в таблице ровно одна транзакция.
Клиент API
│ POST /pay Key: abc-123 ──► списание ✔, ответ теряется ✗
│ (таймаут, сеть оборвалась)
│ POST /pay Key: abc-123 ──► тот же ключ → возврат прежнего
│ результата, второго списания НЕТ
⚠️ Частая ошибка: считать, что «POST сам разберётся» или что хватит уникального order_id в теле. Без явного idempotency key и его проверки на сервере ретрай при обрыве сети даёт двойное списание — классический финтех-инцидент.
Источники
Источники и редакционная политика
Материалы RecallDeck сопоставлены с официальной документацией и открытыми публикациями компаний, когда первичный источник доступен. Мы не связаны с упомянутыми работодателями, не публикуем конфиденциальные задания и не продаём места в подборках. Формат найма может меняться — уточняйте его у рекрутера.
От чтения к воспроизведению
Отрепетируйте полный цикл интервью.
RecallDeck возвращает сложные темы по расписанию и помогает удерживать в памяти язык, SQL, архитектуру и поведенческие истории.