在运行测试之前清理测试数据库
Posted
技术标签:
【中文标题】在运行测试之前清理测试数据库【英文标题】:Cleaning out test database before running tests 【发布时间】:2013-04-25 12:41:09 【问题描述】:在运行测试套件之前清理数据库的最佳方法是什么(是否有 npm 库或推荐的方法)。
我知道 before() 函数。
我正在使用 node/express、mocha 和 sequelize。
【问题讨论】:
【参考方案1】:我制作了这个库来为您的测试清理和导入固定装置。
这样,您可以导入夹具、测试然后清理您的数据库。
看看以下内容:
before(function (done)
prepare.start(['people'], function ()
done();
);
);
after(function ()
prepare.end();
);
https://github.com/diogolmenezes/test_prepare
【讨论】:
您建议的库适用于 MongoDB,但问题状态为 sequelize。【参考方案2】:我通常这样做(比如User
模型):
describe('User', function()
before(function(done)
User.sync( force : true ) // drops table and re-creates it
.success(function()
done(null);
)
.error(function(error)
done(error);
);
);
describe('#create', function()
...
);
);
还有sequelize.sync(force: true)
将删除并重新创建所有表(.sync()
描述为here)。
【讨论】:
有什么现代的方法吗? @coler-j Sequelize 现在使用 Promise,所以before(() => User.sync( force : true ))
现在应该也能正常工作(如果这就是你所说的“现代方法”:D)
我只是想知道是否有任何本地方法可以在内置的事务中自动包装测试用例,因为这似乎是一个非常常见的要求。
@coler-j before
(以及beforeEach
)可以应用于每组测试,因此您可以在每次测试(一组测试)之前启动事务并提交或之后回滚(使用after
或afterEach
)。 Mocha 作为测试运行器根本不处理数据库,所以它不是内置功能。
好的,我只是在问题中看到(如github.com/sequelize/sequelize/issues/4189 和github.com/sequelize/sequelize/issues/3888 和github.com/sequelize/sequelize/issues/4823),当测试完成时事件循环退出并且无法滚动由于我不理解 CLS 的某些内容,在 afterEach 中支持交易【参考方案3】:
before
函数与清理数据库一样好。如果您只需要清理一次数据库,即在运行所有测试之前,您可以在单独的文件中使用全局 before
函数
globalBefore.js
before(function(done)
// remove database data here
done()
)
single-test-1.js
require('./globalBefore)
// actual test 1 here
single-test-2.js
require('./globalBefore)
// actual test 2 here
请注意,globalBefore 只会运行一次,即使它已被要求两次
测试原则
尽量限制在测试中使用外部依赖项,例如数据库。外部依赖越少,测试就越容易。您希望能够并行运行所有单元测试,而数据库等共享资源使这变得困难。
看看这个关于编写可测试 javascript 的 Google 技术讲座 http://www.youtube.com/watch?v=JjqKQ8ezwKQ
还可以查看rewire 模块。它非常适合用于存根函数。
【讨论】:
以上是关于在运行测试之前清理测试数据库的主要内容,如果未能解决你的问题,请参考以下文章
PHPUnit -setUp() - 它在每个测试用例之前和之后运行吗?