再コンパイルして差異がないか確認する

再構成したソースコードを再コンパイルし、エラーゼロで通ることをまず確認します。

Shell — GnuCOBOL 再コンパイル & シンボル比較
# コンパイル(-Wall で警告を最大に)
cobc -x -Wall -I ./copybook -o new_module src/MYPROG.cbl

# エラーがなければシンボル比較
nm -g --defined-only original_module > sym_original.txt
nm -g --defined-only new_module       > sym_new.txt
diff sym_original.txt sym_new.txt

# シンボル名が一致しているか確認(アドレスは無視して名前だけ比較)
nm -g --defined-only original_module | awk '{print $3}' | sort > names_orig.txt
nm -g --defined-only new_module       | awk '{print $3}' | sort > names_new.txt
diff names_orig.txt names_new.txt

⚠️ シンボルのアドレスは一致しなくて良い

再コンパイル後のシンボルアドレスは元のモジュールと異なります。確認すべきは「シンボル名(プログラム名・エントリ名)が揃っているか」「外部参照(U シンボル)が不足していないか」の2点です。

入出力比較テストによる等価性の担保

同じ入力データを元モジュールと再構成モジュールの両方に与え、出力が一致することを確認します。

Shell — 入出力比較テストスクリプト
#!/bin/bash
# 元モジュールと再構成モジュールの出力を比較する

INPUT="test/input-sample.dat"
ORIG_OUT="test/output_original.dat"
NEW_OUT="test/output_new.dat"

echo "=== 元モジュールで実行 ==="
./original_module < "$INPUT" > "$ORIG_OUT"
echo "終了コード: $?"

echo "=== 再構成モジュールで実行 ==="
./new_module < "$INPUT" > "$NEW_OUT"
echo "終了コード: $?"

echo "=== 出力比較 ==="
if diff "$ORIG_OUT" "$NEW_OUT" > /dev/null 2>&1; then
  echo "✅ 出力が一致しています"
else
  echo "❌ 出力に差異があります"
  diff "$ORIG_OUT" "$NEW_OUT" | head -30
fi
テストデータの種類目的
正常系データ(標準的な入力)基本動作の等価性確認
境界値データ(最大値・最小値・空値)エッジケースの動作確認
異常系データ(不正入力・NULL)エラー処理・ABEND パターンの確認
本番実績データのマスク版実業務に近い条件での等価性確認

回帰テストがない場合の代替アプローチ

既存のテストケースが存在しない場合は、以下の代替手段で等価性を担保します。

代替手段方法有効性
本番ログからテストデータを生成 過去の実行ログ・JES2/JES3 ログから入力データのパターンを抽出し、テストデータを作成する。 実業務パターンに近いため有効。個人情報のマスキングを忘れずに。
コードカバレッジツールとの併用 GnuCOBOL + gcov でカバレッジを取得し、未実行パスを特定して追加テストを作成する。 テストの網羅性を客観的に評価できる。
実行時トレース比較 PART 05 の COB_SET_TRACE を使い、元モジュールと再構成モジュールの実行トレースを比較する。 段落の実行順序・CALL パスが一致するか確認できる。

検証完了チェックリスト

  • ☐ 再コンパイルがエラーゼロで完了した
  • ☐ シンボル名(PROGRAM-ID・ENTRY)が元と一致した
  • ☐ 外部参照(U シンボル)の過不足がない
  • ☐ 正常系・境界値・異常系テストで出力が一致した
  • ☐ 終了コードが一致した
  • ☐ 実行時トレースの段落実行順序が一致した(任意)
  • ☐ コピーブックの参照が正しいことを確認した

次の章では…

PART 08 では「よくある落とし穴と対処法」を辞書形式でまとめます。作業中に詰まったときに参照してください。

→ PART 08 — よくある落とし穴と対処法へ