использовать фиктивный сервер в тестировании приложения фляги с помощью pytest - PullRequest
0 голосов
/ 05 января 2019

ТЛ; др Я ищу наилучшую практику для тестирования приложения-колбы, которое использует внешние 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

1 Ответ

0 голосов
/ 05 января 2019

Благодаря jonrsharpe Теперь я знаю, что это можно сделать с помощью библиотеки response . Теперь, если мы хотим смоделировать API в приборе, это можно сделать следующим образом:

в conftest.py

import response
from pytest import fixture

@fixture
def client():
    # add response
    responses.add(responses.GET,
        'http://mock.api/v',
        json={'key': 'value'},
        status=200
    )
    # do fixture stuff -> here it is yielding app test client
    app.config['TESTING'] = True
    client = app.test_client() 

    yield client

in test_module.py

import response

@response.activate
def test_can_connect(client):
    result = client.get('/test')
    assert result.status_code == 200

и app.py

@app.route('/test')
def test():
    res = requests.get('http://mock.api/v')
    # blah blah

Комментарий в responses документации предлагается добавить ответ в функцию теста. Но так как я хотел добавить это в приспособление, я так и сделал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...