сеньорчикОткрыть в Telegram
← вся теориятеория к собесу · Тестирование API

Сеть и протоколы для тестировщика

Сеть для тестировщика

Два замера, которые выглядят как одно «не работает». Обращение на порт, где никто не слушает: ответ через 21 миллисекунду, «соединение отвергнуто». Обращение к серверу, который соединение принял и замолчал: ровно 2000 миллисекунд ожидания и «время вышло». Первый случай - сервиса нет. Второй - сервис есть и завис. Это разные задачи и разные ответственные.

Стержень: «не работает» разбирают по слоям снизу вверх, а рассинхрон таймаутов между посредником и сервисом даёт 504 при живом сервисе.

// Формулировки: «как локализуешь сетевую проблему?», «чем таймаут соединения отличается от таймаута ответа?», «почему через балансировщик падает, а напрямую нет?».

Слои и порядок диагностики

Запрос проходит четыре слоя, и на каждом свой отказ. DNS: имя не превратилось в адрес - «такого хоста нет». TCP: адрес есть, но соединение не устанавливается - «отвергнуто» (никто не слушает) или «время вышло» (пакеты не доходят, обычно межсетевой экран). TLS: соединение есть, но не сошлись на шифровании или сертификат просрочен. HTTP: всё установилось, и приложение ответило кодом.

Разбирают снизу вверх, потому что верхний слой без нижнего не работает. Инструменты соответствуют слоям: команда резолва имени проверяет DNS, попытка подключиться на порт - TCP, а curl -v показывает всю цепочку разом: какой адрес выбран, как прошло шифрование, какие заголовки ушли и вернулись, каким кодом всё кончилось.

// Главная польза от curl -v в другом: он отделяет клиента от сервера. Если через него баг воспроизводится - проблема на сервере, и репорт идёт бэкендерам. Если не воспроизводится - дело в клиенте: в его заголовках, настройках или посреднике. Это экономит день переписки на каждом таком случае.

# видно выбранный адрес, шифрование,
# заголовки в обе стороны и код ответа
curl -v https://api.example.com/orders/42 \
  -H "Authorization: Bearer $TOKEN"
отвергнуто / время вышло
никто не слушает порт / пакеты не доходят или сервис завис
curl -v
показывает всю цепочку: адрес, шифрование, заголовки, код

Таймауты и почему приходит 504

Таймауты бывают двух видов, и путать их нельзя. Таймаут соединения - сколько ждём, пока установится связь. Таймаут ответа - сколько ждём ответ по уже установленной связи. В моём замере первый случай отработал за 21 миллисекунду (соединение отвергнуто сразу), второй съел всё отведённое время до последней миллисекунды.

А вот замер, объясняющий самую частую жалобу. Сервис честно считает три секунды и отвечает 200 - я обратился к нему напрямую и получил ответ через 3002 миллисекунды. Между клиентом и сервисом поставил посредника с таймаутом в одну секунду. Тот же запрос через посредника: 1003 миллисекунды и 504. Сервис исправен, запрос корректен, но посредник сдался раньше.

// Отсюда правило: таймауты в цепочке должны быть согласованы, и наружный обязан быть не меньше внутреннего. «Напрямую работает, через балансировщик 504» - это почти всегда не про сервис, а про рассинхрон настроек. Тестировщик, который это знает, приносит разработчикам диагноз, а не загадку.

таймаут соединения / ответа
ждём установления связи / ждём ответ по установленной связи
504
посредник не дождался ответа от сервиса за отведённое ему время

Посредники, имена и мобильная сеть

Посредник (обратный прокси или балансировщик) стоит перед сервисом и незаметно меняет картину: подставляет настоящий адрес клиента в отдельный заголовок, режет или добавляет заголовки, ограничивает размер тела, держит свои таймауты. Поэтому «работает напрямую, падает через него» - обычное дело, и разбирается сравнением того, что именно он поменял.

Имена тоже подводят. Ответ DNS кэшируется на время жизни записи, разные резолверы могут отвечать по-разному, а локальный файл соответствий на вашей машине перебивает всё. Классическая потеря недели: в этом файле осталась строчка со старым стендом, и человек честно тестирует не ту среду, а потом не может объяснить расхождение.

// И условия сети. Офисный провод не покажет того, что живёт на мобильном интернете: большие задержки, потери пакетов, смена сети на ходу. Это эмулируют - в панели разработчика есть режим замедления - и проверяют, что приложение переживает медленный ответ и обрыв. Отдельная ловушка на стороне клиента: исчерпанный набор переиспользуемых соединений выглядит как «сервер тормозит», хотя сервер здесь ни при чём.

обратный прокси
посредник перед сервисом: свои таймауты, лимиты и заголовки
локальный файл имён
перебивает DNS на вашей машине; забытая строка = не та среда

Как отвечать: «Через Postman работает, из кода нет - как разбираешься?»

Не гадаю, а нахожу различие, потому что сервер-то один и тот же. Первым делом воспроизвожу оба варианта через curl с подробным выводом: он показывает всю цепочку - какой адрес выбран, как прошло шифрование, какие заголовки ушли и вернулись, каким кодом всё кончилось. Дальше сравниваю по порядку убывания вероятности. Заголовки: Postman сам добавляет тип содержимого, принимаемые форматы, своё имя клиента и куки из окружения, а в коде их легко забыть или послать другими. Посредник: Postman может ходить через системный прокси, а код напрямую или через другой - и тогда цепочка разная. Тело и кодировка: сериализация в коде отличается от того, что руками вставлено в Postman, вплоть до лишнего пробела или другой кодировки. Таймауты: у клиента в коде может стоять короткий по умолчанию, и он не дожидается. И проверяю имена: не ходят ли они на разные адреса из-за локального файла соответствий или кэша. Метод простой - подробный вывод на обоих, разница по заголовкам, посреднику и телу. Обычно всё сводится к одному забытому заголовку.

Почему это сильный ответ: показан системный способ сравнения вместо догадок, различия перечислены по вероятности, и названа конкретная команда, дающая всю цепочку.

На чём валят

  • Репортить «API лежит», когда имя не резолвится на конкретной машине.
  • Забытая строка в локальном файле имён - неделя тестирования не той среды.
  • Считать 504 поломкой сервиса: сервис ответил за 3 секунды, а посредник ждал одну.
  • Не различать «соединение отвергнуто» и «время вышло» - это разные диагнозы.
  • Тестировать только на офисной сети - пользователь живёт на мобильном интернете с потерями.

Проверьте себя

Пять вопросов из банка по этой подтеме. Всего их 12, остальные разбираются в тренажёре.

  1. #networking1 / 5
    Что HTTPS добавляет к обычному HTTP?
    A)Шифрование канала через TLS — трафик нельзя прочитать или подменить по пути
    B)Сжатие ответов, за счёт которого страницы грузятся заметно быстрее
    C)Кэширование страниц на стороне сервера для ускорения ответов
    D)Автоматическую проверку HTML-разметки на ошибки вёрстки перед её отправкой
    показать ответ и разбор
    +A)Шифрование канала через TLS — трафик нельзя прочитать или подменить по пути

    // разбор: HTTPS — это HTTP поверх TLS: канал шифруется, поэтому данные (пароли, токены, куки) нельзя прочитать или незаметно подменить при перехвате, а сертификат подтверждает подлинность сервера. Сам формат запросов и ответов HTTP при этом не меняется. Тестировщик проверяет: работает ли редирект с http на https, валиден ли сертификат, не уходят ли чувствительные данные по открытому http, нет ли смешанного контента (mixed content).

  2. #networking2 / 5
    Что происходит после ввода URL и до появления страницы?
    A)Браузер сразу отправляет HTTP-запрос прямо на домен, минуя промежуточные шаги
    B)Сервер сам находит браузер по имени и присылает страницу без запроса от клиента
    C)Браузер открывает соединение прямо по имени домена, IP-адрес при этом не требуется
    D)Резолв имени через DNS → TCP-соединение → TLS (для https) → HTTP-запрос → ответ
    показать ответ и разбор
    +D)Резолв имени через DNS → TCP-соединение → TLS (для https) → HTTP-запрос → ответ

    // разбор: Упрощённо цепочка такая: браузер резолвит доменное имя в IP через DNS, устанавливает TCP-соединение с этим IP (рукопожатие), для https проводит TLS-рукопожатие, затем шлёт HTTP-запрос и получает ответ, который рендерит. Понимание слоёв помогает локализовать сбой: не резолвится имя (DNS), не открывается соединение (сеть/порт), ошибка сертификата (TLS) или уже ошибка приложения (HTTP-код). Это классический вопрос собеса тестировщика.

  3. #networking3 / 5
    Зачем тестировщику прокси-снифферы вроде Charles, Fiddler или вкладки Network в DevTools?
    A)Чтобы редактировать исходный код страницы прямо в браузере на лету
    B)Чтобы видеть и при необходимости подменять реальные HTTP-запросы и ответы
    C)Чтобы замерять покрытие кода автотестами во время их прогона
    D)Чтобы автоматически находить SQL-инъекции в базе данных приложения
    показать ответ и разбор
    +B)Чтобы видеть и при необходимости подменять реальные HTTP-запросы и ответы

    // разбор: Снифферы-прокси перехватывают трафик между приложением и сервером: тестировщик видит реальные запросы и ответы (заголовки, тело, коды, тайминги), может поставить точку останова и подменить запрос или ответ, эмулировать ошибку сервера, медленную сеть, битые данные. Это ключ к отладке интеграций и к обходу клиентской валидации (запрос шлём напрямую). Вкладка Network в DevTools — то же для веба в браузере. Это не редактор кода и не инструмент покрытия.

  4. #networking4 / 5
    Что проверяется при TLS-рукопожатии в начале HTTPS-соединения?
    A)Правильность логина и пароля пользователя перед входом в приложение
    B)Скорость канала, чтобы выбрать оптимальный размер передаваемых пакетов
    C)Подлинность сертификата сервера и согласование ключей для шифрования
    D)Наличие у пользователя прав на запрошенный ресурс приложения
    показать ответ и разбор
    +C)Подлинность сертификата сервера и согласование ключей для шифрования

    // разбор: При TLS-рукопожатии клиент и сервер договариваются о версии протокола и шифрах, сервер предъявляет сертификат, а клиент его проверяет: выдан ли доверенным центром (цепочка до корневого CA), не истёк ли, совпадает ли домен. Затем стороны согласуют сеансовый ключ, которым дальше шифруется трафик. Это про подлинность сервера и шифрование канала, а не про логин пользователя или его права — те проверяются уже на уровне приложения, после установки защищённого канала.

  5. #networking5 / 5
    Почему запрос из браузера блокируется по CORS, а тот же запрос из Postman проходит?
    A)CORS — это правило самого браузера; Postman не браузер и его не применяет
    B)Postman автоматически подставляет недостающие права доступа к API
    C)Сервер отдаёт Postman другие данные, чем браузеру, ориентируясь на User-Agent
    D)В Postman запрос идёт по HTTP, а в браузере по HTTPS, отсюда и блокировка
    показать ответ и разбор
    +A)CORS — это правило самого браузера; Postman не браузер и его не применяет

    // разбор: CORS (Cross-Origin Resource Sharing) — механизм безопасности браузера: при кросс-доменном запросе браузер смотрит заголовки ответа Access-Control-Allow-Origin и подобные и блокирует доступ скрипта к ответу, если домен не разрешён. Сервер при этом обычно отвечает нормально — доступ режет именно браузер. Postman и curl не браузеры, политику не применяют, поэтому запрос «проходит». Значит CORS чинят на сервере (заголовки), а воспроизводится ошибка только в браузере.

дальше

Теорию прочитали. Навык ставится повторением

В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.