知識マップ: テストのないレガシー業務アプリに安全に手を入れる ── 特性化テストとリファクタリングの実践

記事「テストのないレガシー業務アプリに安全に手を入れる ── 特性化テストとリファクタリングの実践」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

この記事は、自動テストのないレガシーコードに安全に手を入れるための手順を扱います。まず特性化テストで現在の挙動を固定し、出力の単位が大きい場合はゴールデンマスター法で期待値ファイルとの差分比較を行います。UIに直書きされたロジックには、メソッド抽出とインターフェース差し込みで継ぎ目(seam)を作り、必要ならInternalsVisibleTo属性でinternalメンバーをテストから見えるようにします。リファクタリングは差分ゼロ、機能追加は意図した差分だけが合格条件であるため同じコミットに混ぜてはならず、期待値の更新は差分レビューを経てから行うことで、退行を見逃すリスクを防ぎます。

特性化テストとレガシーコード改修の知識マップ特性化テストとゴールデンマスター法でレガシーコードの現在の挙動を固定し、継ぎ目(seam)を作ってリファクタリングと機能追加を安全に分離する関係を示す図より先に行うべきより先に行うべき実装を担う推奨される対応原因になり得る軽減する軽減する原因になり得る実装を担う実装を担うで構成できる両立しない前提とするで確認できるで確認できる推奨される対応推奨される対応両立しない推奨される対応特性化テストレガシーコードメソッド抽出リファクタリングゴールデンマスター法退行リスク期待値の差分レビューリファクタリングと機能追加の混在コミット継ぎ目(seam)インターフェース差し込みInternalsVisibleTo属性出力の正規化dotnet testコマンドvstest.console.exe

概念間の関係(全19件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

特性化テスト
正しい挙動ではなく、いまのコードが実際にどう振る舞っているかという「現在の挙動」を記録するテスト。
レガシーコード
Michael Feathersが「単に古いコード」ではなく「テストのないコード」として定義した、変更結果を確かめる手段を欠いたコード。
ゴールデンマスター法
変更対象の出力をそのまま期待値ファイル(ゴールデンマスター)として保存し、以後のコード変更のたびに出力と期待値の差分がゼロであることを確認する特性化テストの具体的な手法。
期待値の差分レビュー
ゴールデンマスターを更新する前に、変更前後の出力差分を目視でレビューし、意図した変更だけが含まれることを確認する運用手順。
リファクタリングと機能追加の混在コミット
挙動を変えない変更(リファクタリング)と挙動を変える変更(機能追加・バグ修正)を同じコミットに混ぜてしまう運用上のアンチパターン。
メソッド抽出
UIイベントハンドラーなどに直書きされたロジックを、外部依存を引数として受け取る別メソッドへ切り出すリファクタリング手法。
インターフェース差し込み
DateTime.Nowやファイルパスの直接参照など、引数化だけでは済まない依存をインターフェースで包み、テスト側で差し替え可能にする手法。
継ぎ目(seam)
Michael Feathersの言う、テストコードから挙動を差し替え・観測できる場所。
リファクタリング
挙動を変えることなく、コードを保守・理解・拡張しやすくするために構造を変更するプロセス。
退行リスク
変更によって意図しない挙動変化(退行)が入り込み、それに気づけないリスク。
dotnet testコマンド
.NET SDKに含まれる標準のテスト実行コマンド。
vstest.console.exe
ビルド済みのテストDLLを直接指定して実行できる、Developer Command Promptから使うコマンドラインツール。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。