Skip to content

tech: テストデータの改善とFactory Pattern導入 #2573

@jacopen

Description

@jacopen

概要

テストで実際のイベント名(CNDT2020等)を使用している問題を解決し、Factory Patternによるテストデータ生成システムを構築する。

現状の問題

  • テストで実イベント名(CNDT2020、CNDO2021等)を使用
  • テストの独立性が保たれていない
  • データの整合性が不十分
  • テストデータの保守が困難

調査結果

以下のファイルで実イベント名の使用を確認:

  • spec/factories/conferences.rb
  • spec/requests/exporter_spec.rb
  • spec/requests/timetable_spec.rb
  • spec/requests/api/v1/*_spec.rb
  • その他多数のspecファイル

改善内容

Phase 1: Factory Pattern基盤構築

  • ダミーイベント用のFactoryBot設定
  • 共通テストデータジェネレーターの作成
  • テスト環境専用の命名規則策定

Phase 2: 既存テストの移行

  • Conference factoryの改善
    # Before
    factory :cndt2020, class: Conference do
      abbr { 'cndt2020' }
    end
    
    # After  
    factory :conference do
      sequence(:abbr) { |n| "test_event_#{n}" }
      sequence(:name) { |n| "Test Conference #{n}" }
    end
  • Speaker/Talk factoryの独立化
  • Profile factoryの改善

Phase 3: テストケースの書き換え

  • spec/requests/配下のテスト修正
  • spec/models/配下のテスト修正
  • spec/controllers/配下のテスト修正

Phase 4: テストデータ管理の改善

  • テスト用seedデータの分離
  • 本番データへの依存除去
  • テストDBの初期化処理改善

実装例

改善前

let\!(:cndt2020) { create(:cndt2020, :registered) }
let\!(:alice) { create(:alice, :on_cndt2020, conference: cndt2020) }

改善後

let(:conference) { create(:conference, :with_registration_open) }
let(:speaker) { create(:speaker, conference: conference) }

Factory定義例

FactoryBot.define do
  factory :conference do
    sequence(:name) { |n| "Test Conference #{n}" }
    sequence(:abbr) { |n| "test_conf_#{n}" }
    conference_status { :registered }
    
    trait :with_registration_open do
      attendee_entry { 1 }
      speaker_entry { 1 }
    end
    
    trait :archived do
      conference_status { :archived }
    end
  end
end

期待効果

  • テストの独立性確保
  • 実データへの依存除去
  • テストの保守性向上
  • データ整合性の改善
  • 新規テスト作成の効率化

関連作業

参考


📝 Created by Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestrubyPull requests that update Ruby code

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions