Rails複製資料庫內容:開發環境 -> 測試環境
進行Rails開發時,有時需要將開發環境(development)的資料庫內容複製到測試環境(test)當中,方便我們在整合測試時,有時需要撈取一些特定資料。我們這次要利用db:seed的方式,指定將資料seed到測試環境的資料庫當中。
分成三個步驟:
1. 開設一個專門的seed資料夾 2. 將目前的開發環境資料庫內容複製到seed檔案當中 3. 利用db:seed將資料倒入測試資料庫中
1. 開設專門的seed資料夾
由於會有許多測試檔案,因此我們不動到原本rails內建的db/seeds.rb
,另外再開一個新的資料夾,放入所有我們需要的seed檔案。我們可以在db
底下再增加一個資料夾seeds
。整個結構變成:
db
|--> seeds
|----> posts.rb
|----> comments.rb
裡面所有的.rb
檔案就是我們要產生的seed檔案。
2. 使用gem 'seed_dump' 來複製資料
gem 'seed_dump'就是專門拿來把資料庫複製到seed檔案內的gem,這邊我們依照一般程序安裝。首先在Gemfile輸入:
gem 'seed_dump'
接下來在command line執行:
$ bundle
安裝就完成了。雖然他文件中有說明許多不同的操作方法,不過在這邊我們重點是將資料複製出來,只要在command line輸入:
$ rake db:seed:dump
就可以將開發環境的資料庫內所有table都寫在seeds.rb
內。注意:seeds.rb裡面所有內容都會被覆寫掉。
不過我們沒有要直接覆寫掉原本的檔案,因此要加上檔案的變數;另外假如我們有20多個table,倒資料的速度也會很可觀,因此我們只選擇測試真正會用到的table即可。
$ rake db:seed:dump MODELS=Post FILE=db/seeds/post.rb
後面兩個是變數,第一個可以指定我們要倒出的model名稱,後面則是要倒出來的檔案名稱。這時候,他就會將所有 內容複製出來。可以直接到該檔案內檢查是否有東西即可。
3. 執行指定的seed檔案
原本Rails內建的$ rake db:seed
只會執行seeds.rb檔案,現在要增加一個設定,讓我們可以自行決定要執行的檔案名稱。
到lib/tasks/
資料夾內,開啟新.rb的檔案,並進行編輯。
namespace :db do
namespace :seed do
Dir[File.join(Rails.root, 'db', 'seeds', '*.rb')].each do |filename|
task_name = File.basename(filename, '.rb').intern
task task_name => :environment do
load(filename) if File.exist?(filename)
end
end
end
end
這樣設定並儲存以後,我們就可以執行自訂的seed檔案,只要在後方加上檔案名稱即可,要注意自訂資料夾名稱和code裡面的名稱有沒有對應。
最後,seed指令如下:
$ rake db:seed:post RAILS_ENV=test
在seed後方加上檔案名稱,去掉.rb;並再加上指定的資料庫環境。執行以後,就可以到資料庫內查看,新增的資料應該都已經在裡面囉!
有時會使用 $rake db:test:prepare 或其他整理測試環境資料庫的指令,這些指令都會清空資料庫,因此若有任何資料庫架構的變動,記得再執行一次db:seed來填入資料喔!