0

Flask-Script用来在我的应用程序上运行测试,我的manage.py文件的重要部分如下所示:

import unittest

from flask.ext.script import Manager
from project import app

manager = Manager(app)

@manager.command
def test():
    """Run unit tests."""
    app.config.from_object('config.Test')
    tests = unittest.TestLoader().discover('tests', pattern='*.py')
    unittest.TextTestRunner(verbosity=1).run(tests)

但是当我运行python manage.py test它时,它会尝试初始化整个应用程序,例如,如果我没有设置我的环境变量,它会KeyError从我的项目__init__.py文件中抛出一个,如下所示:

File "project/__init__.py", line 19, in <module> app.config.from_object(os.environ['PROJECT_SETTINGS'])

或者,如果我设置了环境变量,则会收到有关缺少数据库表的错误。

当然,只有在测试运行并且在test()函数中设置了配置变量后,应用程序才应该初始化。

4

1 回答 1

1

您需要做一些事情才能使其正常工作。

  1. 设置缺少的环境变量(就像你已经说过的那样)。

  2. 创建一个测试数据库供您的测试使用,并让您的测试包括一个setup和一个teardown分别创建和删除表的函数。

为了绕过第一步,我建议使用Flask 应用程序工厂模式,它允许您将应用程序创建封装在一个函数中。这将允许您传递在测试环境下运行应用程序所需的任何变量等,即

def create_application(is_test=False):
    app = Flask(__name__)
    if not is_test:
       setup_app_not_for_test(app)
    else:
       setup_test_for_app(app)

    return app

关于第 2 步,如果您使用 pytest 或 nose 或任何使用夹具的测试框架,您可以轻松添加setupteardown添加/删除数据库表的功​​能。此外,如果您使用像 sqlalchemy 这样的 ORM,您可以非常轻松地在内存数据库中创建SQLite来运行您的测试。

# create db instance
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite://:memory:"

# create all your tables
db.create_all()

# drop all your tables
db.drop_all()
于 2016-02-08T21:38:04.987 回答