再コンパイルして差異がないか確認する
再構成したソースコードを再コンパイルし、エラーゼロで通ることをまず確認します。
# コンパイル(-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点です。
入出力比較テストによる等価性の担保
同じ入力データを元モジュールと再構成モジュールの両方に与え、出力が一致することを確認します。
#!/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 シンボル)の過不足がない
- ☐ 正常系・境界値・異常系テストで出力が一致した
- ☐ 終了コードが一致した
- ☐ 実行時トレースの段落実行順序が一致した(任意)
- ☐ コピーブックの参照が正しいことを確認した