Как имитировать конечные точки тестовой колбы, которые в основном взаимодействуют с сторонними API?

#python #mocking #pytest

#python #издевательство #pytest

Вопрос:

Мы разработали различные сервисы с использованием Flask, и все они действительно выступают в качестве посредника между конечным пользователем и различными сторонними API (но без баз данных). Я разработал тесты с использованием pytest с помощью test_client и т. Д., И Это работает хорошо. Но каждый раз, когда маршрут / конечная точка вызывается одним из тестов, он фактически взаимодействует с сторонними API.

Каков правильный способ создания пробных тестов в этой ситуации? Мне интересно, должен ли я просто разработать точную копию конечных точек, но имитировать строки, в которых происходят запросы к сторонним API. Это кажется большой работой, но если бы я просто возвращал некоторый ожидаемый JSON из заданной конечной точки, я не думаю, что код будет протестирован очень хорошо.

Ответ №1:

Для сценариев, в которых вам нужно вызвать сторонний API, вы можете рассмотреть возможность использования видеомагнитофона Pytest.

Это плагин pytest, который позволяет записывать все http-запросы, сделанные внутри метода тестирования или функции, используя декоратор следующим образом.

 @pytest.mark.vcr()
def my_test():
   """
   Example of a function that test a client doing http requests
   """
   some_client = SomeClient()
   some_client.authenticate()
   resource = some_client.get_resource("foo")
   assert resource is not None
 

При первом запуске теста вызовы записываются в файл, называемый «кассетой». Затем последующие запуски этого теста будут использовать эту кассету как своего рода макет вместо отправки реальных HTTP-вызовов.

Это также работает, если вы тестируете представления приложений flask, в которых выполняются вызовы https.

Будьте осторожны, поскольку это решение подразумевает, что если вы измените тестируемый код таким образом, чтобы добавить http-вызовы, тест будет прерван, поскольку новые вызовы не будут существовать в кассете. Вам придется либо удалить кассету и записать ее снова, либо запустить свой тест, --vcr-record=new_episodes чтобы добавить новые вызовы в существующую кассету.

Комментарии:

1. о, это здорово. После просмотра документов это будет большой помощью.