🎯 この記事の範囲
第 3 回 の境界は、文章のままでは翌日壊れます。機械で落ちる形にします。落ちないものは、落ちないと宣言します。
置換の鍵はここです。TDD と言っても、新しい仕様からテストを書くのではありません。旧実装が今日通している入力と拒否を、先にテストにすることです。
| 本記事 | 隣接 | |
|---|---|---|
| 本記事(第 4 回) | 旧環境ではテストを書けない理由 / 単体と Moq・フェイクの接続テスト / 閉じる単位の一覧 / サンプル PDF を完成にしない | クロスマシン TDD、切替 |
🔑 旧環境は、テストを書かないのではなく、書けない
この種の出荷・帳票などの業務システムでは、単体テストはほとんど残っていません。怠慢というより、継ぎ目が無かったためです。
| 旧の正本 | なぜテストに落ちないか |
|---|---|
| ActiveReports の設計器とプレビュー | 紙面がランタイムと一体。HTML のように mm をアサートできない |
| Windows キューへの直接印刷 | 実プリンタが無いと「送った」を再現できない |
| 同期 Socket の感熱プリンタ | UI スレッドと実機 ACK に縛られる |
| 巨大 ViewModel と静的共有状態 | HTTP もスキャンも画面も同じクラス |
新側で先に切ったのは、この継ぎ目です。プリンタも API も無いところで赤を出せるようにしてから、実装を載せます。
| 層 | 切っているもの | 例 |
|---|---|---|
| 単体 | プリンタも HTTP も無い | テナント不一致、HTML 混入、改ページ、バーコード復号、用紙超過 |
| 接続(Moq / フェイク) | 実プリンタ・実 API | claim のスキーマ、経路ルーター、SATO 送信口、設定版不一致、HTTPS 強制 |
| 人 | 切れない副作用 | 実紙、実機スキャナ、送り状契約、ドライバー本番送信 |
フェイクがあるから、実装の正本を Ubuntu に置けます。Windows フォントと iOS シミュレーターだけ 第 5 回 で足します。フェイクが無いと、全部が実機待ちになり、AI も止まります。
💡 堅牢な置換は、「テストがある」からではありません。 実プリンタ無しで誤送・二重送信・別テナントの描画を落とせるからです。件数 78 は到達点の記録であり、完成率ではありません。
🧪 「同じ」を、落ちる単位に割る
帳票と印刷エージェントで、実際に落としている例です。
| 閉じていること | テストが拒否すること |
|---|---|
| テナント/拠点の不一致 | 別テナントの文書を描画する、別拠点の設定で claim する |
| HTML / Scriban の混入 | 宛先や商品名にタグや {{ を入れてテンプレートが壊れる |
| 改ページ | 明細の欠落・重複。共通は 12 行、固定紙面は 7 商品 |
| バーコード | 生成 SVG を読み戻して、出荷番号・日本語 QR と一致しない |
| 用紙超過 | 長い住所を黙って切って PDF にする |
| 単価欠落 | 空の単価を 0 円合計として出す |
| 未対応文字 | QR や SBPL で黙って ? に置換する |
| 方式誤配線 | ラベルジョブが PDF ディスパッチャーを使う |
| 設定版のずれ | 古い端末設定のまま claim して印刷する |
| HTTPS | 平文のサービスアドレスでキューを組む |
| 再起動後の二重送信 | 同じジョブをスプーラーへ再送する |
| 不明な失敗 | 結果不明を submitted にして自動再送する |
| 比較用データ | 重ね合わせ用アーティファクトが本番キューに入る |
2026-09 時点で、帳票テストは Linux で 78 件、Windows でもブラウザーを含む PDF 生成が通っています。モバイル共通ロジックは 184 件。数字は到達点の記録であり、切替条件ではありません。
📄 サンプル PDF の成功を、完成にしない
Chromium で日本語 2 ページの納品書が出る、固定 3 紙面が各 3 ページ出る、Windows の Chrome でも同じ。これはエンジンの受入です。
切替の受入ではありません。
- 現行 ActiveReports 紙との重ね合わせ
- プリンター余白・倍率・ミシン目
- 実機スキャナ
- ドライバー実送信、PW208 の原点
- 税・送料・値引き
「PDF が綺麗」と「請求書として正しい」は分けます。単価のない行があるとき、全明細金額は出しません。送料計算が未移植なら、未移植と紙面に書くか、欄を出さない。
オーバーフローは縮小の末に描画前拒否です。宛先が欠けた紙を現場に出さない。失敗メッセージには field ID だけを出し、顧客の住所文字列はログに載せません。
🧬 旧コードとのバイト比較は、何を保証するか
感熱ラベルは、旧生成処理と同じ入力で SBPL バイトを比較します。これは 各業務の座標を維持した ことの証拠です。
保証しないこと:
- 今の用紙・原点が旧と同一であること
- 配送の現行運用に使えること
- 配送に出してよいこと
未対応文字と制御文字は、比較の前に拒否します。旧コードが ? にしていた経路は、一致させません。差出人は明示データに置き、ソース直書きの旧会社名では比較しません。
固定紙面の右側欄は、300 dpi の画像比較で画素差 0 まで揃えた範囲があります。端数画素の 1px 差は含みます。画像一致は紙の保証ではなく、ブラウザ移植で罫線が二重幅に戻っていない ことの保証です。
📱 端末側で閉じていること、閉じていないこと
閉じつつあるもの:
- ログイン後の権限でメニューを出す純粋な判定(通信しない)
- 店舗担当に倉庫権限を付けない橋渡し
- SATO の非同期化、取消、枚数別結果、二重送信抑止のテストダブル
- iOS シミュレーター起動、Android ARM64 の APK 生成
- WebView2 で許可した帳票だけを表示し、外部 URL を遮断する
閉じていないもの:
- LOGI 実アダプター
- CTS-EC の実トークンログイン
- iPhone / Android 実機の検品オペレーション
- Linux エミュレーター上の Android 実行
- Windows ドライバーからの本番自動印刷
シミュレーターでロゴが 75% 幅になったことは、実機検品の受入ではありません。APK が署名できたことは、店舗オペレーションの受入ではありません。名前を正確にします。
✅ 第 4 回まとめ
- 置換の TDD は、旧実装の入力と拒否を先にテストにすることである。新しい仕様から書かない
- 旧環境はテストを書けない。単体と Moq / フェイクの接続テストで継ぎ目を切る
- 受入は「現行と同じ」ではなく、拒否する入力の列挙である
- サンプル PDF とバイト比較は、エンジンと座標の証拠。切替の証拠ではない
- 顧客文字列をエラーに出さない。field ID で足りる
- 通ったテストの件数は記録する。完成率にはしない
- 閉じられない項目は、第 6 回の切替リストへ移す
次回「Linux から Mac / Windows へ出して TDD する」では、Linux では閉じないテストを SSH 先で回し、アイコンとキャプチャまで AI に出す手順を書きます。
📚 シリーズ記事
| 回 | タイトル | 主題 |
|---|---|---|
| 1 | レガシー置換とは | 旧実装を原典にし、先にテストへ落とす |
| 2 | 旧コードの読み方 | 地図が無い状態から四分類 |
| 3 | 寄せる境界・寄せない境界 | DTO、PDF と SBPL、店舗と別拠点 |
| 4 | 受入の機械化(本記事) | ユニットと Moq・フェイクで先に落とす |
| 5 | Linux から Mac / Windows へ出して TDD する | SSH 先で閉じる不足分、キャプチャまで AI |
| 6 | 人が残る切替 | 実機・実紙・契約・並行稼働 |
| 7 | 再現装置としてのハーネス | 台帳・禁止・ゲート・停止条件 |
🔗 関連リソース
- TDD 編 — AI 時代にテストを先に置く理由。本記事はそれを旧実装のキャラクタリゼーションに使う
- 品質ゲート編 — 決定論テストをマージ条件にする
- ActiveReports → Playwright + Scriban 移行 — 用紙超過とバーコード復号の実装
- Playwright — PDF 生成の実行機。受入の本体はテストの拒否項目