# 単体テスト仕様・結果・障害票サンプル

文書ID: UT-PLAN-014 / 版: 1.0 / 関連: REQ-014〜016 / 状態: 記入例・未実施

以下は架空案件のテスト設計とコード例です。合格証跡や実測カバレッジではありません。

## 工程定義

- 目的: モジュールの正常・境界・異常動作を独立した期待値で検証する。
- 入力: 詳細設計、実装、受入条件、テストデータ。
- AIの作業: テストを生成・実行し、再現ケースと修正差分を記録する。
- 成果物: テスト仕様、自動テスト、実行ログ、カバレッジ、障害票。
- 完了条件: 必須ケースが合格し、期待値が仕様と一致するとQAが確認する。

## 1. テストケース

| ID | 対応条件 | 入力・前提 | 期待結果 | 実際の結果 |
| --- | --- | --- | --- | --- |
| UT-014-01 | AC-014-01 | U002、承認権限あり、U001のsubmitted申請 | 承認可能 | 未実施 |
| UT-014-02 | AC-014-02 | U001、承認権限あり、U001の申請 | SELF_APPROVAL | 未実施 |
| UT-014-03 | AC-014-03 | U003、承認権限なし | FORBIDDEN | 未実施 |
| UT-014-04 | AC-014-04 | U002、approved申請 | ALREADY_PROCESSED | 未実施 |
| UT-014-05 | AC-014-05 | 監査保存処理が例外 | ロールバック処理が呼ばれる | 未実施 |

テストデータには実在する利用者情報を使わない。同時要求と実DBでのロールバックは結合テストで別途検証する。

## 2. 自動テストコード例

以下は説明用の純粋関数とNode.js組込みテストの例。実APIの認証・DB処理を検証するコードではない。実案件では対象モジュールをimportし、実装とテストを分離する。

```javascript
const test = require('node:test');
const assert = require('node:assert/strict');

function canApprove(actor, expense) {
  if (!actor.canApprove) return 'FORBIDDEN';
  if (actor.id === expense.applicantId) return 'SELF_APPROVAL';
  if (expense.status !== 'submitted') return 'ALREADY_PROCESSED';
  return 'OK';
}

test('REQ-014: 承認権限があっても自己承認は拒否', () => {
  const actor = { id: 'U001', canApprove: true };
  const expense = { applicantId: 'U001', status: 'submitted' };
  assert.equal(canApprove(actor, expense), 'SELF_APPROVAL');
});
```

例の利用方法: 上記をapproval-example.test.cjsとして保存し、対応するNode.js環境でnode --test approval-example.test.cjsを実行する。実案件の成功証跡とは分けて保存する。

## 3. 実行結果テンプレート

対象コミット: {{COMMIT_SHA}} / 実行環境: {{TEST_ENV}} / コマンド: {{UNIT_TEST_COMMAND}} / 日時: 未実施

必須ケース総数: 5 / 合格: 未計測 / 不合格: 未計測 / 未実施: 5

カバレッジ: 対象モジュール、行・分岐、除外理由、測定ツールを記録。実測値: 未計測。自社目標: {{COVERAGE_TARGET}}。高いカバレッジだけで業務上の正しさを判定しない。

## 4. 障害票の記入例（架空）

障害ID: BUG-014-EXAMPLE / ケース: UT-014-02 / 前提: U001に承認権限がある / 操作: 自分の申請を承認 / 期待: SELF_APPROVAL / 仮の症状: OKが返る

原因仮説: 権限判定だけで承認可とし、申請者との照合がない。修正案: 自己承認判定を追加。再試験: UT-014-01〜04と関連結合・E2Eケース。実際の修正コミットと結果: 未登録。

## 自社への適用・完了確認

{{TEST_FRAMEWORK}}、期待値、境界値、例外パターンを自社仕様から作る。QAが「AI生成の実装とテストが同じ誤解を共有していないか」を確認する。

レビュー担当: {{QA_OWNER}} / 完了判定: 未承認 / 証跡: {{EVIDENCE_REFERENCE}}
