CTS-KB
モダナイゼーション📚 シリーズ 4/7

受入の機械化 — 旧実装の振る舞いを、先にユニットと接続テストへ落とす

⏱ 約 6 分で読めます
#レガシー置換#モダナイゼーション#テスト#TDD#Playwright#バーコード#品質ゲート

🎯 この記事の範囲

第 3 回 の境界は、文章のままでは翌日壊れます。機械で落ちる形にします。落ちないものは、落ちないと宣言します。

置換の鍵はここです。TDD と言っても、新しい仕様からテストを書くのではありません。旧実装が今日通している入力と拒否を、先にテストにすることです。

本記事隣接
本記事(第 4 回)旧環境ではテストを書けない理由 / 単体と Moq・フェイクの接続テスト / 閉じる単位の一覧 / サンプル PDF を完成にしないクロスマシン TDD、切替

🔑 旧環境は、テストを書かないのではなく、書けない

この種の出荷・帳票などの業務システムでは、単体テストはほとんど残っていません。怠慢というより、継ぎ目が無かったためです。

旧の正本なぜテストに落ちないか
ActiveReports の設計器とプレビュー紙面がランタイムと一体。HTML のように mm をアサートできない
Windows キューへの直接印刷実プリンタが無いと「送った」を再現できない
同期 Socket の感熱プリンタUI スレッドと実機 ACK に縛られる
巨大 ViewModel と静的共有状態HTTP もスキャンも画面も同じクラス

新側で先に切ったのは、この継ぎ目です。プリンタも API も無いところで赤を出せるようにしてから、実装を載せます。

層切っているもの例
単体プリンタも HTTP も無いテナント不一致、HTML 混入、改ページ、バーコード復号、用紙超過
接続(Moq / フェイク)実プリンタ・実 APIclaim のスキーマ、経路ルーター、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

実紙・実機・契約

切替しない

第 6 回


📄 サンプル 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・フェイクで先に落とす
5Linux から Mac / Windows へ出して TDD するSSH 先で閉じる不足分、キャプチャまで AI
6人が残る切替実機・実紙・契約・並行稼働
7再現装置としてのハーネス台帳・禁止・ゲート・停止条件

🔗 関連リソース