创建自定义的“测试”命令以为Flask应用程序运行测试套件

时间:2018-09-06 13:38:23

标签: python-3.x testing flask flask-cli

我们通过一些自定义命令扩展了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模块)看起来像 这是基于here描述的样式。

# 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)配置初始化了一个flask对象,因为我需要@app.cli.command()装饰器来使用它,这一切都发生在{{1}中}。但是,一旦我在run.py中运行测试setUp函数,就必须以某种方式利用some-tests.py配置来获取Flask对象,例如通过像现在这样用testing配置重新创建Flask应用。

我想指出如何实现一个testing测试命令,其中仅创建一个flask-cli对象,该对象可以在各种测试用例中重用,而无需明确地在命令行上运行Flask之前,将环境设置为testing

1 个答案:

答案 0 :(得分:0)

我不确定该答案是否适合您的要求,但这就是我将尝试解决此问题的方式。不幸的是,如果您想在Flask中使用默认的CLI界面,则只需要调用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']

这种方法的最好之处在于,您无需创建setUptearDown方法。然后,您可以为您的应用创建test cli命令:

import pytest

@app.cli.command()
def test():
    '''
    Run tests.
    '''
    pytest.main(['--rootdir', './tests'])

并像这样flask test这样称呼它。