22просмотров
15 мая 2024 г.
questionScore: 24
Как взглянуть на композицию функций по другому? Представим, у нас есть http запрос, который с сервера возвращает JSON и нам надо этот json проверить в рамках тестирования и получить конкретные данные из него. Предположим, что конвейер будет такой: request | expect | get_data Такую конструкцию можно изобразить с помощью декоратора Python: - Внизу будет функция show_data_from_server_by_id, которая будет принимать объект HTTP клиента и идентификатор объекта и возращать JSON.
- Следующий декоратор expect принимает в качестве аргумента представление JSON, которое должно прийти с сервера, т.к. часть данных динамическая и может от запроса к запросу меняться, то именованный аргумент patched_paths принимает список JsonPath, которые описывают какие пути будут меняться. После исполнения функцию show_data_from_server_by_id проверяет JSON на наличие равенство с ожидаемым JSON и если есть проблемы сообщает о них. Возвращает проверяемый JSON дальше.
- И в самом верху будет декоратор get_data, который принимает JsonPath, который описывает какие данные из JSON нужно достать и вернуть. После исполняет функцию обёрнутую expect и достаёт нужные данные и уже возвращает их. Сам код: @get_data("data.object")
@expect( { "data": { "object": { "id": ..., "name": "Test name", "version": 0, "used_in_tasks": [], "subOject": { "subname": "Test subname", "body": "Test body", "useSomeFeature": False, "someFeature": None, } } } }, patched_paths=[ "data.object.id", "data.object.subOject.subname", ]
)
def show_data_from_server_by_id(client, id_): return client.make_get_request( "/api/show-data-by-id", params={ "id": id_, }, )