rails在test下使用memory引擎
By admin
一直用rspec和database_cleaner进行测试,表一多,每个测试都要truncate所有的table,每个it都要一秒多,硬盘卡拉卡拉的巨响不说,这样下来一个模型测试下来就得好几分钟。
每次一测试都可以去上个厕所什么的再回来。
终于想到了,把test时用的db换成memory引擎的。
google了一下,看有用sqlite的memory引擎的,不过mysql的也应该差不多。
首先要将所有migration里的text 和 blob的字段换成 string的,因为memory不支持这两个类型。当然测试样例里如果要测试这些字段,也别放超过255个字符的就可以。
然后在db/seed.rb文件里加上
db = ::Atable.connection
if ::Rails.env.test?
tables = db.tables
tables.delete ‘schema_migrations’
tables.each do |t|
db.execute “ALTER TABLE #{t} ENGINE= MEMORY”
end
exit
end
再执行rake db:seed RAILS_ENV=test
将所有表转换为memory
马上测试。原来要好几分钟的测试,现在就一两秒完成, done
补充,后来我把这个功能单写了一个gem,叫convert_memory_engine
https://github.com/superwf/convert_memory_engine
也可以gem install convert_memory_engine