Используйте VCRPY и Robotframework, чтобы это произошло

Тестирование API необходимо для современной архитектуры микросервисов, но воспроизведение выполнения тестов становится все более сложной задачей по мере усложнения API.
В этой статье я представлю потрясающую библиотеку Python, которая позволяет легко записывать ваши HTTP-запросы. .

Представляем VCRPY

VCRPY использует кассеты как метафору записанного HTTP-потока определенного блока кода.

Идея состоит в том, чтобы использовать context-manager или decorator для конкретного блока кода, который мы хотим записать, а библиотека в свою очередь создает «кассету», которая представляет собой сериализованный файл (по умолчанию это файл YAML), содержащий весь HTTP-трафик. .

Во-первых, нам нужно установить наши зависимости из pip:

pip install vcrpy==4.2.0 requests==2.28.1

Теперь давайте воспользуемся библиотекой vcrpy в нашем коде. Вот пример:

В этом простом примере выше мы использовали функцию use_cassette из модуля VCR. Он создает менеджер контекста, который сгенерирует файл my-cassette.yaml.

В этом контексте мы отправляем два HTTP-запроса на сайт postman-echo, используя библиотеку requests, после каждого запроса мы утверждаем, что атрибут foo1 равен bar1.

После запуска кода мы можем найти во вновь созданном файле YAML следующее:

Это дает нам все детали HTTP-трафика в нашем тестовом сценарии!
Когда мы хотим воспроизвести выполнение теста, мы можем легко это сделать.

Но это еще не все!

После того, как вы создали кассету, каждый раз, когда вы перезапускаете тест, vcrpy будет перехватывать HTTP-трафик и заменять его своим макетом.

Преимущества vcr.py включают в себя:

  1. Легко создавать фиктивные объекты для модульных тестов
  2. Легко записываемый HTTP-трафик, очень полезный, когда ваши тестовые сценарии используют случайные данные.
  3. Легче воспроизвести ненадежные ошибки

Есть даже больше!

VCRPY также легко расширяется.

Например, вы можете создать свой собственный сериализатор запросов:

В этом примере наш сериализатор совершенно бесполезен. Он выводит данные на стандартный вывод, а затем возвращает «привет», который будет добавлен на кассету.

Результатом выполнения этого кода будет:

{'interactions': [{'request': {'body': None,
                               'headers': {'Accept': ['*/*'],
                                           'Accept-Encoding': ['gzip, deflate'],
                                           'Connection': ['keep-alive'],
                                           'User-Agent': ['python-requests/2.28.1']},
                               'method': 'GET',
                               'uri': 'https://postman-echo.com/get?foo1=bar2&foo2=bar2&foo3=bar3'},
                   'response': {'body': {'string': '{"args":{"foo1":"bar2","foo2":"bar2","foo3":"bar3"},"headers":{"x-forwarded-proto":"https","x-forwarded-port":"443","host":"postman-echo.com","x-amzn-trace-id":"Root=1-630600d8-7cd8544e36022682693d82e7","user-agent":"python-requests/2.28.1","accept-encoding":"gzip, '
                                                   'deflate","accept":"*/*"},"url":"https://postman-echo.com/get?foo1=bar2&foo2=bar2&foo3=bar3"}'},    
                                'headers': {'Connection': ['keep-alive'],
                                            'Content-Length': ['358'],
                                            'Content-Type': ['application/json; '
                                                             'charset=utf-8'],
                                            'Date': ['Wed, 24 Aug 2022 '
                                                     '10:43:36 GMT'],
                                            'ETag': ['W/"166-/OQmSZQmpVBffJEwyD65r935+QE"'],
                                            'Vary': ['Accept-Encoding'],
                                            'set-cookie': ['sails.sid=s%3AEBHLjc0aS_0cpuyhvKBS_GSU0eRyYgA7.qIcCjTOp8gHXNvykDiUhOOmsKgp848t4Hjfcacue0OI; '
                                                           'Path=/; HttpOnly']},
                                'status': {'code': 200, 'message': 'OK'}}}],
 'version': 1}

и файл test.ridicule будет выглядеть так:

Бонусный раздел: интеграция с Robotframework

Во-первых, давайте установим robotframework и robotframework-requests из pip:

pip install robotframework==5.0.1 robotframework-requests==0.9.3 

Теперь давайте создадим тестовый файл робота, как показано ниже:

Теперь мы можем использовать интерфейс слушателя robotframework для интеграции нашего теста с видеомагнитофоном. Вот код:

Таким образом, наш слушатель сохраняет имя текущего набора тестов и тестового примера, и как только начнется погоня за тестом, он откроет диспетчер контекста видеомагнитофона и выйдет из диспетчера контекста после завершения теста.

Запустим тест следующей командой:

robot --listener [path/to/listener/file].VcrListener -P . tests

Вот результат теста:

И заглянув в каталог vcr_cassettes, мы можем найти соответствующую кассету. Вот как это выглядит:

Спасибо, что прочитали!

Следите за новостями.