バッチ処理のテスト観点|事故を防ぐ確認項目

夜間集計が翌朝に落ちていた、締め処理の合計が合わない——こうした事故の多くは、テスト段階で防げたはずのものです。バッチ処理のテスト観点は、画面のある機能と同じ感覚で確認していくと、必ずどこかに抜けが生まれます。
バッチは目に見えません。実行結果がすぐに画面へ返らず、失敗しても翌朝まで気づけないことがあります。しかも大量データを扱い、決められた時間枠の中で終わらせなければなりません。オンライン機能なら「ボタンを押して結果を見る」で確認できますが、バッチにはその手応えがないのです。
この記事では、受託開発のPMやテスト担当が、夜間集計・締め処理・データ連携・定期ジョブといったバッチを検証するときに押さえるべき確認項目を、切り口ごとに整理します。正常系だけでなく、異常系のリランや性能、ジョブ依存、境界、運用まで含めて、月曜から使えるチェックリストの形で示していきます。
バッチ処理のテスト観点が難しい理由
なぜバッチのテストは画面テストより難しいのか。その正体を言語化しておくと、どこに確認項目を厚くすべきかが見えてきます。難しさを理解しないまま進めると、正常系だけを確認して安心してしまいがちです。
バッチの難しさは「結果が見えにくく、失敗の発覚が遅れる」ことに集約されます。画面機能ならボタンを押した瞬間に結果が返り、その場で正誤を判断できます。バッチにはその即時フィードバックがなく、翌朝の業務開始で初めて異常に気づくことも珍しくありません。
バッチ特有の難しさを、まず一覧で押さえておきましょう。
| 難しさの要素 | 具体的な状況 | テストで重くなる観点 |
|---|---|---|
| 非同期・無人実行 | 夜間や休日に人がいない状態で自動起動する | 失敗検知・アラート・ログ |
| 失敗発覚の遅れ | 落ちても翌朝の業務開始まで気づかない | 監視・リカバリ手順 |
| 大量データ | 数百万件を一括処理し、1件の異常が全体を止める | 件数・性能・部分失敗 |
| 時間枠(実行ウィンドウ) | 業務開始までに必ず終える必要がある | 処理時間・ウィンドウ超過 |
| 依存ジョブ | 先行ジョブの結果を前提に動く | 順序・先行失敗時の挙動 |
この5つは、後半のセクションでそれぞれ確認項目に落とし込んでいきます。ひとつ具体例を挙げましょう。ある販売管理システムで、深夜の売上集計バッチが処理の8割まで進んだところで異常終了したとします。オペレーターは翌朝それに気づき、慌ててバッチを再実行します。
このとき、途中まで書き込まれた集計結果が残っていて、再実行で同じ売上が二重に加算されたら——正しい数字を出すはずのバッチが、逆に帳簿を壊す原因になります。バッチのテストは「機能が正しいか」だけでなく、「異常時にどう振る舞い、どう立て直せるか」まで含みます。
テスト観点を体系的に洗い出す一般的な手順は、テスト観点の洗い出し手順を解説した記事も参考にしてください。本記事はそれをバッチという実行形態に特化させたものと位置づけられます。
なお、用語の定義を正確にそろえておくことも欠かせません。テスト設計で使う言葉の標準的な意味は、JSTQB(日本のソフトウェアテスト資格認定団体)の資格体系でも整理されています。チーム内で「リラン」「冪等性」といった言葉の理解がずれていると、テスト設計そのものが噛み合わなくなります。まずは関係者で用語をそろえるところから始めるのが安全です。
正常系で押さえるバッチ処理のテスト観点
まずは正常系です。土台となるのは、「入力データのバリエーション」「処理件数」「集計・締めの正確性」の3つです。ここが崩れると、その先の異常系をいくら固めても意味がありません。順に見ていきます。
入力データのバリエーション
バッチは、想定外のデータが1件混じっただけで挙動が変わります。オンライン画面なら入力チェックで弾ける値でも、外部連携ファイルやDB抽出から流れ込むデータは、そのままバッチに入ってきます。入力側で確認すべき代表的なパターンを挙げます。
- 正常データ(すべての項目が期待どおりに揃っている)
- 必須項目の欠損・空文字・NULL
- 桁あふれ・型不一致・文字コードの混在
- 重複レコード・キー重複
- 先頭行・最終行・改行コードの違い(CRLFとLFの混在)
- 全角・半角、前後の空白、想定外の記号
正常データだけを流して「動いた」と判断するのが、最も多い落とし穴です。本番のデータは常に汚れており、テストデータの品質がテストの質を決めます。特に他システムから受け取る連携ファイルは、相手側の仕様変更で予告なく形式が変わることもあり、異常データへの耐性を確認しておく価値があります。テストデータをどう用意するかは、テストデータの作り方をまとめた記事で詳しく整理しています。
処理件数の確認
件数は、バッチが正しく動いたかを判断する最もシンプルで強力な指標です。入力件数・処理件数・出力件数・スキップ件数・エラー件数が、互いに整合しているかを必ず確認します。合計が合わないときは、どこかでレコードが握りつぶされている可能性があります。
| 件数の観点 | 確認内容 | 判定の目安 |
|---|---|---|
| 入力件数 | 取り込んだ総レコード数 | ファイルや抽出元と一致 |
| 処理件数 | 正常に処理した件数 | 入力−スキップ−エラーと一致 |
| 出力件数 | 生成した結果の件数 | 集計仕様どおりの件数 |
| スキップ件数 | 対象外として除外した件数 | 除外条件どおり |
| エラー件数 | 処理できなかった件数 | ログと突き合わせ可能 |
「入力件数 = 処理件数 + スキップ件数 + エラー件数」という等式が常に成り立つかを、テストのたびに機械的に確認できるようにしておくと安心です。この一本の式が崩れたら、それだけで異常のサインになります。
集計・締め処理の正確性
締め処理や集計バッチでは、金額・数量の合計が1円・1個単位で合うことが求められます。丸め処理(切り捨て・切り上げ・四捨五入)の方向、通貨や単位の扱い、マイナス値やゼロの処理を、仕様と一つひとつ突き合わせます。
丸めの方向を1箇所間違えるだけで、締め全体の合計が数円ずれ、経理の照合で止まります。人が電卓で検算する範囲を超えるからこそ、集計ロジックは境界を含めて丁寧に確認する必要があります。
締め処理では、集計の切り口が複数あることも見落としがちです。日次・月次・部門別・商品別など、同じデータを異なる軸で集計する場合、それぞれの合計が最終的に一致するかをクロスチェックします。ある軸では合っていても、別の軸で内訳がずれていれば、どこかに集計漏れや二重計上が潜んでいます。
集計結果が正しいかを判断するには、処理前後のデータを比較する視点が欠かせません。この整合性の担保については、データ整合性テストの進め方で観点を掘り下げています。本記事は整合性そのものより、バッチという実行形態全体の検証に軸を置いています。
異常系とリランで確認する項目
バッチのテストで最も差がつくのが、この異常系とリラン(再実行)です。「途中で落ちたバッチを、どう安全に立て直すか」がバッチ運用の生命線です。ここを検証しないバッチは、初回は動いても、いざ障害が起きたときに二次被害を生みます。
途中失敗時のロールバックとリカバリ
大量データを処理している最中に異常終了したとき、データがどの状態で残るかを確認します。中途半端に更新された状態で放置されると、二重計上や欠損の原因になります。設計として、どの復旧方式を採っているかを把握したうえでテストします。
- 全件ロールバックされ、実行前の状態に戻るか(オールオアナッシング方式)
- チェックポイント(途中経過の保存点)まで戻り、そこから再開できるか
- コミット単位(何件ごとに確定するか)が仕様どおりか
- ログから「どこまで処理したか」を追跡できるか
- 中間ファイルやワークテーブルが正しく後始末されるか
コミット単位は特に見落としがちです。1万件ごとにコミットする設計なら、途中で落ちたときに「直前のコミット地点まで」は確定済みとして残ります。この前提を理解せずにリランすると、確定済みの範囲を二重処理してしまいます。
再実行の冪等性
冪等性(べきとうせい)とは、同じ処理を複数回実行しても結果が変わらない性質を指します。リランで最も重要な観点です。
同じバッチを2回流したときに、売上が二重に計上されないかを必ず確認します。冪等性が担保されていないバッチは、リカバリのたびに新たな事故を生みます。処理済みフラグ、実行キー、UPSERT(あれば更新・なければ挿入)といった仕組みが、意図どおりに効いているかを検証します。
テストとしては、正常終了したバッチをもう一度そのまま実行し、結果が1回目とまったく同じになることを確認します。件数も金額も増えず、エラーにもならず、静かに「何もしない」で終わるのが理想的な挙動です。
二重実行防止と部分実行
無人で動くバッチは、オペレーションミスやスケジューラの誤設定で、二重に起動することがあります。また、特定の範囲だけを流し直す「部分実行」を求められる場面もあります。異常系で確認すべき項目を表にまとめます。
| 確認項目 | テスト内容 | 期待する挙動 |
|---|---|---|
| 二重起動 | 同一バッチを同時に2回起動する | 排他制御で後発を拒否または待機 |
| 部分実行 | 対象データの一部だけで起動する | 範囲指定が効き、対象外に触れない |
| リラン | 失敗後に再実行する | 冪等に処理し二重更新しない |
| 強制停止 | 実行中に手動停止する | データが不整合な状態で残らない |
| 再開 | 停止地点から再開する | 未処理分のみを処理する |
これらは机上のレビューでは見抜けません。実際に落として、止めて、もう一度流すという操作を、テスト工程で意図的に再現することが重要です。異常を「起こしにいく」姿勢が、バッチのテストでは欠かせません。
性能と実行ウィンドウのテスト観点
バッチには「終わってよい時刻」が決まっています。業務開始前に終わらなければ、たとえ結果が正しくても業務が止まります。性能はバッチにおいて、機能要件に近い重みを持ちます。
処理時間そのものより、「本番相当のデータ量で実行ウィンドウ内に終わるか」が本質です。開発環境の小さなデータで速くても、本番の件数で急激に遅くなるバッチは珍しくありません。件数に対して処理時間が線形に伸びるのか、それとも二次関数的に悪化するのかを、実測で確かめます。
性能面の確認項目を整理します。
- 本番相当の件数・データ量での処理時間の実測
- 実行ウィンドウ(許容される時間枠)を超過しないマージン
- 件数が増えたときの処理時間の伸び方(線形か、急激に悪化するか)
- CPU・メモリ・ディスクI/Oのリソース消費
- 同時刻に動く他バッチやオンライン処理とのリソース競合
- テーブルロックによる待ち・デッドロックの有無
特にリソース競合は見落としやすいポイントです。単体では時間内に終わるバッチでも、同じ時間帯に別のバッチや月次処理が重なると、データベースのロック待ちで一気に遅くなることがあります。本番のスケジュールを再現した状態で計測しないと、この問題は表面化しません。
負荷をかけた状態での挙動確認は、一般的な負荷テストの考え方と重なります。バッチの場合は特に、リソースを共有する他処理との干渉を見落とさないことが肝心です。単体で速いことより、本番のスケジュール全体の中でウィンドウに収まることを確かめてください。
また、バッチの処理対象は運用とともに増え続けます。リリース時点で時間に余裕があっても、1年後にはデータが数倍になり、実行ウィンドウを超えることがあります。将来の件数の伸びを見込んだうえで、現時点の処理時間にどれだけマージンがあるかを確認しておくと安心です。件数が2倍になったときに処理時間が何倍になるかを一度測っておくと、いつ頃に限界が来るかの予測が立てられます。
処理時間の妥当性や信頼性を判断する材料として、公的な観測データも役立ちます。ソフトウェアの信頼性や工数に関する統計は、IPA(情報処理推進機構)のソフトウェア開発分析データ集にまとまっています。自社の実測値を業界の傾向と照らし合わせる材料になります。
ジョブ依存とスケジュールのテスト観点
実務のバッチは単独では動きません。複数のジョブが順番に連なり、前のジョブの結果を次のジョブが使います。この依存関係こそ、バッチ処理のテスト観点で最も見落とされやすい領域です。単体では正しく動くジョブでも、つなげると事故が起きます。
先行ジョブ失敗時の挙動
先行ジョブが失敗したとき、後続がどう振る舞うかを確認します。先行が落ちたのに後続が空データで走り、集計がゼロになる事故は典型的です。後続が「前のジョブは成功しているはず」と暗黙に前提を置いていると、この落とし穴にはまります。
- 先行失敗を検知して後続を停止するか
- 中途半端な中間ファイルを後続が読まないか
- リトライで先行が復旧した後、後続が正しく再開するか
- 手動での「先行だけ再実行→後続を続行」が安全にできるか
実行順序とスケジュール
ジョブの依存とスケジュールで確認すべき項目を一覧にします。空欄を作らず、各観点の期待挙動まで明記しておくと、テスト設計にそのまま使えます。
| 観点 | 確認内容 | 期待する挙動 |
|---|---|---|
| 実行順序 | 依存関係どおりの順で起動するか | 定義順を厳守 |
| 並行実行 | 独立ジョブが同時に走るか | 競合せず並行処理 |
| リトライ | 失敗時に自動再試行するか | 回数上限まで再試行 |
| タイムアウト | 想定時間を超えたときの扱い | 打ち切り・通知 |
| スキップ条件 | 対象がない日の挙動 | 正常スキップ(該当なしで正常終了) |
| 遅延起動 | 先行の遅れで起動が後ろへずれる | 後続も連動して待機 |
スケジューラの設定は、テスト環境と本番環境でずれやすい部分です。カレンダー(営業日・祝日)の定義、タイムゾーン、日付が変わる瞬間の扱いまで含めて、できるだけ本番と同じ条件で確認することをおすすめします。祝日カレンダーの更新漏れで、連休明けにジョブが動かないといった事故は、地味ですが実際によく起こります。
境界と運用で見落とすバッチ処理のテスト観点
最後は、境界値と運用の観点です。ここはバグが集中しやすく、かつ発覚が遅れると被害が大きくなる領域です。日常的には通らないルートだからこそ、テストで意図的に踏んでおく必要があります。
境界となる日付と件数
バッチは特定の日付や件数で挙動が切り替わります。境界に注目してテストを作る考え方は、テスト設計の基本技法そのものです。Lee Copeland『はじめて学ぶソフトウェアのテスト技法』でも、境界には欠陥が集中すると指摘されています。バッチではこの境界が「日付」と「件数」の両方に現れます。
- 月末・年度末・うるう年・大型連休明けなど、日付の境界
- 0件(対象データがない日)の処理
- 1件だけ・上限件数ちょうど・上限を1件超える件数
- 期首・期末をまたぐデータの集計区分
- 月をまたぐ深夜0時ちょうどの起動
特に「0件の日」と「月末」は、本番で初めて通るコードになりがちで危険です。対象データが1件もない日に、バッチが正常終了するのか、それともゼロ除算やNULL参照で落ちるのか。年度末にだけ動く特別な集計区分が正しいのか。こうした境界は、テストで作り込まないと再現できません。境界値の考え方をより深く知りたい場合は、境界値分析のやり方を合わせて確認してください。
運用・監視の観点
バッチは作って終わりではなく、運用の中で毎日動き続けます。開発時のテストで運用観点まで確認しておくと、リリース後の「気づけない障害」を大きく減らせます。運用観点の確認項目を整理します。
| 運用観点 | 確認内容 | 判定の目安 |
|---|---|---|
| ログ出力 | 開始・終了・件数・エラーが残るか | 追跡に必要な情報が揃う |
| アラート | 失敗時に担当へ通知が飛ぶか | 検知から通知まで自動 |
| 監視 | 未起動・遅延を検知できるか | しきい値で異常判定 |
| リカバリ手順 | 失敗時の復旧手順が文書化されているか | 手順書どおりに復旧可能 |
| 再実行可否 | 誰でも安全にリランできるか | 手順が明確で冪等 |
「落ちたときに誰が気づき、どう直すか」まで検証して初めて、バッチのテストは完了します。特に見落としやすいのが「未起動の検知」です。バッチが失敗したときはアラートが出ても、そもそも起動しなかったときは何も通知が来ない、という監視設計は意外と多いものです。障害発生時の初動については、システム障害時のトラブル初動対応手順も現場の備えとして役立ちます。
バッチ処理のテストでよくある質問
現場でよく挙がる疑問を、Q&A形式で整理します。テスト計画を立てるときの判断材料にしてください。
Q. バッチのテストで、まず何から手をつけるべきですか。
A. 正常系の集計精度と件数整合から始めます。ロジックが正しいことを小さなデータで確認してから、異常系・性能・依存へ広げるのが効率的です。土台が固まる前に本番件数を流しても、遅いのか間違っているのかの切り分けができません。
Q. リランのテストは、どこまでやれば十分ですか。
A. 最低限、「正常終了したバッチをもう一度流して二重処理が起きないか」「途中で落としてから再実行して正しく復旧するか」の2つは必須です。冪等性の確認は、バッチのリランテストで省略してはいけない一線です。この2つを外すと、本番の障害対応が新たな事故の引き金になります。
Q. 本番相当のデータ量を用意できません。どうすればよいですか。
A. まずはロジックと異常系を小さなデータで固め、性能だけは本番に近い件数で確認する、と目的を分けます。全量が難しくても、ピーク時を想定した件数で実行ウィンドウ内に終わるかは押さえておきましょう。マスキングした本番データを一部使うのも現実的な方法です。
Q. 本番でしか再現しない不具合が多いのはなぜですか。
A. バッチは月末・年度末・0件・大量件数など、日常では通らない条件で挙動が変わるためです。これらの境界を、テストデータとして意図的に作り込むことで、本番前に踏んでおけます。「たまたま通らなかったルート」を残さないことが、バッチの品質を左右します。
Q. 手動テストと自動化のどちらで進めるべきですか。
A. 集計の前後比較や件数チェックは、クエリやスクリプトで自動化する価値が高い部分です。一方、異常系の再現やリランの操作は、初回は手動で挙動を確かめながら進めると理解が深まります。両者を役割で分けると効率的です。
バッチ処理のテストの進め方
ここまでの観点を、実際のテスト工程にどう落とし込むかを整理します。バッチのテストは、進め方の設計で効率と精度が大きく変わります。行き当たりばったりで全件を流すと、手戻りばかりが増えます。
テストデータの準備と前後比較
バッチのテストは、テストデータの質がほぼすべてを決めます。本番相当のバリエーションと件数を、いかに現実的なコストで用意するかが鍵です。ゼロから作るのは大変なので、本番データの活用と作り込みを組み合わせます。
- 本番データをマスキングして使う(個人情報の扱いに注意)
- 境界・異常パターンを意図的に作り込んだデータを混ぜる
- 処理前のデータ状態を退避し、処理後と機械的に比較する
処理前後のデータをスナップショットで保存し、差分を突き合わせるのが、集計検証の最も確実な方法です。目視ではなく、比較用のクエリやスクリプトで判定する仕組みを先に作っておくと、リランのたびに再利用できます。この「比較の自動化」に最初に投資するかどうかで、テストの効率は大きく変わります。
部分データでの段階的な検証
いきなり全件を流すのではなく、小さなデータから段階的に規模を上げていく進め方が有効です。ロジックの誤りを小さいうちに潰し、性能や依存の問題を後半に集中して確認できるため、手戻りを最小化できます。
| 段階 | データ規模 | 主な確認目的 |
|---|---|---|
| 第1段階 | 数件〜数十件 | ロジックの正しさ・集計の正確性 |
| 第2段階 | 境界・異常混在 | 異常系・リラン・冪等性 |
| 第3段階 | 本番相当の件数 | 性能・実行ウィンドウ・リソース |
| 第4段階 | 依存ジョブ連携 | 順序・先行失敗・スケジュール |
この順序には理由があります。ロジックが固まる前に本番件数を流しても、遅いのか間違っているのかの切り分けができません。まず小さく正しさを確認し、次に異常系、最後に規模と連携という順で進めると、各段階の目的が明確になります。少人数のテスト体制でも、優先順位をつけて回しやすくなります。
可能であれば、本番と同じスケジューラ設定・同じ時間帯で、依存ジョブをつないだ通しのリハーサルを一度行うことをおすすめします。単体では見えなかったリソース競合やタイミングの問題が、複数ジョブを連結して初めて表面化することがあるためです。リリース前の最後の関門として、本番同等環境での一気通貫の実行を計画に入れておくと、当日の不安が大きく減ります。この通しリハーサルで、ログの出方やアラートの飛び方まで含めて確認できれば、運用開始後の「気づけない障害」をさらに減らせます。
バッチテストのチェックリスト
最後に、本記事で扱った観点を、確認項目のチェックリストとしてまとめます。テスト計画に組み込む際の出発点にしてください。
- 正常系: 入力バリエーション・件数整合・集計と締めの正確性を確認したか
- 異常系: 途中失敗のロールバック/リカバリを確認したか
- リラン: 冪等性・二重実行防止・部分実行を確認したか
- 性能: 本番相当データで実行ウィンドウ内に終わるか
- 依存: 先行失敗時の後続挙動・実行順序・リトライを確認したか
- 境界: 月末・年度末・0件・上限件数を確認したか
- 運用: ログ・アラート・監視・リカバリ手順を確認したか
これらをすべて自前で検証しきるのは、兼任中心のテスト体制では負担が大きいのも事実です。特に異常系やリランの再現は、環境づくりから設計まで手間がかかります。バッチのテスト設計や異常系の再現に不安がある場合は、テスト体制の見直しを検討している方向けに専門家への相談窓口も用意しています。まずはテスト体制の相談窓口から現状の課題を共有するところから始めてみてください。
バッチは画面がない分、テストの設計力がそのまま品質に直結します。本記事の観点を土台に、自社のバッチに合わせた確認項目へと具体化していただければ幸いです。事故は、いつも「テストしていなかった一本のルート」から起きます。
次に読むならこの記事
テストの手戻りを減らしたい方へ
テスト仕様書のExcelテンプレートを無料で配布しています。自社で整備する場合も、外部に任せる場合も、まずは型を持つところから。



