# テスト方針書

## 概要

本ドキュメントは、InvenTreeモバイルアプリケーション（Flutter製）のテスト方針を定義する。プロジェクトでは単体テストを中心に、静的解析・CI/CDパイプラインを活用した品質管理体制を構築している。

## テスト戦略

### テストレベル

| レベル | 目的 | 担当 |
| --- | --- | --- |
| 単体テスト | 個別のクラス・関数・モジュールの動作検証 | 開発者 |
| 結合テスト | APIとの連携、複数コンポーネント間の連携検証 | 開発者 |
| システムテスト | アプリケーション全体の機能検証（手動） | QA / 開発者 |
| 受入テスト | ユーザー観点での機能確認（手動） | プロダクトオーナー / QA |

### テスト種別

| 種別 | 概要 | 実施タイミング |
| --- | --- | --- |
| 機能テスト | 各機能が要件通りに動作するか検証 | 開発時・PR時 |
| 静的解析 | コード品質・スタイルの自動チェック | PR時・CI実行時 |
| セキュリティテスト | 脆弱性スキャン・依存関係の監査 | 定期的に手動実施 |

## テスト環境

| 環境 | 用途 | 構成 |
| --- | --- | --- |
| ローカル開発環境 | 開発者による単体テスト実行 | Flutter SDK 3.32.4 + FVM + ローカルInvenTreeサーバー |
| CI環境（GitHub Actions） | 自動テスト実行 | ubuntu-latest / macos-latest、InvenTreeサーバーをCI内で起動 |
| InvenTreeテストサーバー | API結合テスト用 | http://localhost:8000（CI内でDockerまたはローカルサーバー起動） |

## テストツール

| ツール | 用途 | バージョン |
| --- | --- | --- |
| flutter_test | Flutter標準の単体テスト・ウィジェットテスト | SDK同梱 |
| test | Dart標準テストパッケージ | ^1.22.0 |
| lint | 静的解析ルールパッケージ | ^2.1.2 |
| flutter analyze | 静的解析実行 | Flutter SDK同梱 |
| dart format | コードフォーマット検証 | Dart SDK同梱 |
| Coveralls | コードカバレッジレポート・可視化 | GitHub Action |
| pre-commit | コミット前のフォーマットチェック | ローカル |

## カバレッジ目標

| 対象 | 目標値 |
| --- | --- |
| 行カバレッジ | 明示的な目標値なし（Coverallsで計測・可視化） |
| 分岐カバレッジ | 明示的な目標値なし |

**備考**: 現時点でカバレッジ目標値は明示されていないが、CI実行時に `flutter test --coverage` で計測し、Coverallsにレポートを送信している。

## テストデータ

テストデータは以下の方法で準備する：

1. **InvenTreeテストサーバー**: CIパイプラインでInvenTreeサーバーを起動し、`invoke dev.import-fixtures` でテスト用フィクスチャデータをインポート
2. **モック**: `setup.dart` でパスプロバイダーなどのプラットフォーム依存をモック化
3. **テストプロファイル**: `UserProfile` を動的に作成し、テスト用サーバー（localhost:8000）への接続情報を設定

### テストデータ構成

| データ種別 | 用途 | 管理場所 |
| --- | --- | --- |
| InvenTreeフィクスチャ | API結合テスト用マスターデータ | InvenTreeサーバーリポジトリ |
| UserProfile | 認証・接続テスト用プロファイル | test/setup.dart で動的生成 |
| モックデータ | ユニットテスト用 | 各テストファイル内で定義 |

## 不具合管理

1. **GitHub Issues**: 不具合はGitHub Issuesで管理
2. **Sentry**: 本番環境でのエラー監視・自動報告（sentry_flutter: 8.14.2）
3. **CIによる検出**: PRマージ前にテスト・静的解析で検出

## CI/CD連携

### GitHub Actionsワークフロー

| ワークフロー | トリガー | 実行内容 |
| --- | --- | --- |
| CI (ci.yaml) | push/PR to master | 静的解析、単体テスト、カバレッジ計測 |
| Android (android.yaml) | push/PR to master | Androidビルド検証（APK作成） |
| iOS (ios.yaml) | push/PR to master | iOSビルド検証 |

### CIパイプラインの流れ（ci.yaml）

1. **コードチェックアウト**: サブモジュール含む
2. **環境セットアップ**: Python 3.11、Java 11、Flutter（FVM経由）
3. **翻訳ファイル収集**: `collect_translations.py` 実行
4. **静的解析テスト**:
   - `flutter analyze` による静的解析
   - `dart format --set-exit-if-changed` によるフォーマット検証
5. **InvenTreeサーバー起動**: 依存関係インストール、マイグレーション、フィクスチャインポート
6. **単体テスト実行**: `flutter test --coverage`
7. **カバレッジレポート送信**: Coverallsへアップロード

## テストファイル構成

```
test/
├── setup.dart              # テスト環境セットアップ・ヘルパー
├── api_test.dart           # API接続・認証テスト
├── models_test.dart        # モデル（Part、Category等）のAPIテスト
├── barcode_test.dart       # バーコードスキャン機能テスト
├── preferences_test.dart   # 設定管理テスト
├── user_profile_test.dart  # ユーザープロファイル管理テスト
├── wedge_scanner_test.dart # ウェッジスキャナー（キーボード入力）テスト
└── widget_test.dart        # ウィジェットテスト（現在空）
```

## 備考

### 現在の課題・推奨事項

1. **E2Eテストの不在**: 現在、end-to-endテストフレームワーク（integration_test等）は導入されていない
2. **ウィジェットテストの拡充**: `widget_test.dart` は空の状態であり、UI層のテスト拡充が望ましい
3. **カバレッジ目標の明確化**: 具体的なカバレッジ目標値を設定することを推奨
4. **テストサーバー依存**: 一部のテストはInvenTreeサーバーへの接続を必要とし、完全なオフライン実行ができない

### pre-commitフック

ローカル開発環境では `.pre-commit-config.yaml` により、コミット前に `dart format` が自動実行される。
