統合テストスクリプトをtmp/配下の作業ディレクトリで実行するよう改善

rails/tailwindcss-rails

統合テストスクリプトがリポジトリのルートディレクトリを汚染する問題を修正しました。スクリプトがtmp/配下の独立したディレクトリで動作するようになり、テスト実行がクリーンかつ冪等になります。

背景

従来の統合テストスクリプトは、実行環境としてリポジトリのルートディレクトリをそのまま使用していました。これにより、テストを実行するたびにリポジトリ本体のGemfileGemfile.lockが書き換えられ、作業ディレクトリにMy Workspaceが生成されるという問題がありました。

具体的には、テスト開始時にbundle remove actionmailerbundle remove railsを実行してGemfileをクリーンアップし、rm -f Gemfile.lockでロックファイルを削除するという方法で状態のリセットを試みていました。しかしこのアプローチは、テスト実行中に割り込みが発生した場合や並列実行時にリポジトリの状態を壊すリスクを持っていました。また、bundle add tailwindcss-rails --path="../.." という相対パス指定は、実行時のカレントディレクトリに依存するため、スクリプトをどこから呼び出すかによって正しく機能しない恐れがありました。

これらの問題は、テスト実行環境の独立性という基本原則に反しており、CI環境や開発者のローカル環境での再現性を損なう要因となっていました。

技術的な変更

両スクリプトにROOT変数WORKDIR変数を導入し、スクリプト自身の絶対パスを起点に作業ディレクトリを決定するよう変更されました。

スクリプト冒頭で以下のようにパスを解決し、専用の作業ディレクトリに移動します:

ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
WORKDIR="$ROOT/tmp/integration-user-install"

rm -rf "$WORKDIR"
mkdir -p "$WORKDIR"
pushd "$WORKDIR"

Gemfileの準備方法も根本的に変わりました。従来はリポジトリのGemfileをbundle removeで整理していましたが、新方式ではヒアドキュメントで最小限のGemfileをゼロから生成します:

変更前:

rm -f Gemfile.lock
bundle remove actionmailer || true
bundle remove rails || true
rm -f Gemfile.lock
bundle add rails --skip-install ${RAILSOPTS:-}

変更後:

cat > Gemfile <<EOF
source "https://rubygems.org"
EOF
bundle add rails --skip-install ${RAILSOPTS:-}

また、テスト対象のgemへのパス指定が相対パスから絶対パスに変更されました。--path="../.." の代わりに --path="$ROOT" を使用することで、pushd によるディレクトリ変更後も正しくgemを参照できます:

# 変更前
bundle add tailwindcss-rails --skip-install --path="../..."

# 変更後
bundle add tailwindcss-rails --skip-install --path="$ROOT"

同様の変更がuser_install_test.shuser_upgrade_test.shの両スクリプトに適用されており、作業ディレクトリはそれぞれtmp/integration-user-install/tmp/integration-user-upgrade/に分離されています。

設計判断

スクリプトが自身の配置場所からルートを解決する方式を採用することで、スクリプトの実行可搬性を高めています。$(cd "$(dirname "$0")/../.." && pwd) というイディオムは、シンボリックリンクの解決には対応しないものの、bashスクリプトで広く使われる標準的な手法です。

作業ディレクトリをリポジトリのtmp/配下に置く選択は、.gitignoreの慣習に沿ったものです。tmp/はRailsプロジェクトで一般的に無視されるディレクトリであり、テスト生成物がリポジトリの追跡対象に混入するリスクを排除できます。また、テスト開始時にrm -rf "$WORKDIR"で作業ディレクトリを毎回クリーンアップする設計により、前回のテスト実行の残骸が次回に影響しない冪等性が保証されます。

既存の「スペースを含むディレクトリ名でのテスト」(My Workspace#176#184 で報告された問題)は引き続きWORKDIR配下に作成されており、その検証ロジック自体は変更されていません。

まとめ

本PRはテストコードの振る舞いを変えることなく、テスト実行の副作用をリポジトリのルートから隔離することに集中した改善です。Gemfileを「整理する」アプローチから「作り直す」アプローチへの転換と絶対パスの採用により、テスト環境の独立性と再現性が向上しました。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
fa7fbbc5

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

「リード文→背景→技術的な変更→設計判断→まとめ」という理想的な3部構成が明確に適用されており、非常に分かりやすいです。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きのシンタックスハイライト、PR/Issue番号のリンク記法など、全てのカスタムMarkdown構文が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

シェルスクリプトやRailsのテスト環境に関する知識を前提としており、専門知識を持つエンジニアという対象読者に完全に適合しています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論→各論の構成になっており、各段落もトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が守られています。可読性が高いです。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されているコードは、提供されたDiff情報(変更前・変更後)と完全に一致しており、正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「冪等性」「ヒアドキュメント」などの技術用語が文脈に応じて正確かつ効果的に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

テスト実行環境を分離するという変更の意図と、そのための具体的なコード変更(WORKDIRの導入、Gemfileの動的生成など)が技術的に正確に説明されています。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内の全ての主張は、PRのDescriptionやDiff内のコード・コメントで裏付けられており、ハルシネーションは検出されませんでした。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#615)や関連Issue番号(#176, #184)が正確に記載・リンクされています。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトルはPRのタイトル「test: run integration scripts in tmp/ work directory」の内容を的確に要約しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

`.gitignore`の慣習など、変更の背景を説明するために必要最小限の一般知識に言及していますが、PR情報に基づかない憶測や捏造はありません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「従来」「新方式では」といった表現が、PRの変更前後の状態を正確に反映しており、時間表現に誤りはありません。