Excel形式以外(YAML形式)のテストデータを読み込めるようにする - #75
Draft
kiyotis wants to merge 110 commits into
Draft
Conversation
kiyotis
force-pushed
the
convert-testdata-excel-to-text
branch
2 times, most recently
from
June 16, 2026 06:47
7efc1ed to
2818ffb
Compare
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
kiyotis
force-pushed
the
convert-testdata-excel-to-text
branch
from
June 23, 2026 08:26
d5bd33f to
d799c0a
Compare
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
設計書・NTF解説書・仕様リストの不整合を実装コードを正として修正。 設計書 (testdata-converter-design.md): - TestDataFormatReader#read シグネチャを read(basePath, resourceName) に修正 - ConverterMojo を FormatHandler/ConversionRequest 等の実際の構成に差し替え - TestCoreReaderAdapter の追加メソッド (readSendSyncMessages/readHeaders/readBlockBodyLines) を追記 - YamlTestCoreAdapter に isResourceExisting を追記 - TestDataBlock のフィールド (dataType/groupId/identifier) をクラス図に追記 - FileDataBlock の FileType enum をクラス図に追記 - YamlTestDataValidator/ValidationError を OUT 節に追記 - 重複していた「依存の向き」ブロックを削除 NTF解説書 examples: - ntf-testdata-doc-examples-messaging.md: directives: を records: 内から エントリ直下(records: と同階層)へ移動、record_type を DEFAULT → default に統一 - ntf-testdata-doc-examples-file.md 6.2節: type を英字記号 (X/N/Z) から 日本語型名称 (半角/全角/数値) に修正 仕様リスト (ntf-impl-spec-list.md): - テストメソッド名の test プレフィックスを全件除去(実装は test プレフィックスなし) - RS-20 テストメソッド名: noFwHeader → noFwHeaderFragment に修正 - RS-12/RS-20 実装マッピング: extractFwHeader → convertFwHeader に修正 - SS-22: 未実装テストを — に修正 - SS-05: テストクラスを YamlTableDataBuilderTest → YamlTestDataParserTest に修正 - MS-01/MS-04: テストメソッドのプレースホルダーを実際のメソッド名に修正 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>
送信同期メッセージ(要求/応答電文 4 種)の判定ロジックを DataType enum の インスタンスメソッドとして集約した。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This reverts commit 6c415f6.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This was referenced Jun 25, 2026
nablarch-testing-yaml 側でテストメソッド名の仕様ID依存を除去したため、 仕様一覧の参照をリネーム後のメソッド名(10件)に合わせる。 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>
…g.mdを新規作成 解説書チームからの4事象判定依頼のうち、不具合と判定した事象3、および 対応可と判定した事象4のYAML対応をTDDで進めるための計画を記録。 実装はまだ未着手。
期待値0件のテーブル検証が必ずPASSする事象について、ユーザーとの議論で 到達した対応方針を docs/pr75/docs/ntf-empty-table-assertion.md に整理した。 後方互換影響があるため steering.md とは別文書とし、steering への起票は ユーザーの合意後に行う。 要点: - 仕様のあるべき姿は「0件のテーブルブロックにカラム名は不要」で形式統一 - 層の異なる2問題に分離 - 問題1(形式共通): TableData#loadData がカラム名0件だとDBを読まない - 問題2(表形式リーダ): 識別子行をカラム名行として無条件に消費する - 問題2はエラー化ではなく識別子行を消費しない方針(判別可能なため) - 判定は TYPE= / TYPE[...]= の書式に限定する(getDataType の前方一致を 流用すると MESSAGE_ID 等のカラム名を持つテーブルを壊す) 本書の事実はすべて実物のソースで確認し、出典を行番号付きで記載した。 未確認事項は9章に明記した。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- 既存 xls 全件走査(59ファイル・242シート・識別子行324箇所)で、問題1の修正が 影響する既存データが0件であることを確認 - マーカーカラム行1行で0件テーブルが正しく読めることを本体パーサで実測 - 解説書に記述が無いとした §9 の記載が誤りだったため訂正(testdata_notation.rst:802 に明記あり) - 再開後に議論する2点を State に記録 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…リセット Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
user 判断(2026-08-26)。§6 の4観点(A 充足/B 整合/C 規約/D 検証の妥当性)は rn 既定レビュー(QA / Design / Craft / Verification)とは別物であり、既定レビューの 実施をもって §6 を満たしたとしない。4観点はそれぞれ別のサブエージェントで回す。 理由: - 既定の4軸に観点B(解説書との一致・呼び出し元・後方互換)に相当する軸がない - 既定の QA は完了条件ごとの gate であり、完了条件そのものが誤っていれば素通りする Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
レビュー指摘 must-1 の是正。setup/common.rst の表は259行のうち非空白46行を覆っ ておらず、setup/index.rst がラベル・見出しを起票しているのに common.rst は起票 していないという不統一もあった。 表の「行」欄が 1..259(index.rst は 1..21)の分割になるよう、参照ラベル3件・見 出し11組・`.. contents::`・ディレクティブ宣言行・`.. code-block::` 宣言行・コー ド例中のXMLコメント・`nablarch-testing-yaml` の dependency ブロック・設定例 `nablarch.test.resource-root=path/to/test-data-dir` を起票し、空行は対象外リスト に列挙した。 機械的に再現できるよう、表と対象外リストから行レンジを集めて 1..N の被覆を検算 するスクリプトを組み、実行コマンドと出力を「行の網羅の検算」節に記録した。複数 箇所にまたがる横断行「:176 と :252 の組み合わせ」は行番号が :174-185・:249-255 に含まれるため、1つ目のセルを括弧書きにして分割の対象外と分かるようにした。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
レビュー指摘 must-6 の是正。解説書 40b9c52:setup/request_unit_test/rest.rst:30-33 が「テスティングフレームワークのデフォルト設定」として名指ししている nablarch-testing-default-configuration を実物で確認したところ、 nablarch/test/test-data.config が nablarch.test.resource-root=src/test/java を持ち、 nablarch/test/test-data.xml が testDataParser を BasicTestDataParser + PoiXlsReader として定義していた。 したがって :89「デフォルトでは src/test/java 配下から読み込まれる」は解説書側の誤り ではない。TestSupport.java:30 の test/java/ はデフォルト設定を入れない場合のフォール バックである。「不一致の詳細 :89」を「取り下げた不一致候補 :89」に改め、いったん不一致 と判定した理由・取り下げた理由・再実行した実測を残した。 :39 の根拠「ブランクプロジェクト側の設定が決める」と :166 の根拠「本モジュールに同梱 されていない」も、決めているのがこのモジュールであることを見落としていたため差し替えた。 3行を「一致」で確定させるには、このモジュールを突合の参照点として認めることになる。 §2 のピンに加えるかどうかは user の判断なので判定保留とし、表の直前に「保留中の論点 — デフォルト設定モジュールの扱い」節を置いて、実測コマンドと出力・保留の理由を記録した。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
レビュー指摘 must-2 の是正。前回この行を不一致と判定した根拠
`[G] Quotation+Null("\"null\"") -> null` は偽の根拠だった。
`System.out.println("... -> " + v)` は v が Java の null でも長さ4の文字列 null でも
同じ null と表示するため、両者を区別できていなかった。
判別できる出力に組み直して測り直した結果、解説書の順序では Java の null にならない。
3c4bd2a:InterpretationContext.java:81-93 の invokeNext は interpreters.remove() で、
interpreters は LinkedList(同 :5,31,51)なので FIFO である。解説書の順序
(:176 NullInterpreter → :177 QuotationTrimmer → :178-184 CompositeInterpreter)では
NullInterpreter が先に引用符付きの "null"(長さ6)を見て不一致となり、その後
QuotationTrimmer が引用符を外す。結果は長さ4の文字列 null である。
あわせて :81 の .. important:: は「テストデータの形式をYAMLに変更する」節(見出し
:37-38、範囲は次の見出し :87-88 の手前まで)の中にあり、主語は直前 :77 の
yamlInterpreters であって、別節(見出し :164-165)の messagingTestInterpreters には
及ばない。:170 は解釈クラスが Excel 形式と YAML 形式で共通であると意図的に述べている。
「不一致の詳細 :176/:252」を「取り下げた不一致候補 :176/:252」に改め、いったん不一致
と判定した理由・取り下げた理由・取り下げの根拠(file:line + SHA + 実行結果)を残した。
:81 の根拠からも偽の出力を外し、旧 [G] の3行は「動かして確かめた内容」から取り下げた。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
レビュー指摘 must-3 の是正。解説書 40b9c52:setup/common.rst:225 の反例を自分で再現した。 POI で RB11AC0200.xls(セルの値 FROM_DOT_XLS_FILE)と RB11AC0200.xlsx(値 FROM_DOT_XLSX_FILE)を同じベースディレクトリに作り、fileExtensions.sendSyncTestData=xlsx を設定して SendSyncSupport#getResponseMessageByRequestId を呼ぶと、存在チェック (FilePathSetting#getFileIfExists)は .xlsx を解決するのに、実際に読まれた中身は .xls の ものだった。.xlsx だけを置いた場合は .xlsx が読まれる。 経路も自分で追った。SendSyncSupport.java:346,347,348,473,478 → BasicTestDataParser.java:99-101 → TestDataParsingTemplate.java:131,141 → PoiXlsReader.java:48,62-65。実際に開くファイルを決めているのは 3c4bd2a:PoiXlsReader.java:62-65 で、ここは fileExtensions を参照せず .xls を先に試して 無ければ .xlsx を使う。fileExtensions が効くのは getFileIfExists の存在チェックまでである。 判定は「不一致(解説書が正=実装側の誤りの疑い)」とした。実装は FilePathSetting が解決 した File を SendSyncSupport.java:348 で受け取っていながら読み込みの段で使わず、設定値の 意味を途中で捨てている。ただし食い違いが表に出るのは同じリクエストIDで .xls と .xlsx を 両方置いたときだけで、同じ文の「リクエストIDごとに1つのファイルを置く」に従う利用者は 踏まない点も記録した。処置は報告のみで、実装は直さない(user 判断 2026-08-26)。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
「動かして確かめた内容」を今回の是正で実行した検証に差し替えた。追加したのは 解釈クラスの適用順 [I]、.xls と .xlsx の優先順 [X]、重複テストデータの先勝ち [F] と その変異 [F-mut]、既存テストの検知力を変異で測った [M-A][M-B]、システムプロパティが 効く条件 [P]、fixedDate の検証範囲とコンポーネント名 [T][N]、Excel ブックのキャッシュ バイパス [C]、interpreters の適用 [R]。検証コードはすべて scratchpad の fix1/ 配下に 自分で組んだもので、src/main・src/test・解説書は変更していない。 取り下げたものも明記した。旧 [G] は println が Java の null と文字列 null を区別でき ないことによる偽の根拠、旧 [H] は [T] に置き換え、旧 [T](mvn test が24件緑)は「緑で あること」を根拠にしていたため変異で落ちることの実測 [M-A][M-B] に差し替えた。 あわせて「ピン外の引用と、その版」節を新設した。指示書 §3 が求める「事実には file:line と参照コミットハッシュを添える」に従い、nablarch-core は解決された実体の jar 名と md5 (6-NEXT-SNAPSHOT はタイムスタンプ違いの実体が同居するため SNAPSHOT とだけ書かない)、 nablarch-testing-yaml はコミットハッシュ 05ada91、 nablarch-testing-default-configuration と nablarch-common-idgenerator-jdbc は タイムスタンプ付き jar 名と md5 を記録した。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
レビュー指摘 must-4 の是正。指示書 §3 は「既存のテストが緑であることを、変更が正しい 根拠にしない」としている。:103 の根拠に置いていた TestSupportTest(24件緑)は、 TestSupport#getPathResourceExisting を last-match-wins に変異させても24件全緑であり ([M-A] で実測)、候補が1件しかヒットしないため first/last を区別していなかった。 代わりに重複ケースを自分で作って実測した。同名の DupProbe.xls を dupA/nablarch/test/dupprobe/ と dupB/nablarch/test/dupprobe/ の両方に実在させ、 nablarch.test.resource-root=dupA;dupB で TestSupport#getListMap を呼ぶと dupA 側の値が 返り、dupB;dupA に入れ替えると dupB 側の値が返る。同じ実測を last-match-wins に変異 させた実装で実行すると dupB を返して落ちることも確かめ、負のテストとして記録した。 :95-99(; 区切り)は既存テストに検知力があることを確認できたので緑を根拠にしてよいが、 PATH_SEPARATOR を "," に変異させると testGetTestDataPaths と testGetPathOf の2件が落ちる ことの実測 [M-B] を根拠に添えた。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
レビュー指摘 must-5 の是正。3c4bd2a:FixedSystemTimeProvider.java:42-53 が見ているのは 桁数(14/17)だけで、日付としての妥当性は検証していない。:62-64 の new SimpleDateFormat(format).parse(...) は lenient のままである。 実行して裏を取った。isLenient() は true で、"20101332123456"(13月32日)は例外にならず 2011-02-01 12:34:56.000 に、"20100914993456"(99時)は 2010-09-18 03:34:56.000 に、 "99999999999999" は 10007-06-11 04:40:39.000 になる。13桁・15桁だけが IllegalArgumentException になる。 判定は一致のまま据え置いた。解説書 :122 は利用者への指示文であり、記述基準「利用者が 正しく書こうとしても踏むものだけを書く/間違えたときにどうなるかは書かない」に照らして 正しい。 第2文「アプリケーションが SystemTimeProvider を通じて取得する日時が固定される」が成り立つ 前提はコンポーネント名が systemTimeProvider であることなので、:117 の name="systemTimeProvider" を起票し、nablarch-core の SystemTimeUtil.java:26,109 がその 固定名で引くことを根拠に添えた(名前を fixedSystemTimeProvider にすると IllegalArgumentException になることを実測)。 同ファイルの Javadoc :35-36 が「12桁」「15桁」と書いており実装とも解説書とも食い違うが、 src/main のため変更せず、表の備考に事実として記録するだけにした。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
レビュー指摘 should の是正。結論は変えず、根拠だけを差し替えた。 - :20-29 「JUnit を compile スコープで持つため利用側は test スコープで足りる」は 「test スコープで追加する」の根拠になっていない。座標(pom.xml:7-8)と、本モジュールの src/main/java 187件のうち179件が nablarch/test/ 配下で、残る8件も nablarch/fw/web の モックと単体テスト用の内蔵サーバ(HttpServer.java:41)であることに差し替え、 <scope>test</scope> と書く指示自体は利用側の pom.xml が決めるため一部対象外にした - :107 「読むだけ」で一致としていたので動かして確かめた。target/test-classes を載せて リポジトリ初期化が成功する構成では -D が環境設定ファイルを上書きし、外すと初期化が 失敗して TestEventDispatcher.java:68-74 が握りつぶすため -D が効かず実装既定値が返る。 この条件差も記録した - :191 「classpath: は設定時に URL 解決される」は主張と無関係だった。 FilePathSetting#addBasePathSetting の FileUtil.getResourceURL(path) はスキームに関係なく 無条件に呼ばれるからである。実際の鍵である BasicTestDataParser#getMessageWithoutCache の agent.parse(..., false) → TestDataParsingTemplate.java:136-141 → PoiXlsReader の useCache バイパス(static bookCache のバイパス)まで追い、同じ JVM で書き換えて読み直せることを実測して置いた - :170 「解説書の両ブロックがともに messagingTestInterpreters を参照している」は解説書の 主張を解説書で裏づける循環根拠。Excel 側と YAML 側の両経路で interpreters が実際に 適用されることの実装根拠と実測に差し替えた - :71-75 根拠が親クラスだけだったので、子 YamlTestDataParser がセッターをオーバーライド して super を呼ぶこと(05ada91:YamlTestDataParser.java:78-82,86-90)を確かめて添えた - :126 根拠の母集合が src/main だけで狭かったので、pom.xml:98-102 の provided スコープ (利用者へ推移しない)と、デフォルト設定モジュールにも採番関連が皆無であることを加えた。 判定理由は「どちらの側が誤っていると考えるか」だけに絞った - コードブロック内トークンを起票した。autowireType="None"(:199・:235)、 name="filePathSetting"(:198・:234。FilePathSetting.getInstance() が引く固定キー)、 name="systemTimeProvider"(:117)、ref="dbInfo"(:73)、ref="systemTimeProvider"(:59)、 ref="dbTransactionManager"(:153) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
冒頭の宣言は `解説書:<path>:<行>` と `<path>:<行>` の2形式しか定めていな かったが、本文では Java クラスを basename で書き、解説書の行を `` `40b9c52`:`setup/common.rst:89` `` という第3の形式や、モジュール側と同 じ `setup/common.rst:149` の形式で書いていた。`git cat-file -e 3c4bd2a:TestSupport.java` は失敗するため、宣言のとおりには解決できない。 宣言を実態に合わせて3形式(解説書/モジュール/ピン外)にし、モジュール側 の `<path>` に Java クラスの basename を含めてよいことを明記した。あわせて 第3形式4箇所と、ディレクトリを落とした `testdata_notation.rst:882` 1箇所を 宣言した形式に直した。解説書の行は `解説書:` の接頭辞で見分けられる。
3節で表記が割れていた。集計の数え方は about が「対象 12件(うち一部対象外 を含む行1件)」、common が「対象 26+一部対象外 3=29」で包含規則が逆であ り、単位も「件」と「行」が混在していた。「実装での成否」列は指示書の定義が 2値なのに実測7種、「処置」列は「なし」と「報告のみ」が混在、太字の有無も行 によって割れていた。 何を1件と数えるか(表の行)、一部対象外を対象に含めるか(含める)、各列に置 いてよい値、処置列を全行同値にする理由、太字を使わないこと、非連続行の書き 方、ページ列を節見出しで代替していることを1箇所に定義した。あわせて Java クラスの basename が本記録の引用範囲で一意に定まることを実測で示した (`src/main/java` 全体では FileUtil.java と package-info.java が重複するが、 本記録は引用していない)。各節の集計行と列の値は後続のコミットで揃える。
3節のうち about だけが粒度の揃わない13行の表で、参照ラベル・見出し・ディレ クティブ宣言行・空行を表に持たず、行の網羅の検算もなかった。1..112 のうち表 と対象外リストが覆っていた行は一部にとどまり、他の2節(setup/index・ setup/common)とそろっていなかった。 setup/index・setup/common と同じ行レベルの分割にし、39行の表で 1..112 を隙 間なく1回ずつ覆うようにした。あわせて、対象外リストにだけあって表の行と対応 しなかった `:87`(RESTfulウェブサービス)を `:83-92` の一部対象外として表に 対応づけ、同じ構造の `:77`(取引単体テストのRESTful部分)と `:112`(JUnit 5 用拡張機能への参照)にも同じ値を付けた。`:32・:112` の非連続表記は行レベル分 割で解消した。判定は :14 以下すべて是正前と同じ(`:38-44`・`:54`・`:81`・ `:112` は他行と同一の事実のため集約とし、二重に数えない)。
setup/common.rst の :13 は「採番置換だけは本モジュールに実装がない」と書きな がら判定を一致にし、同じ帰属の主張を :126 が不一致(解説書側の誤りの疑い)と 判定していた。同じ事実に相反する2つの判定が付いていた。 また、横断行「(:176 と :252 の組み合わせ)」の :176 は :174-185 に、:252 は :249-255 に含まれるため、この行を1件として数えると2行が対象・一致の両方で二 重に数えられていた(`<scratchpad>/fix2/dup_check.py` で確認)。旧 `fix1/verify_lines.py` はこの行を分割対象外として読み飛ばしていたので、出力 は64行の表でも「表 63 / 重複: なし」となり、二重計上が見えなかった。 :13 の判定は :126 に集約し(判定欄を「(:126 に集約)」とした)、横断行は削除 して判定を :249-255 に畳んだ。判定は一致のまま変えていない。あわせて3節の 列の値を定義(成否4値・判定6値・処置は全行同値・太字なし)に揃え、集計行を 定義した書式で数え直した。`fix2/verify_lines.py` は1つ目のセルが `:N` / `:N-M` でないデータ行をエラーにするため、同じ隠れ方はもうしない。
「ローカル ~/.m2 の全 jar を走査して FastTableIdGenerator.class を含むのはこ の artifactId の jar のみ」とだけ書いており、実際に何件ヒットしたかを示して いなかった。再走査すると5件ヒットする(1.0.1・2.0.0・2.0.1・ 6-NEXT-20260327.004352-2・6-NEXT-SNAPSHOT)。 走査スクリプトを `<scratchpad>/fix2/scan_idgen.sh` に置き、ヒットした5件を 「不一致の詳細 :126」に出力ごと載せ、表の `:128-154` 行の記述もそれに合わせ た。判定(不一致(解説書側の誤りの疑い))は変わらない。
「ピン外の引用と、その版」節は手で作った表であり、漏れがないことを確かめる手 段が記録に無かった。また FilePathSetting.java の引用行として `:27` を挙げて いたが、`:27` を引いていた根拠(`classpath:` は設定時に URL 解決される)は b48b6d0 で取り下げており、本文のどこからも引いていなかった。 `<scratchpad>/fix2/offpin_cites.sh` で全 `file:line` 引用(延べ113件)を抽出 し、basename を 3c4bd2a と 40b9c52 のツリーに照合して、ピン内で解決できない ものが版の表に載っているかを判定するようにした。結果はピン外4パス( FilePathSetting.java・SystemTimeUtil.java・YamlTestDataParser.java の2形式) がいずれも版あり、「ピン外(版なし)」0件である。あわせて本文で引いていない `:27` を表から外した。
証拠ラベルが `[1][2][3]` の数字系と `[A]`〜`[X]` の英字系に割れており、どのラ ベルがどの行から参照されているかを確かめる手段が記録に無かった。 数字系を `[E-1][E-2][E-3]` に改めて `[<英字1文字>]` または `[<英字1文字>-<連番/枝番>]` の1体系にそろえ、「動かして確かめた内容」の冒頭 に、ラベル・測った内容・検証コード・参照元(表の行または詳細節)の対応表を置 いた。`<scratchpad>/fix2/evidence_refs.py` で、定義側と参照側を突き合わせて孤 立ラベルが0件であることを機械的に確かめた(取り下げ済みの `[G]`・旧 `[H]` は 証拠として使っていないので除く)。
同じものを「本モジュール」「テスティングフレームワーク」「`nablarch-testing`」 で呼び分けており、「テストデータを解析するコンポーネント」「テストデータ解析 コンポーネント」「解析コンポーネント」も混在していた。 対象モジュールは `nablarch-testing` に統一し(「本モジュール」9箇所を置換、 §2 のピンの表の行名は「対象モジュール」に改めた)、「テスティングフレーム ワーク」は解説書側の呼び名として表の「記述の要旨」列と逐語引用にだけ残した。 解析コンポーネントは「テストデータ解析コンポーネント」に統一した。この規則は 「表の書き方と数え方」に1行で書いた。
観点C のレビューは指示書 §4-2 の列定義そのものに3件の指摘を出した。指示書を 変える提案であり実装担当の判断では動かさないため、作業記録の末尾に記録だけ 残す。各件は是正後の HEAD の3節(表の行105)を `<scratchpad>/fix2/col_stats.py` で数えた実測を添えた。 - 処置列: 105行すべてが同値で情報量がゼロ。是正前は「なし」75/「報告のみ…」 5 に割れていた - 判定列: 105行のうち98行は「実装での成否」列から一意に決まる。別の情報を持 つのは不一致2行の「向き」だけ - 対象/対象外列: 理由を表外の箇条書きに出しており、41項目が表の72行と二重記 載。1記述の中で対象と対象外が混じる行を表せないため `一部対象外` を自前で 導入している(13行) あわせて basename の検算スクリプトが、この節自身の記述(重複の例としてクラス 名を挙げているだけ)を引用と誤検知していたので除外した。
対象外リストの項目と表の行の対応が取れていなかった。about は `:87` がリスト にだけあり、表の行(`:86-91`)は「対象」だった。common はリストが `:158・ :160` と書く一方で表の行は `:156-160` で粒度が合わず、`:39` は一部対象外なの に除いた部分の理由がリストに無かった。`:107` はシステムプロパティ機構そのも のが対象外なのに「対象」で、同じ構造の `:71-75`・`:77`・`:249-255` と値が違っ ていた。 `:107` を一部対象外に、`:39` は除外部分ではなくピンの扱いが未決なだけなので `:89`・`:166` と同じ「対象/判定保留」にそろえた。リストの粒度を表の行に合わ せ(`:158・:160` を `:156-160` に)、about は行レベル分割で `:77`・`:83-92`・ `:112` を一部対象外にしてリスト項目と対応づけた。対応が取れていることは `<scratchpad>/fix2/list_vs_table.py` で双方向に検算し、対応しない項目0件を確 認した。判定はいずれも変えていない。
直前のコミットで setup/common.rst の :39 を一部対象外から対象に直したため、 指摘3に書いた件数が古くなっていた。対象外リストの項目数(空行の項目を除く) と一部対象外の行数を数え直し、34項目/対象外59行・一部対象外12行に改めた。
突合済みは38ページ中3ページ(about/index.rst・setup/index.rst・setup/common.rst)。 §6 レビューはラウンド1の4観点すべてと、ラウンド2の1観点(範囲)が完了。 是正ラウンドは2回実施済み(上限3回)。 user 判断待ちが7件あり、うち3件(ピンへの nablarch-testing-default-configuration 追加/全件表への行網羅の検算の要求/ピン外依存の版の固定)は残り35ページの 進め方を決めるため、判断が出るまで #30 の続きに着手しない。 新規タスク #34 は、ラウンド2観点(範囲)が挙げた must 3件の是正。 是正ラウンドの最後の1回にあたる。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ae989ec..e31fb6f の28コミットを全件 revert し、ae989ec の内容へ戻す。 指示書 .rn/step4-01-nablarch-testing.md の立て方が誤っていたため取り消す。 「解説書と実装を読み比べて不一致を洗い出す」形にしていたが、正しくは 「解説書に書いてあることをテストで押さえる」形であり、読み比べの成果物は使わない。 2470e6e で追加した特性テストも本コミットで戻すが、論点4 の決着そのものは user 判断済みで有効であり、新しい指示の中で扱い直す。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…30 — 到達不能2行に理由コメントを入れる
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概要
NTF のテストデータ読み込み機構を、Excel 形式以外(YAML 形式)のテストデータでも動くようにする。あわせて、対応の過程で判明した本体側の3つの不整合を解消する。
いずれも Excel 形式の既存動作は変えない方針で実装し、既存テストの非破壊を負のコントロール(変異注入)で確認している。
変更内容
ソースコード(
src/main7ファイル、+265 / -42)1. テストデータ解析のキャッシュ制御を Template Method で整理
TestDataParsingTemplate/DataFileParser/ListMapParser/TableDataParserparse(directory, resource, id, saveCache)のsaveCache = falseは、従来は生テストデータのキャッシュ(TEST_DATA_CACHE)とPoiXlsReaderのキャッシュだけを抑止しており、ListMapParser・TableDataParser・DataFileParserがそれぞれ持つ解析結果キャッシュには効いていなかった。TestDataParsingTemplate#parse(String)をテンプレートメソッドにし、各サブクラスのキャッシュ処理をcacheEnabled()/tryLoadFromCache(String)/prepareResult()/storeToCache(String)のフックへ寄せた。saveCache = false、またはキャッシュを持たないサブクラスの場合は、構造解析の本体doParse(String)を直接呼び、どのキャッシュも経由しない。DataFileParserは「キャッシュにヒットしても値は再利用せず再構築する。ただし空の場合のみキャッシュ値を使う」という独自戦略を持つため、cachedParse(String)を override して従来の挙動を維持している。担保:
TestDataParsingTemplateTest#testSaveCacheControlsCaching— 同一リソースに対し 2 回parseしたとき、saveCache = trueではリーダのopen呼び出しが 1 回、saveCache = falseでは 2 回であることを表明する。2.
SendSyncSupport— YAML 形式でのテストデータ再読み込みsendSyncTestDataにfileExtensionsを設定しない構成(YAML 形式相当)では、FilePathSetting#getFileIfExistsが返すのはファイルではなくディレクトリである。従来のキャッシュ判定はその起点自身のlastModified()しか見ていなかったため、ディレクトリ配下のテストデータを更新しても再読み込みされなかった。SendSyncSupport.createTestDataInfoの中で、起点を根とするMap<起点からの相対パス, lastModified>のスナップショット(getTimestampSnapshot(File))を採取し、キャッシュ済みのスナップショットとequalsで比較する方式に変更した。キーの区切りは環境非依存とするため/に固定し、ファイル・ディレクトリの双方をエントリに含める。スナップショットはgetMessagesより前に 1 度だけ採取し、比較にも記録にも同じ値を使う。Excel 形式では
getFileIfExistsが返すのはファイルでありFile#isDirectory()が false のため、スナップショットは起点自身の 1 エントリだけになり、実質的な判定は従来と変わらない。修正は
SendSyncSupport内に閉じている(nablarch-coreのFilePathSettingに変更なし)。追加したのは package private なgetTimestampSnapshot(File)、private なcollectTimestamp(File, String, Map)、およびprivate static class TestDataInfoのフィールドのみで、公開 API の宣言差分は 0 件。担保:
SendSyncSupportTestに、ディレクトリ配下の更新(#testReloadTestDataInDirectory)、サブディレクトリ配下の更新(#testReloadWhenFileInSubDirectoryIsUpdated)、未来 mtime のファイルが同居する場合(#testReloadWhenFutureTimestampedFileExists)、読み込み中の書き換え(#testReloadWhenTestDataIsUpdatedWhileReading)、非ディレクトリ起点でのスナップショット内容(#testGetTimestampSnapshotForNotDirectory)を追加。fixture は@Afterで内容と mtime を復元する。3.
TableData#loadData()— 期待値のカラム名が 0 件でも DB を読むloadData()は期待値のカラム名が 0 件のとき DB を読まずに 0 行を返していた。このため DB に行が残っていてもAssertion.assertTableEqualsが必ず PASS する偽陰性が生じていた。カラム名の宣言は「検証対象カラムの絞り込み」であって「検証するかどうか」のスイッチではない。またYAMLの
rows: []はカラム名を書く場所が構造上存在しないため、YAML 形式では必ずこの経路に落ちる。loadData()の中で、局所変数のcolNamesが 0 件のときにdbInfo.getColumns(tableName)を SELECT 対象カラムとするよう変更した。フィールドcolumnNamesは書き換えない(getClone()がObject#clone()の浅いコピーで配列参照を期待値と共有するため)。getColumnNames()、準備データ投入、マスタデータ投入、変換ツール経路、表形式リーダ(src/main/java/nablarch/test/core/reader/配下)にはいずれも差分がない。現行動作へ戻すための設定項目・分岐フラグは追加していない。担保:
AssertionTest#testAssertTableEqualsWithEmptyColumnNames(DB に 1 行ある状態で失敗すること)と#testAssertTableEqualsWithEmptyColumnNamesOnEmptyTable(DB が空なら通ること)の 2 件で、分岐の両方向を固定する。4.
MasterDataSetUpper— Excel 形式以外のマスタデータファイルに対応MasterDataSetUpperはマスタデータファイルの拡張子を見ずに POI へ渡し、シートを列挙していた。このため YAML 形式のマスタデータファイルを渡すとRuntimeException: test data file open failed.(cause はIllegalArgumentException: Your InputStream was neither an OLE2 stream, nor an OOXML stream)で失敗していた。getAllTableData(File)の冒頭で Excel 形式かどうかを判定し、Excel 形式以外はシート列挙を経由せずTestDataParser#getSetupTableData(dir, 拡張子を除いたファイル名)を 1 回だけ呼ぶようにした。拡張子はリーダ/パーサ側が付与する責務であるため、リソース名には拡張子を含めない。Excel 形式と判定する拡張子は 小文字の
xls/xlsxのみとし、PoiXlsReader.isAcceptableFilenameと同じ定義に揃えた。大小無視やxlsmの追加は行っていない。NTF が Excel テストデータとして認識する拡張子は既にこの定義であり、ここで別の定義を作ると NTF 内に Excel の定義が 2 つできるためである。Excel 形式の経路は修正前と同一で、差分は
getMasterFileNameWithoutSuffixの呼び出しをループ外へ引き上げた点のみ。追加したのは private な定数とメソッドだけで、公開 API の宣言差分は 0 件。担保:
MasterDataSetUpperTest#testSetUpMasterDataFromNonExcelFile—SETUP_TABLEブロックを 2 つ持つ非 Excel 形式ファイルをMasterDataSetUpper.mainに渡し、1 ファイルから 2 テーブル分(3 行・2 行)が投入されることを表明する。行数は既存 fixture と変えてあり、既存 fixture の混入では通らない。利用プロジェクトへの影響(挙動変更)
1.
TableData#loadData()はpublicであり、本変更は利用プロジェクトから見た挙動変更である。 期待値のカラム名が 0 件のTableDataに対し、従来は DB を読まずに 0 行を返していたが、本変更後は DB を読む。本リポジトリのsrc/mainではAssertion.java:81(Assertion.assertTableEquals)が唯一の呼び出し元である。nablarch-testing-yaml・nablarch-testing-converter・nablarch-testing-junit5・nablarch-testing-rest・nablarch-testing-integrationも走査したが、製品コードからの呼び出しは無い。利用プロジェクトのコードは走査していない。2.
MasterDataSetUpperに.xlsmや大文字.XLSのマスタデータファイルを渡していた場合、非 Excel 経路へ落ちる。 従来は拡張子を見ずに POI へ渡していたため、POI の内容判定により Excel として開けていた。本リポジトリでは該当 0 件(Git 追跡ファイルでxls59 件・xlsx2 件、xlsm・xlsb・大文字拡張子は 0 件。git ls-files | grep -iE '\.(xls|xlsx|xlsm|xlsb)$'で確認)だが、利用プロジェクトのテストデータは走査していない。3.
parse(..., saveCache = false)の経路では、解析結果キャッシュも参照・保存されなくなる。 従来この経路でもサブクラスの結果キャッシュは効いていた。saveCache = true(既定)の経路に変更はない。テストコード(
src/test15 ファイル、+956)SendSyncSupportTest(+635)、AssertionTest(+53)、TestDataParsingTemplateTest(+39)、MasterDataSetUpperTest(+25)、および Excel 形式以外のテストデータ読み込みを検証するためのテスト専用リーダTsvTestDataReader(+87)と fixture。ドキュメント(
docs/pr75/)docs/testdata-converter-design.md— 変換ツール設計書docs/ntf-testdata-loading.md— テストデータ読み込み機構の解説docs/ntf-empty-table-assertion.md— 期待値 0 件テーブルの扱いに関する設計文書(上記 3 の正となる文書)docs/ntf-testdata-doc.md/docs/ntf-testdata-doc-examples-*.md/docs/ntf-doc-terms.md— NTF テストデータ解説書ntf-impl-spec-list.md、steering.md、checks/21.md・checks/22.md・checks/23.md— 実装方針と、各変更の完了根拠(実測値の全量)テスト結果
mvn clean test(Java 17 + Maven 3.9.9)Skipped 7 件の内訳は
HtmlConvertTest2・RequestTestingMessagingClientTest2・DbAccessTestSupportTest2・FileUtilsTest1 で、いずれも本変更前から存在するAssumeによるもの。