印刷プレビューで2ページ目が消える不具合をどう潰したか

はみ出し条件で改ページが停止し後続ページが欠ける不具合を、再現分類の固定と境界テストで再発しにくい形に直した実装ログです。

はじめに

記録時点: 2026-01〜2026-02

今回の不具合は「2ページ目が出ない」という見た目で報告されました。 ただ実体は、改ページ処理の前進条件が壊れて停止する問題でした。

この種類は、症状だけ追うと再発しやすいため、 修正より先に再現分類を固定するところから始めています。

この記事で扱う範囲

  • 改ページ停止の再現条件をどう分解したか
  • 前進しない分割ロジックをどう修正したか
  • 境界条件をどうテストへ固定したか

再現が難しかった理由

同じデータ量でも、はみ出す位置で結果が変わっていました。 単一ケースだけ直すと別ケースで再発する状態です。

固定した再現分類

分類 症状
先頭問題がはみ出す 分割位置が進まず停止
途中問題がはみ出す 後続ページが欠ける
最後の1問だけはみ出す 分割不能なのに進行しようとする
問題文ではなく解答欄がはみ出す 判定軸がずれて停止

この4分類を先に決めたことで、修正成否を判定できる状態になりました。

修正の要点

1. 分割位置の前進保証を入れた

ページ先頭の要素が分割対象になると前進しないケースがあるため、 分割位置が進まない場合は次候補へ進めるガードを入れました。

function resolveSplitIndex(candidate: number, pageStart: number, lastIndex: number): number {
  if (candidate <= pageStart && pageStart < lastIndex) {
    return pageStart + 1;
  }
  return Math.min(candidate, lastIndex);
}

2. 判定軸を表示制御と揃えた

内部判定と画面警告が別基準だと、利用者には意味不明な表示になります。 はみ出し判定を画面制御と同じ軸へ寄せ、挙動を一致させました。

3. 警告を「次アクションの手掛かり」にした

警告は出すだけでなく、どの問題を調整すべきかが分かる条件に整理しています。

見送った案

1. 先頭はみ出しを強制縮小して1ページへ収める

見た目は収まりますが、教材意図を壊す可能性があるため見送りました。

2. はみ出し時に無条件で新規ページへ送る

停止は減りますが、空白ページや不自然な分割を増やすため採用していません。

3. 画面警告だけで運用吸収する

再現不能バグが残るので、ロジック修正を優先しました。

テストで固定したこと

1. 計測模擬テストで再現分類を固定

DOM計測相当の値をモック化し、4分類を自動テストで再現可能にしました。

2. 改ページ境界の回帰を拡充

  • 無効入力で落ちない
  • 後半変更時に前半ページが崩れない
  • 先頭変更時に構成を適切に再計算する

この回の判断が次に効いたこと

「再現分類を先に固定する」進め方は、次の不具合対応でも同じように効きました。

まとめ

今回の改善で、改ページ停止バグは「たまに起きる現象」から「再現して検証できる問題」へ変わりました。 この種の不具合は、修正コードより先に再現分類を固定したほうが、結果的に早く収束します。

公開リンク