[Rails] テスト環境のENV汚染を徹底的にクリーンアップ

rails/rails

Context

Railsのテストスイートにおいて、ENV環境変数の変更が適切にクリーンアップされず、テスト間で状態が漏洩する問題が継続的に発生していました。この問題は#56563で報告され、特定のテスト実行順序で失敗が発生する原因となっていました。本PRは、この問題を根本的に解決するため、ENV変数の適切な管理とクリーンアップ処理を導入します。

Technical Detail

Rakeタスクでの ENV.delete パターンの導入

従来、Rakeタスクは ENV["FROM"] を直接参照していましたが、これがテスト後に環境変数を汚染していました。

変更前:

to_load = ENV["FROM"].blank? ? :all : ENV["FROM"].split(",").map(&:strip)

変更後:

from = ENV.delete("FROM")
to_load = from.blank? ? :all : from.split(",").map(&:strip)

ENV.delete を使用することで、値を取得すると同時に環境変数を削除し、後続のテストへの影響を防ぎます。

with_rails_env ヘルパーによるスコープ管理

複数のテストファイルで ENV["RAILS_ENV"] の直接代入が、with_rails_env ヘルパーを使ったスコープ管理に置き換えられました。

AssetDebuggingTestの改善:

test "assets are concatenated when debug is off and compile is off either if debug_assets param is provided" do
  with_rails_env("production") do
    rails "assets:precompile", "--trace"
    app "production"
    class ::PostsController < ActionController::Base ; end

    get("/posts?debug_assets=true", {}, "HTTPS" => "on")
    assert_match(/<script src="\/assets\/application-([0-z]+)\.js"><\/script>/, last_response.body)
  end
end

このパターンにより、ブロック終了時に自動的に RAILS_ENV が元の状態に戻ります。ViewReloadingTestServerTest でも同様の改善が行われています。

restore_default_config による設定リセット

一部のテストでは、不要な build_app 呼び出しが restore_default_config に置き換えられました。

test "config.active_job.verbose_enqueue_logs defaults to true in development" do
  restore_default_config
  app "development"

  assert ActiveJob.verbose_enqueue_logs
end

restore_default_config は既存のアプリケーション設定を再利用しつつ、環境変数をクリーンな状態に戻すため、テストの実行速度向上にも貢献します。

teardownでのENV削除処理の改善

teardown_app メソッドで、RAILS_ENV の復元処理が改善されました。

変更前:

def teardown_app
  ENV["RAILS_ENV"] = @prev_rails_env if @prev_rails_env
  # ...
end

変更後:

def teardown_app
  if @prev_rails_env
    ENV["RAILS_ENV"] = @prev_rails_env
  else
    ENV.delete("RAILS_ENV")
  end
  # ...

以前の実装では @prev_rails_envnil の場合にENV変数が残留していましたが、明示的に delete することで確実にクリーンアップされます。

Generatorテストでの改善

ActionMailboxInstallGeneratorTest では、run_generator メソッドをオーバーライドして、with_database_configuration ブロック内で実行するように統一されました。

private
  def run_generator
    quietly { with_database_configuration { super } }
  end

これにより、各テストケースで個別に with_database_configuration を呼び出す必要がなくなり、コードの重複が削減されました。

Impact

この変更により、Railsのテストスイート全体で環境変数の漏洩が防止され、テスト実行順序に依存する不安定なテスト失敗が解消されます。特に、CI環境での並列実行時の信頼性が大幅に向上します。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

ガイドライン準拠 ✓ PASS

記事構成とDiffDaily Styleへの準拠状況

記事構成、カスタムMarkdown構文、対象読者への適合性、すべての点でガイドラインを完全に満たしています。特に、コードブロック前後の空行やファイル名付きシンタックスハイライトが正しく使われており、可読性が非常に高いです。

  • 記事構成(Title、Context、Technical Detail)
  • DiffDaily Styleガイド準拠
  • カスタムMarkdown活用
  • 対象読者への適合性
技術的整合性 ✓ PASS

技術的な正確性と表現の適切性

引用されたコードはPRの趣旨に沿っており、Diff内容を正確に反映していると判断できます。技術用語の選択も適切で、各コード変更の意図と効果が技術的に正確に解説されています。

  • 技術用語の正確性
  • コード例の正確性
  • 説明の技術的正確性
PR内容との整合性 ✓ PASS

元のPR情報との一致度

記事の内容は提供されたPR情報(Title: Clean up ENV leaks continued)と完全に整合性が取れています。重要なハルシネーションは見られず、PRの目的と変更内容を忠実に反映した高品質な記事です。

  • タイトル・説明の一致
  • Diff内容の正確な反映
  • 推測の排除