【发布时间】:2017-07-10 20:40:18
【问题描述】:
假设我正在关注Flask-SQLAlchemy 快速入门示例,并且我想添加几个单元测试。
我的模型可能类似于:
db = SQLAlchemy(app)
Base = db.Model
class Account(Base):
id = Column(Integer, primary_key=True)
name = Column(String(1000))
对于单元测试,我想为每个测试创建和销毁一个数据库。
def _setup_database():
db_name = 'test_%s' % random.randint(0,999999)
# (Code that creates database with db_name and setups the schema)
app.config['DB_NAME'] = db_name
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql:///{}'.format(db_name)
def _destroy_db():
db_name = app.config['DB_NAME']
# Code that destroys the test db
class TestAccounts(unittest.TestCase):
def setUp(self):
_setup_database()
def tearDown(self):
_destroy_db()
def test_new_signup(self):
account = models.Account(...)
def test_something_else(self):
account = models.Account(...)
这里的问题是,如果我在单元测试是多线程的环境中运行此代码,则会出现竞争条件。通常同时设置两个数据库,app.config 指向其中一个。
如果我直接使用 SQLAlchemy,我将为每个测试创建一个新会话并使用该会话。但是 Flask-SQLAlchemy 为我创建了会话,因此,似乎依赖于一个全局的 app.config['SQLALCHEMY_DATABASE_URI'] 指向一个数据库。
使用 Flask-SQLAlchemy 创建测试数据库并将测试线程指向它们的正确方法是什么?
【问题讨论】:
-
没有答案,但很好奇为什么要进行多线程测试?似乎是不必要的复杂层。
-
@Adam 它使测试完成得更快。大多数人不使用多线程进行单元测试吗?
-
我从来没有做过。我的工作没有健全的 CI/测试方案。
标签: python flask flask-sqlalchemy