Skip to content

feat: NTF テストデータ YAML 実装(YamlTestDataParser TDD・トレーサビリティマトリクス145件)#75

Draft
kiyotis wants to merge 343 commits into
mainfrom
convert-testdata-excel-to-text
Draft

feat: NTF テストデータ YAML 実装(YamlTestDataParser TDD・トレーサビリティマトリクス145件)#75
kiyotis wants to merge 343 commits into
mainfrom
convert-testdata-excel-to-text

Conversation

@kiyotis
Copy link
Copy Markdown

@kiyotis kiyotis commented May 15, 2026

詳細は docs/pr75/steering.md を参照。

kiyotis and others added 30 commits May 21, 2026 20:01
- R-1 ユーザーレビュー NG 理由(ファットクラス設計)を記録
- 次の着手を R-1-refactor に変更
- 再開手順を TDD ベースのクラス分割手順に更新
- 不要になった詳細なレビュー指摘一覧を整理

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ベース)

- YamlLoader: YAML ロード・キャッシュ管理を分離
- YamlSection: セクションキー定数・共通ヘルパーを集約
- YamlTableDataBuilder: TableData / ListMap 構築ロジックを分離
- YamlFileBuilder: DataFile / Fragment 構築ロジックを分離
- YamlMessageBuilder: MessagePool / MockMessages 構築ロジックを分離
- YamlTestDataParser: 各ビルダーへの委譲のみ(188行)に書き換え
- 各ビルダーの単体テスト 30件・既存 37件 計67テスト全グリーン

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- QA-1: YamlFileBuilder.buildFragmentsCore を public → package-private に変更
- QA-2: YamlFileBuilderTest にディレクティブ検証テスト追加(createLayout().getDirective() で確認)
- QA-3: YamlMessageBuilderTest に requestId 設定検証テスト追加(getRequestId() で確認)
- QA-4: YamlMessageBuilderTest に fwHeaderfields カスタム設定テスト追加(customFwHeaderData.yaml 新規作成)
- QA-5: YamlLoaderTest に LRU キャッシュ上限超過テスト追加(lru1〜lru9.yaml 新規作成)

Tests run: 71(+4), Failures: 0, Errors: 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
QA観点1(意味のあるテスト):
- QA観点1-軽微1: buildMessageFile の skipFwHeader=true で FW_HEADER フラグメント除外を検証
- QA観点1-軽微2: buildSendSyncMessageList の directives が MockMessages に設定されることを検証

QA観点2(エッジケース網羅性):
- QA観点2-中1: dataTypeToSectionKey 不正DataType(SETUP_TABLE_DATA等)で IllegalArgumentException
- QA観点2-中2: LRU「最近アクセスしたエントリが追い出されない」テスト追加
- QA観点2-軽微1: YamlFileBuilder.buildMessageFile の id 不存在時 null 返却を直接テスト
- QA観点2-軽微2: buildFragmentsCore の record_type=null → "default" フォールバック検証
- QA観点2-軽微3: 可変長ファイルで length なし(setLengths 未呼び出し)の明示的検証
- QA観点2-軽微4: 同一テーブル名エントリが複数ある場合に全件取得できることを検証

Tests run: 79(+8), Failures: 0, Errors: 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Java観点1(ベストプラクティス準拠):
- Javadoc「パッケージプライベート」の誤記を修正(全5クラス)
- toStr/objectToString の使い分けをコメントで明確化(YamlSection)
- buildFragmentsCore のカプセル化改善: buildMockMessageFragments ラッパーを追加し
  YamlMessageBuilder が実装詳細に直接依存しないよう変更
- YamlLoader を try-with-resources に変更(FileInputStream)
- YamlTestDataParser の遅延初期化(if null)を削除し rebuildBuilders に一本化

Java観点2(既存コードスタイル統一):
- SnakeYAML LinkedHashMap でキー順序が保たれることをコメントで明示(YamlTableDataBuilder)
- テストコードの完全修飾型名を import に変更(YamlFileBuilderTest/YamlTableDataBuilderTest/YamlMessageBuilderTest)
- YamlFileBuilder.buildMessageFile の YamlSection.FIELD_ID を静的インポートに統一

Tests run: 79, Failures: 0, Errors: 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
SE観点1(設計の責務分離):
- buildFragments/buildMockMessageFragments の重複を解消: buildFragments を package-private に昇格して兼用
- applyDirectives の重複を解消: YamlSection の static メソッドに集約し両ビルダーから委譲
- toStr/objectToString の将来分岐意図をコメントで明記

SE観点2(システム全体の整合性):
- YamlTestDataParser にデフォルトコンストラクタを追加: rebuildBuilders() を初期呼び出しして NPE リスクを排除
- YamlLoader.clearCacheForTest に「テストコードからのみ呼ぶこと」注記を追加
- setTestDataReader の UnsupportedOperationException に DI 設定上の注意事項を明記

SE観点3(保守性・拡張性):
- YAML_CACHE_MAX_SIZE に既存キャッシュサイズとの一致を示す根拠コメント追加
- DEFAULT_RECORD_TYPE 定数を YamlSection に追加し YamlFileBuilder で使用
- fwHeaderFields の解決タイミング(コンストラクタ時点)をコメントで明記

Tests run: 79, Failures: 0, Errors: 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- YamlFileBuilder の private applyDirectives ラッパーを削除し YamlSection.applyDirectives を直接呼ぶように変更
- docs/checks/R-1-refactor.md を全レビュー対応完了状態に更新(QA/Java/SE全OK・ユーザーレビュー可)

Tests run: 79, Failures: 0, Errors: 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- [A-1] YamlLoader.load() の check-then-act を synchronized(YAML_CACHE) で保護
- [A-2] YamlTestDataParser のビルダーフィールドに volatile を付与
- [M-1] clearCacheForTest() Javadoc に「@after で必ず呼ぶこと・呼び忘れ時の影響」を明記
- [E-1] YamlTableDataBuilder: table キー未設定時にセクション名・ファイルパス付きの IllegalStateException
- [E-2] YamlFileBuilder: path キー未設定時にセクション名・グループID付きの IllegalStateException
- [E-3] YamlMessageBuilder.extractFwHeader(): rows のキャスト前に型チェックし sectionKey・id 付きの IllegalStateException
- [E-4] buildMessagePool / buildSendSyncMessageList の Javadoc に null 返却時の呼び出し元責任を明記
Tests: 82件全グリーン(既存79件 + 新規E-1/E-2/E-3テスト3件)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
既存の TableDataParser / DataFileParser / TestDataParsingTemplate / ListMapParser /
PoiXlsReader の static キャッシュはいずれも synchronized 不要(シングルスレッド前提)。
YamlLoader だけ synchronizedMap + synchronized ブロックにする根拠がなかったため差し戻す。
合わせて Collections.synchronizedMap ラップを除去し createLRUMap 直接利用に戻す。
YamlTestDataParser のビルダーフィールドへの volatile 付与も同様の理由で差し戻す。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- E-1: 例外メッセージにフィールド名 "table" が含まれることをアサートに追加
- E-2: 例外メッセージにフィールド名 "path" が含まれることをアサートに追加
- E-3 分岐D: FW_HEADER rows が空リストのとき例外なく空 fwHeader で返ることを検証するテストを追加

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
R-1-refactor の実装レビューで I-1 の仕様列挙が正常系のみであり異常系が抜けていた
ことが判明したため、Ph-1 やり直しタスク I-4 を追加する。
R-1-refactor のユーザーレビューは I-4 完了後に実施する順序に変更。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
YamlTestDataParser は BasicTestDataParser の代替実装であり、
異常系の振る舞いの基準は既存 Excel 実装にある。
YAML 新実装から異常系を列挙するのではなく、
既存実装・既存テストから仕様を読み取る方針に修正。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
既存 Excel 系実装(BasicTestDataParser/DataFileParser/TableData/DataFileFragment/
FixedLengthFile/VariableLengthFile/MessageParser/SendSyncMessageParser)および
YAML 実装の異常系テストを全件走査し、仕様IDとして登録。

追加仕様ID(14件):
- SS-21: セクション未存在・ID未存在時の空リスト返却
- SS-22: ディレクティブ/フィールド名行の列数不足(IllegalStateException)
- SS-23: DataFileFragment.setNames() null/空(IllegalArgumentException)
- SS-24: setTypes()/setLengths() サイズ不一致(IllegalArgumentException)
- SS-25: getIndexOf() 存在しないフィールド名(IllegalArgumentException)
- IV-16: 日付カラム変換失敗(RuntimeException)/ null 返却
- DR-11: field-separator 2文字以上(IllegalArgumentException)
- MS-14: getFwHeader() 呼び出し禁止(UnsupportedOperationException)
- MS-15: メッセージ未存在時の null 返却
- RS-09: table キー欠如(IllegalStateException)
- RS-10: path キー欠如(IllegalStateException)
- RS-11: FW_HEADER rows 型誤り(IllegalStateException)
- RS-12: FW_HEADER rows 空リスト → 空 fwHeader 返却
- RS-13: 非 messaging DataType → IllegalArgumentException

R-1-refactor で追加した全テストを仕様IDに対応づけ完了。
DR-02/DR-03 の根拠コードに DataFile.java:294-299 を補記。
除外3件(getClone/clob2String/checkSize)の理由を I-4.md に明記。

総仕様ID数: 80件 → 94件

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
以下の問題点に対応:
- 「走査した」という自己申告ではなく grep 結果の行数一致を客観的根拠とする手順を追加
- 正常系・異常系・代替フロー・通常到達不能パスの4種分類を作業手順に明記
- 継承ツリーの全サブクラスを grep 対象に含める手順を追加
- セルフチェックで「grep 結果行数 = 登録件数 + 除外件数」の数値確認を必須化

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
【変更内容】
- steering.md: I-1 タスク定義を正常系・異常系・代替フローの3観点抽出と
  grep 証跡による網羅確認を含む完全版に書き直し。I-4 タスクを廃止(I-1 に吸収)。
  「現在の状態」セクションのノイズ(完了詳細・進捗テーブル)を削除し
  次タスクと環境情報だけを残す形に整理
- ntf-impl-spec-list.md: I-4 での追加分(94件)を取り消し、やり直し前(80件)に戻す
- ntf-impl-spec-list-i4-draft.md: 前回試作した異常系追加版を差分確認用として退避
- checks/I-4.md: 削除(不完全なため)
- checks/I-4-draft.md: 前回の不完全チェックファイルを参照用として退避
- checks/I-1〜3.md: 旧版(正常系のみ)であることを注記として追加

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- throw 25行・return null/empty 15行の全行走査を証跡テーブルに記録
- YAML クラスの return null/empty 10行を漏れなく追加(5行登録・5行除外)
- SS-26(DataFile:298)→DR-11 / SS-30(VariableLengthFile:76)→DR-12 の二重登録を解消し SS を詰め直し
- サマリー表の SS 正常系18件・異常系12件・DR 正常系7件・異常系合計24件に修正
- I-1.md の完了条件行の数値を「throw 25行 = 登録23行 + 除外2行」に統一
- I-1.md QA レビューセクションに初回 NG 5件の対応内容と最終 OK 判定を記入

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
I-1.md と ntf-impl-spec-list.md の横並びチェックを実施し、
QA NG 対応時に ntf-impl-spec-list.md のみ更新して I-1.md に
反映し忘れていた不整合を全件修正。

- I-1.md の仕様ID件数を 108件 → 109件に修正(本文・完了条件表)
- I-1.md の throw テーブルの仕様ID表記を ntf-impl-spec-list.md と一致させる
  (SS-32→SS-30, SS-31→SS-29, SS-28→SS-27, SS-29→SS-28, SS-27→SS-26)
- I-1.md の return null/empty テーブルを 5行→15行に拡張(YAML クラス10行を追加)
- I-1.md の数値確認表を return null/empty 15行=登録8行+除外7行 に更新
- I-1.md の完了条件行の return null/empty 件数を 5行→15行 に修正

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- checks/I-4-draft.md: 前回セッションの不完全なドラフト
- checks/I-2.md: I-1 旧版(80件)ベースの旧版
- checks/I-3.md: 同上
- ntf-impl-spec-list-i4-draft.md: I-1 やり直し前の試作版

いずれも I-1 やり直し版完成により参照価値がなくなったため削除。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 削除したドラフトファイルへの参照を除去
- 現在の状態を「I-1 完成・ユーザーレビュー待ち」に更新
- 再開手順を現状に合わせて整理

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ntf-impl-spec-list.md に TS カテゴリを新設し 32件を追加(109件→141件)
  - AbstractHttpRequestTestTemplate / TestCaseInfo / StandaloneTestSupportTemplate
    / TestShot / BatchRequestTestSupport / EntityTestSupport / DbAccessTestSupport
    の全ソースを走査し、予約ID・必須/オプションカラム・異常系・代替フローを網羅
- ntf-spec.md 1.1 を「テストケース・セットアップ・期待値」の3種構造に改訂
- ntf-spec.md 付録の仕様ID索引に TS-01〜32 を追加

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
kiyotis and others added 30 commits May 28, 2026 18:13
- 7クラスに合計34件のテストを追加(171テスト中のconverterパッケージ対象144テスト全グリーン)
- mockStatic(Files.class) でfindXlsFiles/findYamlDirs/YamlFormatWriter の IOException catch をカバー
- mockConstruction(FileOutputStream.class) で XlsFormatWriter 書き込み失敗をカバー
- SecurityManager で main() → System.exit() 呼び出しを検証
- リフレクション+chmod でdeleteSource/deleteDirectory のdelete()失敗警告をカバー
- 到達不可な防御ガード10件(JaCoCo制約・型システム制約・readCells事前処理等)をC-1.mdに理由付きで記録

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
新サブクラス追加時にコンパイルエラーで気づけるようにした。
XlsFormatWriter.writeBlock()の到達不可なreturn rowNumを削除し、
最終分岐をelse節に変更してコンパイラが網羅性を保証する形にした。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sealed class化でガード自体が不要になったため記録から除去。
件数を10件→9件に更新。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- YamlFormatWriter.sectionKey() / YamlFormatReader.sectionKeyToDataType() の
  IllegalArgumentException を AssertionError("UNREACHABLE:") に変更
  (呼び出し元の引数不正ではなくプログラムバグを示すため)
- XlsFormatReader.readCells() の末尾空セル除去ロジックを削除し
  trimTrailingEmpty() に一本化(重複実装の解消)
- YamlFormatReaderTest にファイルパス渡し・権限なしディレクトリのテストを追加

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- trimTrailingEmpty重複除去: readCells()一本化で解消済みのため削除
- IllegalArgumentException→AssertionError("UNREACHABLE:")変更を反映
- listFiles()==null: setReadable(false)でテスト追加・確認済みに更新
- 件数9→8件、テスト数144→146件に更新

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
mvn exec:java での実行を前提とするため System.exit() は不要(Maven JVM ごと
終了させてしまう副作用がある)。main() を run() の単純な委譲に変更し、
SecurityManager を使った複雑なテストをYAMLファイル出力確認に置き換えた。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
DataType.DEFAULT は設計書スコープ外だが、来た場合に黙って飛ばすより
即座に爆発させる方が安全。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
JaCoCo + Mockito mockStatic の干渉で catch ブロックが記録されなかった問題を
書き込み権限なしディレクトリへの実際の書き込みで再現するテストに置き換えた。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ッジを解消

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ntf-testdata-yaml-schema.json を docs/pr75/ から src/main/resources/nablarch/test/ に移動(JARに同梱)
- $id を絶対URIに修正
- networknt/json-schema-validator 3.0.2 を test スコープで追加
- YamlSchemaValidationTest: テストデータYAML8ファイルがスキーマに適合することを検証

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
スキーマ全項目を網羅した schemaFullCoverage.yaml を作成し、実装が正しく
解釈できることを testSchemaFullCoverage で検証した。

- schemaFullCoverage.yaml: 11トップレベルキー・directives全17項目・
  length="-"・group_message_data SingleData形式(group_id なし)を網羅
- YamlTestDataParserTest#testSchemaFullCoverage: 全トップレベルキーの
  読み込みと件数アサートを追加(38テスト全グリーン)
- ntf-impl-spec-list.md: スキーマ項目マッピング列を全145件に追加
- docs/pr75/ntf-testdata-yaml-schema.json: 旧置き場ファイルを削除
  (正式版は src/main/resources/nablarch/test/ に移行済み)
- steering.md: 成果物一覧のスキーマパスを src/main/resources/ に更新

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- testSchemaFullCoverage Javadoc: DataFile#setDirective()の無効キー拒否
  動作(DR-11)を根拠としてdirectives全キー検証が担保される旨を明示
- SingleData経路(group_id なし)の response_header/body_messages エントリを
  getMessageWithoutCache でアサート追加

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
testSchemaFullCoverage が意図的に1メソッドに集約されている理由
(スキーマ全項目一括確認の統合煙突テスト)をJavadocに明示

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- schemaFullCoverage.yaml: expected_request_header_messages に directives を追加
  (message_data の directives フィールドを全セクションで網羅)
- testSchemaFullCoverage: setup_files の件数コメントに grpFixed 除外根拠を明記

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
S-6 の完了プロセス(担当者・QA・Java・SWE 全レビュー完了)を記録。
steering.md の S-6 タスクを完了状態に更新してユーザーレビュー依頼。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
設計書の FieldDef.length は String 型(リテラル保持)で、YamlFormatWriter は
length を文字列クォートありで出力(例: length: "10")する設計。
スキーマの anyOf を integer のみから integer | 数字文字列 に拡張して整合させた。

- ntf-testdata-yaml-schema.json: field_def.length の anyOf を
  integer(min:1) | string(pattern:"^([1-9][0-9]*|-)$") に変更
- ntf-testdata-doc.md: length は整数・文字列どちらでも有効な旨の注記を追加

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
S-6 ユーザーレビュー OK(2026-05-29)を記録。
次着手タスクを V-1 に更新し、S-6 詳細セクションを削除。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
他の TestDataInterpreter 実装(NullInterpreter/DateTimeInterpreter 等)と同様に、
null を渡さない責任は呼び出し側が持つ設計方針に統一する。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant