如何通过创建新数据库正确地对sqlalchemy模型进行单元测试(使用nose)

时间:2014-07-11 13:18:24

标签: sqlite postgresql unit-testing sqlalchemy nose

我目前有一个使用flask-sqlalchemy的应用程序。我的模型连接到postgresql数据库,现在我想编写单元测试(使用nose)。我被告知使用SQLite创建一个新的数据库进行测试,经过大量搜索(并查看flask-sqlalchemy网站上的短信部分),我仍然感到困惑,如何做到这一点。我的model.py中的每个类看起来如下所示:

db = SQLAlchemy(app)
class Prod(db.Model):
   __tablename__ = 'prod'
   id = db.Column(db.Integer, primary_key=True)
   desc = db.Column(db.String)
   def __init__(self, id, desc):
     self.id = id
     self.desc = desc

我的config.py:

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgres://name:pass@server/db

我想通过为每个测试设置和拆除新数据库来测试新文件中的插入函数。如果有人能给我一些很好的示例代码。谢谢!

1 个答案:

答案 0 :(得分:2)

我无法回答您的具体问题,但会提供一些一般性建议:

您会发现为每个测试设置和拆除整个数据库的速度太慢。想象一下,将来可能有数百次测试甚至数千次。

我们采取的方法是:

  1. 出于测试目的,我们有一个填充了测试数据的数据库。我们有一个脚本可以创建一个新的数据库,并用这个测试数据填充它。
  2. 我们在运行测试套件之前运行此脚本。所有测试都可以假设这些数据存在。
  3. 如有必要,每个测试都可以创建其他记录,但是他们有责任撤消他们所做的任何更改(删除新记录,撤消更改) - 以便使数据库处于与测试开始之前相同的状态。这可以防止测试相互干扰。
  4. 在我管理的项目中,我们有一个1070个测试的测试套件,使用这种方法在大约5分钟内运行。

    如果我们采取了您的方法怎么办?让我们假设这些测试中有50%实际上运行数据库(并且需要重新加载)。重载时为1070 * .50 * 20秒/ 3600 = 2.97小时。哎呀 - 这太慢了,无法发挥作用。

    即使规模要小得多,如果你的测试套件在1分钟而不是20分钟内运行,你会更开心。