# テスト方針 (Testing Strategy)

本ドキュメントでは，MiniTIAS プロジェクトのテスト方針を定義する．

## 基本方針 (Principles)

- 初期フェーズではカメラ・ストレージ等のハードウェア依存が大きいため，**実機での手動確認を主体** とする
- ハードウェアに依存しないロジック（ファイル命名，重複回避等）には **Unit テスト** を書く
- テストは `flutter test` で実行できる状態を維持する

## テストの種類と対象 (Test Types)

| 種類 | 対象 | 実施方法 |
| --- | --- | --- |
| Unit テスト | Service 層のロジック（ファイル命名，重複回避等） | `flutter test` |
| Widget テスト | 画面の基本的な UI 構成（ボタンの存在等） | `flutter test` |
| 手動確認 | カメラプレビュー，撮影，保存，削除の E2E 動作 | 実機（AQUOS sense3） |

※ Integration テスト（`flutter drive`）は初期フェーズでは導入しない．

## Unit テスト

### 対象

- `FileService` — ファイル名生成ロジック，重複回避ロジック
- `PermissionService` — パーミッション状態の判定ロジック（モック使用）

### ファイル配置

```text
test/
├── services/
│   ├── file_service_test.dart
│   └── permission_service_test.dart
└── providers/
    └── gallery_provider_test.dart
```

### 命名規則

- テストファイル名: `{対象ファイル名}_test.dart`
- テストグループ: `group('クラス名',)` でクラス単位にまとめる
- テスト名: 日本語で「〜の場合，〜する」形式

```dart
group('FileService', () {
  test('同秒のファイルが存在しない場合，サフィックスなしのファイル名を返す', () {
    // ...
  });

  test('同秒のファイルが存在する場合，連番サフィックスを付与する', () {
    // ...
  });
});
```

## Widget テスト

### 対象

- 画面に必要な UI 要素が存在すること（シャッターボタン，ナビゲーションバー等）
- ボタンタップ時に Provider のメソッドが呼ばれること（モック使用）

### 方針

- カメラプレビューはモック化する（`camera` パッケージのウィジェットは Widget テストで動作しない）
- Provider は `ChangeNotifierProvider.value` でモックを注入する

## 手動確認 (Manual Testing)

### 確認項目

実装完了時に以下を実機で確認する．

- [ ] カメラプレビューが正しく表示される（180° 回転）
- [ ] シャッターボタンで撮影できる
- [ ] 撮影画像が `Pictures/MiniTIAS/` に PNG で保存される
- [ ] ファイル名が命名規則に従っている
- [ ] 連続撮影が正常に動作する
- [ ] 一覧画面にサムネイルが表示される
- [ ] サムネイルタップで拡大表示される
- [ ] 画像の削除ができる
- [ ] パーミッション拒否時に適切なメッセージが表示される
- [ ] アプリをバックグラウンド→復帰してもカメラが正常に動作する

## テスト実行タイミング (When to Test)

| タイミング | 実施内容 |
| --- | --- |
| 機能実装完了時 | 対応する Unit / Widget テストを作成・実行 |
| コミット前 | `flutter test` を実行し全テストが通ることを確認 |
| PR 作成前 | 手動確認項目のうち関連するものを実機で確認 |
