我想提高测试速度。
- 我应该使用
use_transactional_fixtures
或与database_cleaner
gem?
- 哪种database_cleaner策略是最好的?我注意到,从迁移后
:truncation
to :transaction
我的 800 多个示例的运行速度大约提高了 4 倍!
- 我应该关闭吗
use_transactional_fixtures
当我使用database_cleaner时:transaction
?
- 确实,rack_test 的最佳策略是
:transaction
?
- 即时改变策略的最佳实践是什么
:transaction
to :truncation
当使用硒或阿克法洛斯 https://github.com/bernerdschaefer/akephalos?
附: Mysql、Rails 3、Rspec2、黄瓜
附言我知道关于spork https://github.com/timcharper/spork and 并行测试 https://github.com/grosser/parallel_tests并使用它们。但它们是题外话。例如,Spork 在整个套件运行中节省了大约 15-20 秒,但是从:transaction
to :truncation
运行时间从 3.5 分钟大幅增加到 13.5 分钟(相差 10 分钟)。
使用事务装置会更快,因为 DBMS 不会提交更改(因此不会发生大量 IO 来重置测试之间的数据库),但正如您所知,这并不总是有效。
我们在测试环境中使用 SQLite 内存数据库取得了一些成功,因此测试运行速度非常快,同时关闭了事务固定装置。此选项也适用于 MySQL(使用 :options 设置“ENGINE=MEMORY”),但我个人从未这样做过,如果您搜索,您会发现一些有关涉及警告的线程。也许值得一瞧。不过,根据您的测试方法,使用不同的数据库引擎可能是不可接受的。
我建议您启用事务装置并使用数据库清理器 https://github.com/bmabey/database_cleanergem 有选择地禁用每个示例组的事务装置。我不能说我已经尝试过这个,但由于您没有任何答案,我认为任何事情都可能对您有所帮助。
before(:all) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
before(:each) do
DatabaseCleaner.start
end
after(:each) do
DatabaseCleaner.clean
end
如果是我,我会将其分解为一个助手,并将其称为每个需要关闭事务装置的示例组中的单行宏。
看来确实应该有更好的方法,不过……祝你好运。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)