0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

デトロイト派テストコードの基準値を考えてみた

Posted at

背景

リアーキテクチャ開始時に ロンドン派 のテスト手法を導入しました(当時はテストの「流派」自体を知りませんでした)。
スキルにばらつきのある約 20 名のメンバー全員で C1 カバレッジ 100 % を目標に邁進した結果、基準が明確でチーム全体に浸透しやすかった点は大きな収穫でした。

しかし開発開始から半年後、「デトロイト派のほうがテスト設計に向いている」というポッドキャストを聞き、

やっぱりデトロイト派で書き直したい…
という思いが募ります。とはいえ途中で方針転換するのは現実的ではなく、リアーキ期間中は ロンドン派 × C1 100 % のまま走り切りました。

その一年後、バッチ処理のリアーキテクチャが始動し「今度こそデトロイト派で!」と決意。ところが――

  • どのクラスを対象にどの粒度まで書くのか
  • 何をもって十分と判断するのか

といった基準が曖昧で、チームに落とし込むのが難航しました。
そこで「これなら回せるはず」という 指標とガイドライン を自分なりに策定しました。本記事ではその内容を共有します。すでにデトロイト派でテストを書いている方は、ぜひご意見・ご指摘いただけると幸いです。

ふるまいテストとは?

  • バッチ仕様書・画面仕様書 に記載された挙動を丸ごとテストで再現し、
    項目ごとの網羅抽出条件の網羅 も担保するアプローチ。
  • “クラス単体” ではなく ユースケース(ふるまい) を丸ごと検証するのが特徴。

レイヤー別テスト基準

レイヤー 方針 補足
Tasklet / Chunk モデル (Reader → Processor → Writer) - Tasklet から実行して “バッチ全体のふるまい” をテスト
- 仕様書を網羅するテストケースのみを書く(クラス内部の全分岐網羅はしない)
例外系・境界値も ユースケース視点 で網羅する
Service - ふるまいテストを実行して C1 ≥ 90 % なら 追加の Service テストは不要
- C1 < 90 % の場合は テスト or プロダクトコードを見直す
- 仕様不足? 不要なコード? を判断
- ふるまいテストで通しづらい必須分岐のみ Mock 付き Service テスト を追加
“カバレッジ不足 = 追加テスト” にしない。まず 仕様と実装のズレ を疑う
Logic クラス - 1 バッチ限定で参照される場合:Tasklet 経由のふるまいテストで十分
- 複数バッチ/複数機能から参照される場合:従来通り Mock を使い C1 100 % を目指す
再利用ロジックは単体で堅牢に
DAO - これまで通り SQL の網羅テスト を実施 SQL の分岐・結合条件をすべて確認
Utility - 従来通り Mock を使い C1 100 % を目指す 日付・数値変換などの共通処理

運用上のポイント

  1. “まずふるまい” → 足りなければレイヤーテスト
    迷ったらユースケース網羅を優先し、カバレッジ不足時のみ補完。
  2. カバレッジは 指標、目的ではない
    C1 100 % を目指すのはコード品質より“テスト漏れ検知”が目的。
  3. 仕様書とテストケースを常にリンク
    テスト追加時は仕様書に行番号や ID を追記し、レビュアーが追いやすくする。

まとめ

  • Tasklet でバッチ全体のふるまいを検証
  • C1 カバレッジ 90 % を閾値に 追加テスト or コード見直し
  • 再利用ロジック・Utility・DAO は 単体テストで堅牢に

コメント歓迎!
実際にデトロイト派+バッチ開発で運用している方のフィードバックをお待ちしています 🙌

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?