仕様変更の影響と反映
要求変更の影響を成果物まで追い、古い試験の成功を新しい要求の達成と取り違えずに、受入対象を整理します。
説明
要求が変わると、実装だけでなく、試験の期待値、画面の案内、受入の判断も見直す必要があります。どの要求にどの設計・コード・試験が対応するかを記録すると、変更の影響を探しやすくなります。
送料無料の基準を5000円から3000円へ変更する依頼を扱います。要求と成果物の対応表をたどり、古いテストが変更前のコードでも通る理由を確認します。新しい境界ケースを追加し、コードと案内文を更新するまでを同じ作業ディレクトリで行います。
要求変更の影響を成果物まで追い、古い試験の成功を新しい要求の達成と取り違えずに、受入対象を整理します。
1変更する条件と維持する条件
変更依頼を読みます。金額の境界は変えますが、対象配送と負額の拒否は維持します。
cat change.txt変更依頼と承認状況を表示する希望公開日と承認は別の情報です。影響が分からない段階で日付だけを根拠に公開せず、変更対象と必要な確認をそろえて判断します。
2要求と成果物の対応を読む
items.csvはIDの意味、links.csvは親と子の対応です。要求から設計を経てコードへ進む経路と、試験や案内文へ進む経路があります。
cat items.csvIDと成果物の種類を確認する
cat links.csv要求と成果物の対応を確認するR-SHIPから料金式、コード、料金試験、案内文、表示試験へたどれます。対応表は記録された範囲の手掛かりです。表にない依存もあるため、コード検索や担当者の確認と併用します。
3変更要求から影響先をたどる
trace.pyはlinks.csvを読み、指定IDから子を幅優先で列挙します。2段目以降の間接的な関係も表示します。
python3 trace.py R-SHIP送料要求から子の成果物を列挙する料金式と料金試験だけでなく、UI-HELPとT-DISPLAYも候補に入ります。表示されるのは変更を調査する範囲であり、すべてを書き換えると決まったわけではありません。
4コードから元の要求へ戻る
同じ対応を逆向きにたどります。料金コードが、送料と負額の拒否という二つの要求に関わっていることが分かります。
python3 trace.py C-QUOTE起点となるコードのID --reverse親の方向へたどる境界だけを変える場合も、負額の拒否が維持されるか確認します。一つのファイルを一つの要求専用だと思い込むと、変更しない条件への影響を見落とします。
5変更前のテストは成功する
現在のコードは5000円以上で無料です。変更前の試験をそのまま実行します。
python3 check.py old-cases.csv変更前の受入例全件PASSですが、新しい境界の3000円は試していません。成功が示すのは古いケースとの一致であり、新しい要求の達成ではありません。
6受入例にも新しい境界を加える
2999円、3000円、4999円を含む新しいCSVを読み、そのまま現在のコードで実行します。
cat new-cases.csv改訂した入力と期待値を表示する
python3 check.py new-cases.csv現在の実装と新しい要求を照合する3000円と4999円がFAILになります。どちらも新しい要求では無料ですが、古いコードは送料500円を返します。4999円は、以前は有料だった区間が無料へ変わる例です。
7コード変更の範囲を確認
境界を3000円へ変更した案との差分を確認します。負額を拒否する処理は差分に含まれていません。
diff -u変更の前後と周辺行を表示する -L quote.py -L quote-new.py quote.py quote-new.py変更は送料無料にする閾値です。差分が小さくても、試験データと案内文には別々の変更が必要です。
8新しい要求で再試験
コードを更新し、新しい受入例を実行します。
cp quote-new.py quote.py改訂した料金コードを反映する
python3 check.py new-cases.csv新しい受入例で確認する6件がPASSです。新しい境界と、0円・負額・元の境界を含む例が一致しました。これで料金関数の確認が済み、次は利用者向けの案内を確認します。
9案内文の変更漏れを見つける
料金が無料になる境界は3000円になりました。まだ残っている案内文と修正案を比較します。
cat help.txt現在の案内を読む
diff -u -L help.txt -L help-new.txt help.txt help-new.txt案内文の修正箇所を確認する元の案内は5000円のままです。計算が正しくても、利用者への説明は要求と一致していません。UI-HELPまで追跡したことで、この変更も作業対象に含められます。
10受入対象と残る確認を記録
案内文を更新し、この演習で用意した変更判断の記録を読みます。コードと試験だけでなく、どの案内文を採用するかも版の対象に含めています。
cp help-new.txt help.txt案内文を更新する
cat decision.txt承認対象と残る確認を読む料金関数と案内文の整合を優先し、装飾は次回に回しています。表示試験は公開前の確認として残っています。承認記録には、どの成果物と確認範囲を対象に判断したかを記します。
まとめ
要求から設計・コード・試験・案内へ、またコードから要求へ対応をたどります。
要求を変えたら入力と期待値も見直します。古いテストの成功だけでは新しい要求を確認できません。
変更の優先順位、対象版、確認済みの範囲、公開前に残る作業を分けて記録します。
操作履歴と解説を振り返れます。
シェル / Python 3
cat change.txtCR-7: 送料無料の境界を5000円から3000円に引き下げる。 理由: 3000円台の商品を購入する利用者の送料負担を減らす。 変更しない条件: 3000円未満は500円。負の商品代は拒否。対象配送は同じ。 希望公開日: 2026-11-20。承認状況: 影響確認中。
cat items.csv
cat links.csvid,type,description R-SHIP,requirement,送料無料の金額境界 R-INVALID,requirement,負の金額を拒否 R-SPEED,requirement,会計結果の表示時間 D-FEE,design,送料判定式 C-QUOTE,code,quote.py T-FEE,test,送料の境界ケース UI-HELP,content,送料無料の案内文 T-DISPLAY,test,画面の案内と金額表示 parent,child R-SHIP,D-FEE D-FEE,C-QUOTE R-SHIP,T-FEE R-SHIP,UI-HELP UI-HELP,T-DISPLAY R-INVALID,C-QUOTE
python3 trace.py R-SHIPdepth=0 R-SHIP depth=1 R-SHIP -> D-FEE depth=1 R-SHIP -> T-FEE depth=1 R-SHIP -> UI-HELP depth=2 D-FEE -> C-QUOTE depth=2 UI-HELP -> T-DISPLAY
python3 trace.py C-QUOTE --reversedepth=0 C-QUOTE depth=1 C-QUOTE -> D-FEE depth=1 C-QUOTE -> R-INVALID depth=2 D-FEE -> R-SHIP
python3 check.py old-cases.csvT-ZERO input=0 expected=500 actual=500 PASS T-OLD-EDGE input=5000 expected=0 actual=0 PASS T-ABOVE input=5001 expected=0 actual=0 PASS T-INVALID input=-1 expected=error actual=error PASS failed=0
cat new-cases.csv
python3 check.py new-cases.csvid,subtotal,expected T-ZERO,0,500 T-NEW-BELOW,2999,500 T-NEW-EDGE,3000,0 T-MIDDLE,4999,0 T-OLD-EDGE,5000,0 T-INVALID,-1,error T-ZERO input=0 expected=500 actual=500 PASS T-NEW-BELOW input=2999 expected=500 actual=500 PASS T-NEW-EDGE input=3000 expected=0 actual=500 FAIL T-MIDDLE input=4999 expected=0 actual=500 FAIL T-OLD-EDGE input=5000 expected=0 actual=0 PASS T-INVALID input=-1 expected=error actual=error PASS failed=2
diff -u -L quote.py -L quote-new.py quote.py quote-new.py--- quote.py
+++ quote-new.py
@@ -3,7 +3,7 @@
def shipping(subtotal):
if subtotal < 0:
raise ValueError("subtotal must be nonnegative")
- return 0 if subtotal >= 5000 else 500
+ return 0 if subtotal >= 3000 else 500
if __name__ == '__main__':
for value in sys.argv[1:]:cp quote-new.py quote.py
python3 check.py new-cases.csvT-ZERO input=0 expected=500 actual=500 PASS T-NEW-BELOW input=2999 expected=500 actual=500 PASS T-NEW-EDGE input=3000 expected=0 actual=0 PASS T-MIDDLE input=4999 expected=0 actual=0 PASS T-OLD-EDGE input=5000 expected=0 actual=0 PASS T-INVALID input=-1 expected=error actual=error PASS failed=0
cat help.txt
diff -u -L help.txt -L help-new.txt help.txt help-new.txt商品代5000円以上で送料無料。 --- help.txt +++ help-new.txt @@ -1 +1 @@ -商品代5000円以上で送料無料。 +商品代3000円以上で送料無料。
cp help-new.txt help.txt
cat decision.txtCR-7: 承認 対象版: quote-new.py / new-cases.csv / help-new.txt 受入条件: 2999円→送料500円、3000円→0円、4999円→0円、負額→エラー。 確認範囲: 料金関数と案内文。公開前に画面の表示確認T-DISPLAYを実施する。 優先順位: 料金と案内文の整合を公開条件とし、装飾の変更は次回へ送る。 見積り: 実装・試験・案内文・画面確認の4作業。所要日数は担当者が別途見積もる。
演習完了