テスト観点表のイメージがわかない方もいると思いますが、以下のようなものです。
```
## サンプル1:メールアドレスバリデーション
### 機能概要
メールアドレスの形式が正しいかチェックする関数
### テスト観点表
| No | 分類 | テストするパターン | 入力例 | 期待される結果 | 備考 |
|----|------|-------------------|--------|---------------|------|
| 1 | 正常系 | 標準的なメールアドレス | `user@example.com` | `true` ✅ | 最も一般的なケース |
| 2 | 正常系 | 短いメールアドレス | `a@b.co` | `true` ✅ | 最小構成 |
| 3 | 正常系 | 長いメールアドレス | `verylongusername@verylongdomain.com` | `true` ✅ | 通常の範囲内 |
| 4 | 正常系 | ドット・ハイフン含む | `user.name@ex-ample.com` | `true` ✅ | 特殊文字を含む |
| 5 | 境界値 | 最大長(320文字) | `a...
@b...com`(320文字) | `true` ✅ | RFC仕様の上限 |
| 6 | 境界値 | 最大長 1(321文字) | `a...
@b...com`(321文字) | `false` ❌ | 上限超過 |
| 7 | 異常系 | 空文字列 | `""` | `false` ❌ | 入力なし |
| 8 | 異常系 | @なし | `
userexample.com` | `false` ❌ | 必須文字欠落 |
| 9 | 異常系 | @が複数 | `user@@example.com` | `false` ❌ | 不正な形式 |
| 10 | 異常系 | ドメインに.なし | `user@example` | `false` ❌ | ドメイン不完全 |
| 11 | 異常系 | @の前が空 | `
@example.com` | `false` ❌ | ローカル部なし |
| 12 | 異常系 | @の後が空 | `user@` | `false` ❌ | ドメインなし |
| 13 | 異常系 | スペース含む | `user
@example.com` | `false` ❌ | 不正な文字 |
| 14 | 異常系 | 全角文字 | `ユーザー
@example.com` | `false` ❌ | 不正な文字 |
| 15 | 異常系 | 絵文字 | `user😀
@example.com` | `false` ❌ | 不正な文字 |
| 16 | 型違い | null | `null` | `TypeError` ⚠️ | 型エラー |
| 17 | 型違い | undefined | `undefined` | `TypeError` ⚠️ | 型エラー |
| 18 | 型違い | 数値 | `123` | `TypeError` ⚠️ | 型エラー |
---
## サンプル2:商品合計金額計算
### 機能概要
商品リストから合計金額を計算し、税込価格を返す関数
### テスト観点表
| No | 分類 | テストするパターン | 入力例 | 期待される結果 | 備考 |
|----|------|-------------------|--------|---------------|------|
| 1 | 正常系 | 単品 | `[{price: 1000, qty: 1}]` | `1100` | 1000円 × 1.1 |
| 2 | 正常系 | 複数商品 | `[{price: 1000, qty: 2}, {price: 500, qty: 1}]` | `2750` | (2000 500) × 1.1 |
| 3 | 正常系 | 小数点以下切り捨て | `[{price: 333, qty: 1}]` | `366` | 366.3 → 366 |
| 4 | 境界値 | 最小価格(1円) | `[{price: 1, qty: 1}]` | `1` | 1.1 → 1 |
| 5 | 境界値 | 大量購入(数量999) | `[{price: 100, qty: 999}]` | `109890` | 境界値テスト |
| 6 | 境界値 | 高額商品(100万円) | `[{price: 1000000, qty: 1}]` | `1100000` | 大きい数値 |
| 7 | 異常系 | 空の配列 | `[]` | `ValidationError` ⚠️ | 商品なし |
| 8 | 異常系 | 価格が0 | `[{price: 0, qty: 1}]` | `ValidationError` ⚠️ | 不正な価格 |
| 9 | 異常系 | 価格が負 | `[{price: -100, qty: 1}]` | `ValidationError` ⚠️ | 不正な価格 |
| 10 | 異常系 | 数量が0 | `[{price: 1000, qty: 0}]` | `ValidationError` ⚠️ | 不正な数量 |
| 11 | 異常系 | 数量が負 | `[{price: 1000, qty: -1}]` | `ValidationError` ⚠️ | 不正な数量 |
| 12 | 異常系 | priceフィールドなし | `[{qty: 1}]` | `ValidationError` ⚠️ | 必須項目欠落 |
| 13 | 異常系 | qtyフィールドなし | `[{price: 1000}]` | `ValidationError` ⚠️ | 必須項目欠落 |
| 14 | 型違い | null | `null` | `TypeError` ⚠️ | 型エラー |
| 15 | 型違い | 配列でない | `{price: 1000, qty: 1}` | `TypeError` ⚠️ | 型エラー |
| 16 | 型違い | 価格が文字列 | `[{price: "1000", qty: 1}]` | `TypeError` ⚠️ | 型エラー |
---
## サンプル3:ユーザー登録処理
### 機能概要
ユーザー情報を検証してデータベースに登録する
### テスト観点表
| No | 分類 | テストするパターン | 入力例 | 期待される結果 | 備考 |
|----|------|-------------------|--------|---------------|------|
| 1 | 正常系 | 全項目入力 | `{email: "user@example.com", password: "Pass1234!", name: "山田太郎"}` | `User作成成功` ✅ | 標準ケース |
| 2 | 正常系 | 名前省略(任意項目) | `{email: "user@example.com", password: "Pass1234!"}` | `User作成成功` ✅ | nameなし |
| 3 | 正常系 | 最小パスワード(8文字) | `{email: "user@example.com", password: "Pass123!"}` | `User作成成功` ✅ | 境界値 |
| 4 | 正常系 | 最大パスワード(64文字) | `{email: "user@example.com", password: "Pass...!"}` | `User作成成功` ✅ | 境界値 |
| 5 | 境界値 | 名前1文字 | `{email: "user@example.com", password: "Pass1234!", name: "田"}` | `User作成成功` ✅ | 最小長 |
| 6 | 境界値 | 名前100文字 | `{email: "user@example.com", password: "Pass1234!", name: "あ×100"}` | `User作成成功` ✅ | 最大長 |
| 7 | 異常系 | emailなし | `{password: "Pass1234!", name: "山田太郎"}` | `ValidationError: Email is required` ⚠️ | 必須項目 |
| 8 | 異常系 | passwordなし | `{email: "user@example.com", name: "山田太郎"}` | `ValidationError: Password is required` ⚠️ | 必須項目 |
| 9 | 異常系 | email形式不正 | `{email: "invalid", password: "Pass1234!"}` | `ValidationError: Invalid email` ⚠️ | 形式エラー |
| 10 | 異常系 | password短い(7文字) | `{email: "user@example.com", password: "Pass12!"}` | `ValidationError: Password too short` ⚠️ | 最小長-1 |
| 11 | 異常系 | password長い(65文字) | `{email: "user@example.com", password: "Pass...!"}` | `ValidationError: Password too long` ⚠️ | 最大長 1 |
| 12 | 異常系 | password英数字のみ | `{email: "user@example.com", password: "Pass1234"}` | `ValidationError: Password must contain symbol` ⚠️ | 記号必須 |
| 13 | 異常系 | 名前101文字 | `{email: "user@example.com", password: "Pass1234!", name: "あ×101"}` | `ValidationError: Name too long` ⚠️ | 最大長 1 |
| 14 | 異常系 | email重複 | `{email: "existing@example.com", password: "Pass1234!"}` | `DuplicateEmailError` ⚠️ | DB制約違反 |
| 15 | 異常系 | DB接続エラー | `{email: "user@example.com", password: "Pass1234!"}` | `DatabaseError` ⚠️ | 外部依存失敗 |
| 16 | 型違い | 全項目null | `null` | `TypeError` ⚠️ | 型エラー |
| 17 | 型違い | emailが数値 | `{email: 123, password: "Pass1234!"}` | `TypeError` ⚠️ | 型エラー |
---
## サンプル4:日付範囲チェック
### 機能概要
予約日が予約可能期間内かをチェックする
### テスト観点表
| No | 分類 | テストするパターン | 入力例 | 期待される結果 | 備考 |
|----|------|-------------------|--------|---------------|------|
| 1 | 正常系 | 期間内(中間) | `2025-06-15`(今日: 2025-01-01) | `true` ✅ | 明日〜1年以内 |
| 2 | 正常系 | 期間開始日(明日) | `2025-01-02`(今日: 2025-01-01) | `true` ✅ | 境界値 |
| 3 | 正常系 | 期間終了日(1年後) | `2026-01-01`(今日: 2025-01-01) | `true` ✅ | 境界値 |
| 4 | 境界値 | 今日 | `2025-01-01`(今日: 2025-01-01) | `false` ❌ | 期間外(早すぎ) |
| 5 | 境界値 | 1年後 1日 | `2026-01-02`(今日: 2025-01-01) | `false` ❌ | 期間外(遅すぎ) |
| 6 | 異常系 | 過去の日付 | `2024-12-31`(今日: 2025-01-01) | `false` ❌ | 期間外 |
| 7 | 異常系 | 空文字列 | `""` | `ValidationError` ⚠️ | 入力なし |
| 8 | 異常系 | 不正な形式 | `2025/01/01` | `ValidationError` ⚠️ | 形式違い |
| 9 | 異常系 | 存在しない日付 | `2025-02-30` | `ValidationError` ⚠️ | 不正な日付 |
| 10 | 型違い | null | `null` | `TypeError` ⚠️ | 型エラー |
| 11 | 型違い | 数値 | `20250101` | `TypeError` ⚠️ | 型エラー |
---
## テスト観点表の読み方
### 記号の意味
- ✅ **成功**:処理が正常に完了
- ❌ **失敗**:妥当な理由で失敗(想定内)
- ⚠️ **例外**:エラーをスローする
### 分類の種類
- **正常系**:期待通りに動作するケース
- **境界値**:最小値・最大値・境界付近の値
- **異常系**:エラーになるべきケース
- **型違い**:型が違う場合のエラー
### 確認ポイント
1. すべてのパターンが網羅されているか
2. 境界値が適切にテストされているか
3. 異常系が正常系と同数以上あるか
4. エラーメッセージが明確か
```