ТЛ; др
Я ищу наилучшую практику для тестирования приложения-колбы, которое использует внешние API-интерфейсы по своим маршрутам, и, вероятно, именно здесь мне нужно смоделировать внешние API-интерфейсы с использованием фиктивных серверов на этапе тестирования.
Хорошо, все, что я искал pytest-mock
и подобные пакеты, - это то, что я могу смоделировать функцию и подготовить результаты для проверочных утверждений. Но, к сожалению, я не могу найти наилучшего объяснения моей ситуации:
У меня есть приложение фляги, по некоторым маршрутам которого я использую внешние API, и я хочу использовать фиктивные серверы, заменяя эти реальные URL внешних API. Я пришел к двум, по-видимому, справедливым решениям:
Использование тестовых URL при тестировании
Что я получил до сих пор, так это то, что я могу динамически устанавливать различные URL-адреса с помощью app.config
, чтобы в моем conftest.py
я мог вызывать с помощью тестовых URL-адресов, и в действительности мое приложение будет запускаться по основным URL-адресам. Теперь мой вопрос заключается в том, как я могу запустить фиктивный сервер автоматически на этапе установки pytest fixture
, чтобы занять тестовые URL-адреса портов локального хоста. Я сказал автоматически, потому что сам могу наивно запускать ручное макетное приложение в фоновом режиме, что глупо и бесполезно для целей автоматического тестирования
Использование фиктивной функции вместо отправки запроса на основной URL
Я понял, что могу настроить mocker, который представляет собой функцию, возвращающую желаемое значение, и использовать ее вместе с вызовом моего приложения для тестирования. но дело в том, что я хочу использовать макет внутри моего приложения, не сравнивая возвращаемое значение с фиктивным значением
Так где я и что мне делать?!
Вот пример:
Мое приложение для колб:
app = Flask(__name__)
@app.route('/test')
def test():
value = request.args.get('dummy_val')
# using external APIs
# This is where I need mock server
output = requests.get(
'http://external.api/some/url',
params={'val':value}
)
return output*2
мой тестовый файл:
def test_can_double_value(test_client):
result = test_client('/test', query_string={'dummy_val':'foo'})
# test if status code == 200
# test if string equals to something
# blah blah blah