Разделы портала

Онлайн-тренинги

.
Прелести Pytest: запросы
14.07.2020 00:00

Автор: Джош Грант (Josh Grant)
Оригинал статьи
Перевод: Ольга Алифанова

В своей последней статье о прелестях Pytest я бы хотел немного изменить правила и поговорить о достоинствах такой библиотеки Python, как requests. Requests – несомненно, один из моих любимых программных продуктов. Как и говорится на его домашней страницы, Requests – это HTTP, сделанное для людей.

Давайте рассмотрим ее на примере полезного приложения Restful-Booker, сделанного Марком Уинтерингэмом.

import requests
r = requests.get('https://restful-booker.herokuapp.com/booking')
print(r.status_code) # should be 200
print(r.text) # response body, should look like [{"bookingid":3},{"bookingid":1},...
print(r.json()) # same as r.text but in valid JSON

Straightforward and easy. No malarkey here, just HTTP requests and responses.

Requests хороша своим синтаксисом, а также тем, что это полноформатная HTTP-библиотека. Неважно, нужен ли вам одноразоывй простой GET или сложный запрос, требующий манипуляции заголовками и авторизацией вместе с кастомным телом запроса – requests может все.

Дабы увязать это с Pytest и тест-автоматизацией – я часто слышал от команд и разработчиков два вопроса:

  1. "Как построить тест-фреймворк API?", и
  2. "Как использовать API в автотестах браузера для большей стабильности?"

Один (хороший) ответ на оба этих вопроса – это "постройте свой собственный фреймворк с Pytest и Requests".

Приведу пример тестов API – типичным случаем будет проверка кода статуса ответа. Это довольно легко сделать с помощью requests. Вот так будут выглядеть типовые GET-тесты:

One (good) answer to both is “build your own with Pytest and Requests”.

import pytest
import requests
def test_app_is_available():
response = requests.get("https://restful-booker.herokuapp.com/booking")
assert response.ok
def test_page_unavailable():
response = requests.get("https://restful-booker.herokuapp.com/not_there.html")
assert response.status_code == 404

Эти тесты убеждаются, что если тестируемое веб-приложение работает, то оно возвращает статус-коды уровня 200 или 300, а если страницы не существует – то корректный код 404 (для забавной справки по HTTP-статусам и их значениям см. http.cat.) В каждом случае метод get() возвращает ответ, который можно использовать различным образом. Первый тест использует свойство requests Response.ok. Второй тест проверяет код ответа 404. Это элементарные тесты, но они дают представление о ключевых типах тестов API – создание запроса и анализ ответа. Requests и Pytest – отличная комбинация для того, чтобы начать с простого и надстраивать тесты по мере необходимости.

Другая отличная особенность requests для автоматизированного тестирования в конструкции Requests Session. Она позволяет управлять серией HTTP-запросов, сохраняя такие аспекты состояния сессии, как авторизация, куки, и так далее.

Здесь requests может помочь с созданием API-утилит для браузерного тестирования. Вот пример теста, использующего API-запрос напрямую, чтобы авторизоваться в веб-приложении, не используя пользовательский интерфейс:

import pytest
import requests
from selenium import webdriver
@pytest.fixture
def logged_in_browser(request):
api_session = requests.session.post("https://my-web-app.net/login", auth=('myuser', 'mypass'))
cookies = api_session.cookies
cookie = cookies['needed_cookie_from_authentication']
driver = webdriver.Firefox()
driver.add_cookie(cookie)
yield driver
driver.quit()
api.session.close()
def create_entry_test(logged_in_browser):
driver.get("https://my-web-app.net/welcome_page.html") # fast forward to the desired page
# продолжение теста

Просто и чисто! Возможно даже отделить сессии API и браузера в разные фикстуры, разделяя действия с API и действия с браузером в наборе автотество.

Я успешно применял Requests Session именно для этого. Для примера фреймворка API-тестирования на основе requests обратите внимание на svp.

В заключение скажу, что библиотека requests чудесна. Она практически достаточный повод, чтобы тестировщики и инженеры в тестировании учили Python.

Обсудить в форуме