Создание собственной команды test для запуска набора тестов для приложения Flask - PullRequest
0 голосов
/ 06 сентября 2018

Мы расширяем 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 в командной строке.

1 Ответ

0 голосов
/ 18 февраля 2019

Я не уверен, что этот ответ подойдет вашим требованиям, но я бы попытался решить эту проблему. К сожалению, если вы хотите использовать интерфейс 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.

...