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來填入資料喔!

延伸閱讀

gem 'seed_dump'

自訂seed路徑

指定seed環境