unittest в приложении flask_restful не работает - застрял на работающем сервере flask

Мои инструменты: Python 3.5.0, flask 1.0.2, mac osx

Моя проблема: у меня есть очень простое приложение RESTful с двумя работающими конечными точками. Я написал два очень простых модульных теста с помощью unittest, и они не выполняются по причине, в которой я сейчас не уверен. Тесты завершатся успешно, если я сделаю следующее:

  1. Если я запускаю сервер отдельно, скажем, на http://127.0.0.1:8015/ (а не setUp() что угодно)
  2. И запустите тесты так, чтобы они вызывали запросы. 3)
  3. тесты проходят нормально и проходят

Тесты просто зависают, если я запускаю тесты с определением setUp(self) ниже:

Serving Flask app "testing" (lazy loading)
Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
Debug mode: off
Running on http://127.0.0.1:8015/ (Press CTRL+C to quit)

И вот соответствующий код

def setUp(self):
    self.app = Flask("testing")
    self.app.testing = True 
    self.client = self.app.test_client()
    self.EmployeeId = 4

    with self.app.app_context():
        db_connect = create_engine('sqlite:///some.db')       
        self.api = Api(self.app)  
        self.api.add_resource(server.Car, '/car/<employee_id>') # Route_4
        app.run(port=8015, debug=False)

def test_api_can_get_employee_by_id(self):
    res = requests.get(url = 'http://127.0.0.1:8015/car/{}'.format(self.EmployeeId))
    data = res.json()
    self.assertEqual(res.status_code, 200)
    self.assertIn('mazda', data["data"][0]['make_model'])

Я посмотрел в Интернете и не нашел ресурса, который действительно охватывает мой вопрос. Настройка сервера работает во время тестирования, но модульные тесты не выполняются. Как бы вы порекомендовали решить эту проблему? Я открыт для всех предложений, включая изменение подхода. Благодарю вас!


person ghbcode    schedule 16.08.2018    source источник
comment
Примечание: это не называется модульным тестированием. Это больше интеграционное тестирование. Наиболее близкий вид тестов см. на flask.pocoo.org/docs/0.12/testing . Если сильно настаиваете (например, нужно запускать тесты Selenium в браузере) — посмотрите, как запустить сервер в другом потоке stackoverflow.com/questions/31264826/   -  person Roman Susi    schedule 16.08.2018


Ответы (1)


Для тех из вас, кто споткнулся здесь после того, как погуглил «Модульные тесты застряли при работе с Flask»:

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

Например, это застрянет:

from flask import Flask
app = Flask(__name__)


@app.route('/')
def hello():
    return "Hello World!"

app.run()

Вместо этого вам нужно будет запустить сервер Flask, только если ваш модуль является основной программой:

from flask import Flask
app = Flask(__name__)


@app.route('/')
def hello():
    return "Hello World!"

if __name__ == '__main__':
    app.run()

Дополнительная информация о блоке name == 'main'" здесь.

Что касается исходного вопроса, этот ответ не решает его. Чтобы сделать что-то подобное, вам нужно запустить сервер Flask, но неблокирующим образом, например, в другом потоке или процессе. Есть много способов сделать это, и без какой-либо дополнительной информации вопрос слишком расплывчатый, чтобы ответить на него как есть.

person Alexandre    schedule 10.12.2019
comment
Спасибо, у меня была точно такая же проблема! Как что-то маленькое может испортить весь день, хахаха - person Kjell; 06.04.2020