一. 应用脚本(主脚本)
应用脚本(主脚本)在顶级目录中的flasky.py模块中定义:
import os
from flask_migrate import Migrate
from app import create_app, db
from app.models import User, Role
app = create_app(os.environ.get('FLASK_CONFIG') or 'default')
migrate = Migrate(app, db)
@app.shell_context_processor
def make_shell_context():
return dict(db=db, User=User, Role=Role)
# 启动单元测试的命令
@app.cli.command()
def test():
"""run the unit test"""
import unittest
tests = unittest.TestLoader().discover('tests')
unittest.TextTestRunner(verbosity=2).run(tests)
这个脚本先创建一个应用实例,通过定义环境变量FLASK_CONFIG或使用默认值,来决定使用不同的环境。FLASK_CONFIG配置选项及对应关系如下:
然后初始化Flask-Migrate和为Python shell定义的上下文。flasky.py最后部分是启动单元测试的命令。在本文的第二部分介绍。最后,请配置FLASK_APP环境变量为flasky.py,FLASK_DEBUG可以设置为1,以启用FLASK的调试模式。
二. 单元测试
顶级目录中的tests包,编写本应用的单元测试,tests.py内容如下:
import unittest
from flask import current_app
from app import create_app
from app import db
class BasicsTestCase(unittest.TestCase):
def setUp(self):
self.app = create_app('testing')
self.app_context = self.app.app_context()
self.app_context.push()
db.create_all()
def tearDown(self):
db.session.remove()
db.drop_all()
self.app_context.pop()
def test_app_exists(self):
self.assertFalse(self.app is None)
def test_app_is_testing(self):
self.assertTrue(current_app.config['TESTING'])
以上测试用例使用Python标准库中的unittest包编写。测试用例的setUp()和tearDown方法分别在各测试之前和之后运行。名称以test_开头的方法都作为测试运行。
setUp尝试创建一个测试环境,尽量与正常运行应用所需的环境一致。首先,使用测试配置应用,然后激活上下文。以确保在应用中可以使用current_app,就像普通请求一样。然后使用Flask-SQLAlchemy的create_all()创建一个全新的数据库,供测试使用。最后,数据库和应用上下文在tearDown()方法中删除。
第一个测试,确保应用存在。第二个测试确保应用在测试配置中运行。若想把tests目录作为包来使用,需要添加tests/init.py模块,不过这个文件可以为空,因为unittest会自动扫描所有模块,找出测试。
为了运行单元测试,可以在flasky.py脚本的末尾添加一个自定义命令:
# 启动单元测试的命令
@app.cli.command()
def test():
"""run the unit test"""
import unittest
tests = unittest.TestLoader().discover('tests')
unittest.TextTestRunner(verbosity=2).run(tests)
app.cli.command()装饰器用于添加自定义命令,被装饰的函数名就是命令名。 最后,通过flask test运行单元测试case:
三. 需求文件
应用中最好有个requirements.txt文件,用于记录所有依赖包及其精确的版本号,这个文件可由pip自动生成,命令如下:
pip freeze >requirements.txt
安装或升级第三方包时,最好也更新这个文件,需求文件内容如下:
如果想创建这个虚拟环境的完整副本,请先创建一个虚拟环境,然后运行如下命令:
pip install -r requirements.txt
四. 创建数据库&运行应用
下面以开发环境为例,创建数据库:
1. 创建迁移仓库:
运行flask db init 后顶级目录中创建了一个名为migrations的目录,所有迁移脚本都存放在这里。现在migrations/versions目录还为空。
2. 创建迁移脚本
flask db migrate创建迁移脚本时,可以通过-m添加备注,且这个备注会作为迁移脚本文件命名的一部分:migrations/versions/Revision ID_initial_migration.py。
3. 创建/更新数据库
对于第一个迁移来说,其作用与db.create_all()作用一样。但在后续的迁移中,flask db upgrade命令会把改动应用到数据中,且不影响其中保存的数据。至此,数据以创建完成:
现在所有的迁移工作已经完毕,可以运行flask run来启动应用了。关于环境变量的设置如下: