kakudooo docs

Seedデータの作成にFactoryBotを活用する上で考えていること

Seedデータが次第にメンテナンスされなくなっていくことがよくある。 たいていテーブルスキーマを変更した際の漏れが積み重なったものであり、実装者もレビュワーも次第に意識が薄れていってしまう。 テストを書くプロジェクトだと必然とテストデータを作成するため、スキーマの変更に伴ってテストデータもメンテナンスされる。 また、テストデータの作成にFactoryBotを使用している場合は、初期値やtraitにテストデータの仕様が定義されている。 このようなメンテナンス上のメリットからSeedデータの作成にFactoryBotを活用している事例がいくつかある。

一方で、FactoryBotを開発しているThoughtBot社は、以下の理由から「Seedデータの作成にFactoryBotを使うことを推奨しない」ということをブログで述べている。

  1. The default attributes of a factory may change over time.
  2. Attributes may be added, renamed, or removed.
  3. Data will still need to be checked for presence before insertion.

https://thoughtbot.com/blog/factory_bot-for-seed-data

ローカル環境用のSeedデータの作成に活用すると便利と紹介されていたりもする。。

個人的には、非推奨であることを考慮してもデータ作成の効率性やメンテナンス性でのメリットが大きいと思っている。 プロジェクトへの導入も検討していきたいが、考慮すべき点があったので、まとめていきたい。(現状の考慮点なので、検証しながら新しく出たものについては随時追記する予定)

リモートホストへのSeedデータの流し込み

ローカル環境でのFactoryBotを使ったSeedデータの作成は、特に問題なく実現することが可能である。 ただし、テスト用の環境がリモートホスト(ステージングやプレビュー環境)にあるとして、そこを対象にしてSeedデータを作成したくなった時にどうするか?

リモートホストへのSeedデータの流し込みにあたって

ような場合、Seederの実行に失敗してしまう。

factory_bot_railsproductionモードでも動作するように設定を頑張ることも考えたが、余計なファイルや設定を複雑化することは避けたい。

また、

みたいなことも考えたが、developmentモードからリモートホストのDBへ接続して、Seederを実行するのもありかも?と思ったので、運用方法を検討してみることにした。

運用案: RAILS_ENV=developmentからリモートホストへSeedデータを流し込む

database.ymldevelopmentディレクティブをリモートホストのDBに接続するよう設定する。

例として、適当なRakeタスクを作成して、FactoryBotの定義を使用して適当なデータを作成してみる。

lib/tasks/hoge.rake

# frozen_string_literal: true

namespace :hoge do
  task fuga: :environment do |_|
    FactoryBot.create(:user, email: 'hoge@example.com')
  end
end

config/database.yml

development:
  <<: *default
  url: <%= ENV["DATABASE_URL"]  %>

ローカル環境(docker)からリモートホストに対してSeedデータの作成を行う場合

docker compose run --rm web rails hoge:fuga --env DATABASE_URL=databaseurl

リモートホスト間(アプリケーション←→DB)でSeedデータの作成を行う場合。(例としてHerokuを使っているとする) DATABASE_URLはHerokuのコンソール画面から環境変数として登録しておく。

/test/specディレクトリを含んでデプロイされている前提。(運用次第で検討が必要)

heroku run bundle exec rails hoge:fuga RAILS_ENV=development -a アプリ名

参考