lvncerpedia

フォーマッターとテストツール

Next.jsとか他のフレームワークを触ってるなら、考え方自体は似てるところも多いから、すんなり理解できると思うよ! ここでは、Rails開発で「これだけは押さえておきたい!」っていう定番ツールと、それに関連する知識をまとめて紹介するね!

コードフォーマッター (Linter & Formatter)

コードフォーマッターは、コードの見た目(インデントとか、スペースとか)を自動で統一してくれるツールのこと。 チーム開発でのコードの可読性を上げたり、無駄なスタイルレビューをなくすために、ほぼ必須のツールだよ!

代表的なツール: RuboCop

Ruby/Rails界隈では、RuboCop がデファクトスタンダード(事実上の標準)だよ。これは単なるフォーマッターじゃなくて、「Linter(リンター)」としての機能も持ってるんだ。

  • Linter: 「こういう書き方はバグりやすいよ」とか「もっとRubyらしい書き方があるよ」みたいに、コードの品質をチェックしてくれる機能。
  • Formatter: コードのスタイルを統一してくれる機能。

なんで使うの?

  • コードの一貫性: 誰が書いても同じスタイルの綺麗なコードになる。
  • レビューの効率化: スタイルに関する指摘が不要になるから、ロジックのレビューに集中できる。
  • バグの早期発見: Linter機能が、潜在的なバグや非効率なコードを見つけてくれる。

使い方

インストール: Gemfile に追加して bundle install する。

# Gemfile
group :development, :test do
  gem 'rubocop', require: false
  gem 'rubocop-rails', require: false # Rails用のルールセットも追加
end

設定ファイルを作成: プロジェクトのルートに .rubocop.yml という設定ファイルを作る。 ここで、ルールをカスタマイズできるよ。

# .rubocop.yml の簡単な例
require:
  - rubocop-rails # Rails用のルールを読み込む

AllCops:
  NewCops: enable # 新しいルールを有効にする
  Exclude: # チェック対象外のファイルを指定
    - 'db/schema.rb'
    - 'bin/*'
    - 'config/initializers/*'

Style/Documentation: # クラスやモジュールのコメントを必須にするか (最初はfalseでもOK)
  Enabled: false

Style/StringLiterals: # 文字列をシングルクォートにするかダブルクォートにするか
  EnforcedStyle: single_quotes

実行: コマンドラインで実行する。

# コードの問題点をチェックするだけ
bundle exec rubocop

# 自動で修正できる問題を全部修正してくれる!✨ (これが一番よく使う!)
bundle exec rubocop -A

関連知識:Gitフックとの連携

開発に慣れてきたら、git commit する前に自動でRuboCopを走らせる「Gitフック」を設定するのがおすすめ! lefthook や overcommit っていうツールを使うと、コミット前に必ずコードが綺麗になるから、チーム開発がめっちゃスムーズになるよ!

テストツール

テストは、書いたコードが期待通りに動くことを保証するためのもの。 Railsはテスト文化がすごく根付いてるから、ここはしっかり押さえておきたいところ!

代表的なテストフレームワーク

Railsには標準で Minitest が入ってるけど、コミュニティでは RSpec の方が人気が高いかな。 どっちも良いツールだよ!

ツール特徴
MinitestRails標準。シンプルで軽量。Ruby標準のライブラリだから学習コストが低い。
RSpec非常に人気。英語の文章みたいに自然に書ける(BDD: ビヘイビア駆動開発)。柔軟で高機能。

Minitestの書き方

assert_equal expected, actual(期待値と実際の値が同じか)みたいな形式で書く。

# test/models/post_test.rb
require "test_helper"

class PostTest < ActiveSupport::TestCase
  test "the truth" do
    assert true # これは常に成功するテスト
  end

  test "should not save post without title" do
    post = Post.new
    assert_not post.save, "Saved the post without a title" # タイトルなしでは保存できないはず
  end
end

RSpecの書き方

expect(actual).to eq(expected)(実際の値が期待値と等しいことを期待する)みたいに、より自然な英語に近い形で書けるのが特徴。

# spec/models/post_spec.rb
require 'rails_helper'

RSpec.describe Post, type: :model do
  it "is valid with a title" do
    post = Post.new(title: "My first post")
    expect(post).to be_valid # タイトルがあれば有効であること
  end

  it "is invalid without a title" do
    post = Post.new(title: nil)
    expect(post).to_not be_valid # タイトルがなければ無効であること
  end
end

テストデータの作成: FactoryBot

テストを書くとき、毎回「テスト用のユーザー」とか「テスト用の投稿データ」を手で作るのはすごく面倒くさい。 そこで使うのが FactoryBot! これは、テストデータを簡単に作るためのツール(「ファクトリ」と呼ばれるものを作る)。

なんで使うの?

  • DRY (Don't Repeat Yourself): テストデータの作成ロジックを1箇所にまとめられる。
  • 可読性: create(:user) みたいに、何を作ってるのか直感的にわかる。
  • 保守性: モデルの仕様が変わっても、ファクトリの定義を1つ直すだけで済む。

使い方

インストール: Gemfile に追加。

# Gemfile
group :development, :test do
  gem 'factory_bot_rails'
end

ファクトリを定義: spec/factories ディレクトリに、モデルごとのファクトリを作る。

# spec/factories/users.rb
FactoryBot.define do
  factory :user do
    # name { "Taro Yamada" }
    sequence(:name) { |n| "User #{n}" } # sequenceを使うと連番でユニークなデータを作れる
    sequence(:email) { |n| "test#{n}@example.com" }
    password { "password" }
  end
end

テストで使う: create(:user) みたいに呼び出すだけ!

# spec/models/post_spec.rb
it "is created by a user" do
  user = create(:user) # FactoryBotでユーザーを作成
  post = Post.create(title: "Test Post", user: user)
  expect(post.user).to eq(user)
end

関連知識:その他便利なテスト関連ツール

  • Faker: リアルなダミーデータ(名前、住所、メールアドレスなど)を生成してくれるGem。FactoryBotと組み合わせて使うことが多いよ。
  • SimpleCov: テストカバレッジ(コードのうち、どれくらいの割合がテストで実行されたか)を計測してくれるツール。テストが十分かどうかの一つの指標になる。
  • Capybara: System Test(ブラウザでの操作をシミュレートするテスト)を書くときに使う。ユーザーが実際に画面を操作する流れをテストできる。

まとめ

Rails開発を始めるときの、個人的なおすすめセットはこれかな!

  • フォーマッター: RuboCop (ほぼ必須)
  • テストフレームワーク: RSpec (Minitestでも良いけど、求人とか見るとRSpecの経験を求められることも多いかも)
  • テストデータ: FactoryBot (Fixturesより柔軟でモダン)