Как сделать почтовый запрос на сервер flask, работающий в отдельном потоке - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь написать тест с pytest, который проверяет возврат заданного почтового запроса. Я хочу изолировать сервер flask и тест в одной функции. Вот мой код:

import threading
import requests
from flask import Flask
from flask_restful import Api
from . import UserAuthentication

def test_user_authentication():
    app = Flask(__name__)
    api = Api(app)

    api.add_resource(UserAuthentication, "/<string:stage>/api/user/authentication")

    def app_thread_function():
        app.run(port=5000, host="0.0.0.0")

    app_thread = threading.Thread(target=app_thread_function)
    app_thread.start()

    data = {"username": "xxxxxxx.xxxxxxx@xxxxxxx.com.br", "password": "xxxxxxxxxxxxxx"}
    request = requests.post(url = "http://localhost:5000/dev/api/user/authentication", data = data) 
    print("request")
    print(request)

Когда я запускаю pytest, я получаю эту ошибку:

urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=5000): Max retries exceeded with url: /dev/api/user/authentication (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f3a7eeb7280>: Failed to establish a new connection: [Errno 111] Connection refused'))

../web-python/lib/python3.8/site-packages/urllib3/util/retry.py:439: MaxRetryError

На порту 5000 ничего не работает, почему я не могу позвонить на сервер и запустить это заодно?

1 Ответ

1 голос
/ 06 августа 2020

Чтобы изолировать приложение для каждой тестовой функции, вы должны использовать @pytest.fixture декоратор.

Прежде всего, вы должны прочитать Testing Flask Applications from the official docs .

Начните определять, новое приспособление для вашего приложения в вашем conftest.py , с областью действия (по умолчанию), другими областями .

from myapp import create_app

@pytest.fixture
def app():
    app = create_app()
    return app

Затем внутри тестовой функции вы можете вызвать фикстуру приложения.

def test_my_function(app):
    # Here you have a fresh app object.
    pass

Здесь начинается другая часть. Вам нужен test_client , чтобы делать запросы. Обратите внимание, что если вы тестируете утверждения или исключения в коде приложения, вы должны установить app.testing = True, чтобы исключения распространялись на тестовый клиент.

Более простой способ для этого нужно использовать pytest- flask, который создаст вам другие необходимые вам приспособления, такие как client , config и другие ...

Пример с pytest- flask:

def test_my_function(client):
    rv = client.get('/')
    assert b'No entries here so far' in rv.data

Если вы посмотрите на pytest -flask / fixture.py на github , вы можете видеть, что клиентское приспособление просто зависит от приспособления приложения и возвращает из него text_client.

Вы все равно можете попробовать это сделать это с резьбой, но этот способ намного проще. Вам не нужно беспокоиться о том, как завершить цепочку. У вас может быть другая проблема с режимом отладки , который запускает основной поток для управления реальным приложением.

В конце концов, для каждой тестовой функции, которая вызывает клиентское приспособление, у вас будет новое приложение fre sh, и это именно то, что вам нужно.

...