Чтобы далеко не уходить от уже знакомой темы, разберём, как можно получить заголовки (headers) и тело (body) ответа используя декоратор, с помощью которого можно сохранить все ответы в отдельный файл...
Создадим в нашем проекте две папки: First - для файла API.py с GET-запросом к сайту и папку tests для файла test_decorator.py с декорируемой тест-функцией. Хорошей практикой считается прописывать декораторы в специальном файле conftest.py, который нужно создать в папке tests. Также в папке First создадим файл Settings.py, в который нужно добавить переменные valid_email и valid_password, содержащие валидные email и пароль для входа на сайт.
В файле API.py пропишем функцию на отправку GET-запроса к сайту. Предварительно зарегистрируйтесь на нём по ссылке.
import requests
import json
def get_api_key(email: str, password: str) -> json:
url = "https://petfriends.skillfactory.ru/"
# Укажем заголовки запроса для получения ключа пользователя:
headers = {'email': email, 'password': password}
# Отправляем GET запрос:
response = requests.get(url + 'api/key', headers=headers)
return response
В файле test_decorator.py создадим следующую тест-функцию, возвращающей результат запроса и проверяющей полученный ответ:
from tests.conftest import add_headers_to_file
from First.Settings import valid_email, valid_password
from First.API import get_api_key
@add_headers_to_file # заранее укажем наш декоратор (см. ниже)
def test_get_api(email=valid_email, password=valid_password):
# Отправляем запрос:
res = get_api_key(email, password)
# И выводим полученный ответ в консоль:
status = res.status_code
result = res.text
print('\nStatus:', status)
print('Response:', result)
# Сверяем полученный ответ с нашими ожиданиями:
assert status == 200
assert 'key' in result
return res # возвращаем ответ запроса для использования его в декораторе
def main():
test_get_api()
if __name__ == '__main__':
main()
Теперь создадим функцию-декоратор в файле coftest.py, назовём его add_headers_to_file:
import json
def add_headers_to_file(func): # декоратор
def wrapper(*args, **kwargs): # функция обёртка
# Присвоим декорированной функции переменную:
res = func(*args, **kwargs)
# Следующим переменным назначаем получение ответов запроса:
content = res.headers # обязательные заголовки
optional = res.request.headers # опциональные заголовки
body = res.request.body # тело запроса
cookie = res.cookies # куки
url = f"Url: '{res.request.url}'" # сайт
name = func.__name__ # имя функции
status = res.status_code # статус ответа
try:
result = res.json() # тело ответа
except json.decoder.JSONDecodeError:
result = res.text # тело ответа
# Записываем полученные ответы в файл Response_headers:
with open("Response_headers.json", 'w', encoding='utf8') as my_file:
my_file.write(f'Function_name: {name}\nStatus: {status}\nContent: \
{content}\nOptional: {optional}\nRequest_Body: {body}\nCookies: \
{cookie}\n{url}\nResponse_Body:\n')
json.dump(result, my_file, ensure_ascii=False, indent=4)
return res
return wrapper
После запуска тест-функции test_decorator.py через Run, получим статус Код 200 и созданный в проекте файл Response_headers.json с ответами на запрос.
