#flask #pytest
#flask #pytest
Вопрос:
Я новичок в flask, и я настроил простой пример flask и два теста с использованием pytest (см. Здесь ). Когда я запускаю только один тест, он работает, но если я запускаю оба теста, он не работает.
Кто-нибудь знает почему? Я думаю, что мне не хватает здесь некоторых основ работы flask.
структура кода:
app/__init__.py
from flask import Flask
def create_app():
app = Flask(__name__)
with app.app_context():
from app import views
return app
app/views.py
from flask import current_app as app
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
def hello():
return 'Hello World!'
tests/conftest.py
import pytest
from app import create_app
@pytest.fixture
def client():
app = create_app()
yield app.test_client()
tests/test_app.py
from app import create_app
def test_index(client):
response = client.get("/")
assert response.data == b"Index Page"
def test_hello(client):
response = client.get("/hello")
assert response.data == b"Hello World!"
Ответ №1:
Проблема заключается в вашей регистрации маршрутов app/views.py
при их current_app as app
регистрации. Я не уверен, как вы могли бы применить шаблон application factory без использования чертежей, поскольку описание шаблона в документации подразумевает, что они обязательны для шаблона:
Если вы уже используете пакеты и схемы элементов для своего приложения […]
Поэтому я скорректировал ваш код, чтобы вместо него использовать схему элементов:
app/main/__init__.py
:
from flask import Blueprint
bp = Blueprint('main', __name__)
from app.main import views
app/views.py
-> app/main/views.py
:
from app.main import bp
@bp.route('/')
def index():
return 'Index Page'
@bp.route('/hello')
def hello():
return 'Hello World!'
app/__init__.py
:
from flask import Flask
def create_app():
app = Flask(__name__)
# register routes with app instead of current_app:
from app.main import bp as main_bp
app.register_blueprint(main_bp)
return app
Тогда ваши тесты работают так, как задумано:
$ python -m pytest tests
============================== test session starts ==============================
platform darwin -- Python 3.6.5, pytest-6.1.0, py-1.9.0, pluggy-0.13.1
rootdir: /Users/oschlueter/github/simple-flask-example-with-pytest
collected 2 items
tests/test_app.py .. [100%]
=============================== 2 passed in 0.02s ===============================
Комментарии:
1. Для меня мне не нужно было перемещать папки или изменять свой код, но я просто использовал ваше предложение
python -m pytest tests
вместоpytest
, и оно проходит тесты.