Тестирование веб-приложений
HTTP для тестировщика: запрос и ответ, методы и коды ответов
HTTP (HyperText Transfer Protocol) – протокол прикладного уровня, по которому клиент, например браузер, отправляет серверу запрос и получает ответ. Запрос состоит из метода (GET, POST и других), адреса ресурса, версии протокола, заголовков и необязательного тела, а в ответе приходят код состояния из трёх цифр, заголовки и тело. По первой цифре кода видно, чем кончился запрос: 2xx означает успех, 3xx перенаправление, 4xx ошибку клиента, 5xx ошибку сервера.
- Запрос и ответ
- из этих двух сообщений состоит любой обмен по HTTP
- 5 классов кодов
- от 1xx до 5xx, по первой цифре видно, на чьей стороне ошибка
- Бесплатно
- урок с заданиями в моём базовом курсе
Что такое HTTP и где он в модели TCP/IP
Протокол – это набор правил, по которым информация передаётся по сети. HTTP расшифровывается как HyperText Transfer Protocol, протокол передачи гипертекста. По нему браузер общается с сайтом, мобильное приложение со своим сервером, а один сервис с другим.
Сетевых моделей две. Модель OSI делит передачу данных на семь уровней и нужна скорее как теоретическая схема, а сети интернета построены по модели TCP/IP с четырьмя уровнями. HTTP стоит на верхнем из них, прикладном. На собеседовании могут попросить назвать уровни и объяснить, чем TCP отличается от UDP.
Уровни помогают понять, где искать причину бага. Допустим, сайт доставки еды не грузит меню ресторанов. Если в Network у запроса вместо кода ответа стоит (failed) с ошибкой net::ERR_NAME_NOT_RESOLVED, имя сервера не удалось перевести в IP-адрес, до HTTP дело не дошло, и в баг-репорте пишут о проблеме с DNS. Если пришёл ответ 500 или 502, сеть и DNS отработали, и ошибку ищут на сервере.
Уровень сетевых интерфейсов
Физическая передача сигналов по кабелю, оптоволокну или радиоканалу.
Сетевой (межсетевой) уровень
Доставка пакетов от узла к узлу по адресам. Главный протокол этого уровня – IP.
Транспортный уровень
Протоколы TCP и UDP. TCP гарантирует доставку и отправляет потерянные данные заново, поэтому подходит для почты и передачи файлов. UDP шлёт данные потоком без подтверждений, и его выбирают онлайн-игры и видеосвязь, где важнее скорость.
Прикладной уровень
Протоколы, с которыми работает само приложение: HTTP и HTTPS, FTP для файлов, SMTP для почты, DNS для перевода имени сайта в IP-адрес.
Из чего состоят HTTP-запрос и ответ
Запрос отправляет клиент, ответ возвращает сервер, и устроены оба сообщения одинаково. Сначала идёт стартовая строка, за ней заголовки (headers) со служебными сведениями о сообщении, потом пустая строка и тело. Тело ещё называют полезной нагрузкой (payload), в нём лежат сами данные.
Из названия протокола можно решить, что он передаёт только гипертекст. На деле в теле бывает HTML-страница, картинка, файл, данные в формате JSON или XML, хотя браузер чаще всего получает в ответ HTML.
Ниже запрос браузера к странице каталога и ответ сервера, разобранные по строкам.
GET /catalog HTTP/1.1
Стартовая строка запроса: метод, путь к ресурсу и версия протокола.
Host: shop.example.com
Заголовок с адресом сервера. В HTTP/1.1 он единственный обязательный, а остальные, например Cookie, Accept или Authorization, зависят от запроса.
Пустая строка
Отделяет заголовки от тела. У GET-запроса тела обычно нет, поэтому на пустой строке запрос и заканчивается.
HTTP/1.1 200 OK
Стартовая строка ответа: версия протокола, код состояния и его текстовое пояснение.
Date, Server, Content-Type: text/html
Заголовки ответа: когда ответ отправлен, какой сервер его вернул и в каком формате тело.
<!DOCTYPE html> и дальше
Тело ответа после ещё одной пустой строки, здесь это HTML-страница каталога. У ответов с кодами 204 и 304 тела нет.
Методы HTTP: GET, POST и остальные
Метод стоит первым словом в стартовой строке запроса и говорит серверу, что сделать с ресурсом. Основных методов два, GET и POST. Остальные встречаются реже, но при тестировании API без них не обойтись.
Чем GET отличается от POST, часто спрашивают на собеседовании. GET получает данные, параметры передаёт в адресной строке, и повторять его безопасно. POST отправляет данные в теле запроса, чтобы что-то создать или изменить на сервере, и повторный POST может создать дубль, например второй такой же заказ.
В админке SaaS-сервиса тестировщик отправляет PATCH с новым телефоном пользователя, а затем GET того же профиля: телефон должен смениться, имя и почта остаться прежними. Если после PATCH остальные поля опустели, сервер обработал запрос как PUT и заменил профиль целиком. После DELETE тот же GET должен вернуть 404.
GET
Получить ресурс: страницу, список товаров, профиль. Данные на сервере при этом не меняются.
POST
Отправить данные на сервер: форму регистрации, комментарий, новый заказ.
PUT
Создать ресурс по указанному адресу или целиком заменить существующий.
PATCH
Изменить часть ресурса, например только телефон в профиле.
DELETE
Удалить ресурс с сервера.
HEAD, OPTIONS, CONNECT, TRACE
Служебные методы. HEAD получает только заголовки без тела, OPTIONS показывает, какие методы разрешены, CONNECT открывает туннель через прокси, TRACE возвращает запрос в том виде, в каком он дошёл до сервера.
Коды ответов HTTP: 200, 301, 404, 500 и другие
Код состояния – три цифры в первой строке ответа, по которым видно, как сервер обработал запрос. К коду прилагается короткое пояснение вроде OK или Not Found. По первой цифре коды делятся на пять классов: 1xx информационные, 2xx успешные, 3xx перенаправления, 4xx ошибки на стороне клиента, 5xx ошибки на стороне сервера.
Тестировщику важнее всего успешные коды и ошибки. Помнить все коды наизусть не нужно, их слишком много, и незнакомый код ищут в справочнике. Бывают и собственные коды, которые разработчики завели под функции своего проекта: что они значат, написано в документации проекта или известно разработчику. На собеседовании часто просят назвать все пять классов и привести примеры к каждому.
Пример из формы заказа: тестировщик вводит в поле телефона буквы и смотрит ответ во вкладке Network. Ожидается 400 или 422 с понятным текстом о том, какое поле заполнено неверно. Если сервер вернул 500, неверные данные дошли до кода, который их не ждал, и это баг, даже если на странице появилось вежливое сообщение.
200 OK
Запрос обработан успешно: сервер получил его, разобрал и вернул ответ.
301 Moved Permanently
Ресурс навсегда переехал, и новый адрес сервер передаёт в заголовке Location. Я советую обращать внимание на 301: если по новому адресу со временем ничего не окажется, перенаправление обернётся ошибкой 404.
304 Not Modified
Ресурс не менялся с прошлого запроса, и браузер берёт сохранённую копию из кэша. Так страница грузится быстрее, если кэш работает правильно.
400 Bad Request
Сервер не смог обработать запрос, потому что тот составлен неверно. В баг-репорт копируют весь запрос, чтобы разработчик сразу увидел, что ушло на сервер.
401 Unauthorized
Пользователь не прошёл аутентификацию: не вошёл в систему, ввёл неверный логин или пароль, или срок действия токена истёк.
403 Forbidden
Пользователь известен системе, но прав на это действие у него нет. Если в системе есть роли (пользователь, модератор, администратор), проверяют, что обычный пользователь получает 403 там, где действие разрешено только администратору.
404 Not Found
Ресурса по такому адресу нет: страницу удалили, ссылка устарела или в адресе опечатка. Самая известная ошибка из всех.
500 Internal Server Error
На сервере произошла ошибка, и он не смог ответить на запрос. Я считаю это серьёзным дефектом и советую ставить такому багу высокую серьёзность, вплоть до critical или blocker.
HTTPS и версии HTTP: чем HTTP/2 лучше 1.1
HTTPS – тот же HTTP, только данные между клиентом и сервером шифруются протоколом TLS, и перехватить их по дороге гораздо сложнее. Поэтому сейчас чаще используют HTTPS, и я советую с осторожностью относиться к сайту, который работает без него.
На странице оплаты интернет-магазина тестировщик проверяет, что адрес с http:// перенаправляет на https:// кодом 301 или 308 и что в Network все запросы страницы идут по HTTPS. Скрипт, подключённый по http, браузер на такой странице заблокирует как смешанное содержимое (mixed content), и форма оплаты может перестать работать.
Версия протокола указана и в запросе, и в ответе. Первой версии, 0.9, при появлении номер даже не присвоили: в ней был только метод GET и не было заголовков. В HTTP/1.0 появились заголовки и коды ответов, в HTTP/1.1 соединение стало постоянным, а методов прибавилось, и эта версия надолго стала основной.
HTTP/2 вырос из протокола SPDY компании Google и стал стандартом в 2015 году. В 2022 году вышел HTTP/3, который работает поверх QUIC, транспорта на основе UDP. В моём уроке, записанном в 2020 году, этой версии ещё нет. Отличия HTTP/2 от версии 1.1 часто спрашивают на собеседовании.
Двоичный формат
HTTP/1.1 передаёт сообщения текстом, а HTTP/2 в двоичном виде. Двоичные сообщения короче и быстрее разбираются.
Сжатие заголовков
Одни и те же заголовки повторяются из запроса в запрос. HTTP/2 сжимает их, и по сети уходит меньше данных.
Мультиплексирование
В HTTP/1.1 запросы в одном соединении идут по очереди, поэтому браузер открывает к сайту несколько TCP-соединений, чтобы параллельно грузить HTML, стили и скрипты. HTTP/2 передаёт все запросы и ответы одновременно по одному соединению.
Запросы в DevTools, видеоурок и задания
В конце урока я показываю, где всё это видно в браузере. Инструменты разработчика (DevTools) открываются клавишей F12, нужна вкладка Network. После обновления страницы в ней появляются все запросы, и у каждого видны метод, код ответа и версия протокола в столбцах Method, Status и Protocol. Если какого-то столбца нет, его добавляют правым щелчком по заголовку таблицы. Щелчок по запросу открывает его адрес, заголовки и тело ответа.
Если среди запросов попался 404 или 500, заводят баг в Jira или другой системе учёта дефектов. К баг-репорту прикладывают данные запроса и скриншот, на котором видна вкладка DevTools. Всю сессию можно сохранить в HAR-файл: разработчик откроет его у себя и увидит каждый запрос и ответ.
Это двенадцатый урок курса "Тестировщик с нуля" на YouTube. В бесплатном базовом курсе по тестированию ему соответствует урок "HTTP-протокол", и после теории в нём есть задания. Шпаргалка разбирает запрос и ответ по строкам. В тренажёре DevTools ответ на вопрос нужно найти через инструменты разработчика, а в тренажёре по API ищут ошибки в запросах: неверный метод, испорченные заголовки, пропущенную авторизацию.
Курсы по теме
Вопросы и ответы
Что такое HTTP простыми словами?
Это правила, по которым клиент, например браузер или мобильное приложение, обменивается данными с сервером. Клиент отправляет запрос с методом и адресом ресурса, сервер возвращает ответ с кодом состояния и данными. HTTP работает на прикладном уровне модели TCP/IP.
Из чего состоит HTTP-запрос?
Из стартовой строки с методом, адресом ресурса и версией протокола, заголовков, пустой строки и тела. Тело есть не всегда, GET-запрос обычно отправляют без него. Ответ устроен так же, только в первой строке вместо метода и адреса стоят код состояния и его пояснение.
Чем GET отличается от POST?
GET получает данные, параметры передаёт в адресной строке, и его можно безопасно повторить. POST отправляет данные в теле запроса, чтобы создать или изменить что-то на сервере, и повторный POST может создать дубль, например второй заказ.
Какие бывают коды ответов HTTP?
Пять классов по первой цифре: 1xx информационные, 2xx успешные (200 OK), 3xx перенаправления (301, 304), 4xx ошибки клиента (400, 401, 403, 404) и 5xx ошибки сервера (500). На собеседовании часто просят назвать классы и привести пример к каждому.
Что означает ошибка 404?
Сервер работает, но ресурса по запрошенному адресу нет: страницу удалили, ссылка устарела или в адресе опечатка. Это код класса 4xx, то есть ошибка на стороне клиента, хотя причиной часто бывает битая ссылка на самом сайте.
Чем отличаются коды 401 и 403?
401 означает, что пользователь не прошёл аутентификацию: не вошёл в систему или ввёл неверные данные. 403 означает, что пользователь известен, но прав на действие у него нет, например обычный пользователь пытается открыть раздел администратора.
Чем TCP отличается от UDP?
TCP гарантирует доставку: получатель подтверждает приём, а потерянные данные отправляются заново. UDP передаёт данные потоком без подтверждений, поэтому быстрее, но часть данных может потеряться. TCP подходит для почты и передачи файлов, UDP выбирают онлайн-игры и видеосвязь.
Посмотреть программы курсов
Программа каждого курса открыта целиком: видны все модули, уроки и число шагов.
