LoginSignup
7
4

More than 1 year has passed since last update.

駆け出しエンジニアのCI改善 (その1 seed.rbの作成)

Last updated at Posted at 2022-03-11

自己紹介: 駆け出しエンジニア

はじめまして。
私はRailsで自社サービスの開発を行っている駆け出しエンジニアです。

2020年11月 エンジニアとしての学習を開始
2021年5月 エンジニアへ転職
2022年3月 現在(10ヶ月目)

現在、自動テスト作成の業務に取り組んでいます。
取り組んだことや気づいたことについて少しずつ記載して行きたいと思います。

実行環境: Ruby3.0 & Rails6.0

Ruby 3.0.3
Rails 6.0.4.6

目標: GithubActionsでテストを並列実行する

4つのステップに分けて進めて行きます。

  1. テスト用DB作成の為にseed.rbを作成する ← 今回の記事
  2. GithubActionsで自動テストを作成する
  3. 自動テスト実行時にテストカバレッジの測定をする
  4. GithubActionsのテストを並列で実行したい (目標)

ということで、今回は1の テスト用のDB作成の為にseed.rbを作成する について記載します。

今回やること: DBの内容をseed.rbに書き出す

  • テスト実行に必要なDBを作成する seed.rb を作る。
  • 作成するseedは開発環境のDBから書き出す。

手段: gem 'seed_dump'

seed_dump というDBからseedを作成することができるgemを使用しました。

Githubへのリンク

使用理由: DBの内容をseedに書き出したい

自社では市区町村や駅などのマスターデータを使ったテストがあり、
テスト実行の為にはマスターデータが入っているDBを用意する必要があります。

現在は、CSVからマスターデータをインポートする仕組みがあり、更新処理ではこの仕組みを使っています。

しかし、この処理は実行に時間がかかるという課題があり、
CIでテスト実行の度にCSVからインポートすることは相応しくありませんでした。

また、現状のマスターデータに合わせたseedを作成することも検討しましたが、
これらは変わるものであり、その度にseedを作り直すのは大きなコストになります。

更新されたDBのマスターデータに合わせて、素早くseedを作り直したいという点からseed_dumpを使用しました。

使用感: シンプルでわかりやすい

使い方はREADMEを参考にしました。

  1. Gemfileに追加してインストール

    # Gemfileに追加
    gem 'seed_dump'
    
    $ bundle install
    
  2. モデル別にseedを作成

    # db配下にseedsディレクトリを作成
    $ mkdir db/seeds
    
    # (例)Cityという市区町村のモデルの場合
    $ rake db:seed:dump MODELS=City FILE=db/seeds/cities.rb EXCLUDE=created_at,updated_at
    

    MODELSで対象となるモデルを、FILEで出力するファイルを指定しています。

    また、EXCLUDEは対象外にするカラムを指定します。
    デフォルトでは [:id, :created_at, :updated_at] が除外対象となっています。

    今回はseedでDBを作成する際にIDを指定したいという点から EXCLUDEを上書きしてIDをdump対象にしています。
    (READMEに記述されていますが、モデル未指定での実行や models_exclude を設定することで対象外のモデルを設定して実行することもできるそうです)

  3. 作成されるファイルの例

    db/seeds/cities.rb
    City.create([
      { id: 1, name: ... },
      { id: 2, name: ... },
      ...
    

    バリデーションをスキップしたいなどあればお好みでinsert_all!にしても良いかもしれません。

    - City.create()
    + City.insert_all!()
    
  4. seed.rbで読み込む

    db/seed.rb
    # 作成したファイル名を並べます
    %w[
      cities
      ...
    ].each do |table_name|
      path = Rails.root.join("db/seeds", table_name + ".rb")
    
      raise StandardError "#{table_name}.rbが見つかりません" unless File.exist?(path)
    
      require path
    end
    
  5. 実行

    $ rails db:seed
    

まとめ: db:seed でテストに必要なDBを作成

rails db:seedで空のDBからテストに必要なデータを持ったDBを作成することができるようになりました。

次回: GithubActionsを使った自動化

開発環境でテスト用のDBを用意してテストを実行することができるようになりましたので、
次回はGithubActionsを使用した自動テストへの取り組みについて記載したいと思います。

最後まで読んで頂きありがとうございました。

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4