Создание собственной команды test для запуска набора тестов для приложения Flask
Мы расширяем Flask-cli с помощью некоторых пользовательских команд. Команда test
является одним из них:
# run.py: specified by FLASK_APP
# This is the Flask application object
app = create_app(os.getenv('FLASK_ENV') or 'default')
@app.cli.command()
def test():
"""Run the unit tests."""
tests = unittest.TestLoader().discover('tests')
test_runner = unittest.TextTestRunner()
test_runner.run(tests)
Однако типичный тест (с использованием встроенного в Python модуля unittest) выглядит следующим образом и основан на стиле, описанном здесь.
# some-tests.py: unittest-based test case.
class SomeTestCase(unittest.TestCase):
def setUp(self):
self.app = create_app('testing')
self.app_context = self.app.app_context()
self.app_context.push()
def tearDown(self):
self.app_context.pop()
def test_load(self):
pass
Я явно использую анти-шаблон: я инициализировал объект фляги по умолчанию (development
), потому что мне это нужно для @app.cli.command()
декоратор, который все происходит в run.py
, Однако, как только я запускаю тестовую функцию setUp в some-tests.py
Я как-то должен получить объект Flask, используя testing
например, путем воссоздания приложения Flask с помощью testing
Конфигурация как то, что происходит сейчас.
Я хотел бы иметь указатели о том, как можно реализовать flask-cli
тестовая команда, в которой только одна Flask
создается объект, который повторно используется в различных тестовых примерах без необходимости явной установки среды в testing
прежде чем я бегу flask test
в командной строке.
0 ответов
Я не уверен, что этот ответ подойдет вашим требованиям, но я бы попытался решить эту проблему. К сожалению, если вы хотите использовать интерфейс CLI по умолчанию во Flask, вам нужно позвонить create_app
просто позвонить flask test
команда. Что вы можете сделать, это попробовать использовать pytest
, Это позволяет создавать приборы, которые можно использовать в нескольких тестовых случаях. Например, в вашем tests
пакет создать файл с именем conftest.py
и объявить некоторые приборы по умолчанию, как это:
@pytest.fixture
def app():
return create_app('testing')
@pytest.fixture
def client(app):
return app.test_client()
@pytest.fixture
def database(app):
_db.app = app
with app.app_context():
_db.create_all()
yield _db
_db.session.close()
_db.drop_all()
Затем в вашем файле тестового примера (например, test_login.py) вы можете использовать эти приборы следующим образом:
# Notice argument names are the same as name of our fixtures
# You don't need to import fixtures to this file - pytest will
# automatically recognize fixtures for you
def test_registration(app, client):
response = client.post(
'/api/auth/login',
json={
'username': 'user1',
'password': '$dwq3&jNYGu'
})
assert response.status_code == 200
json_data = response.get_json()
assert json_data['access_token']
assert json_data['refresh_token']
Самое лучшее в этом подходе - вам не нужно создавать setUp
а также tearDown
методы. Тогда вы можете создать test
команда cli для вашего приложения:
import pytest
@app.cli.command()
def test():
'''
Run tests.
'''
pytest.main(['--rootdir', './tests'])
И называть это так flask test
,