# テスト方針書

## 概要

本ドキュメントは、InvenTreeプロジェクトにおけるテスト戦略、テスト環境、テストツール、およびCI/CD連携について定義します。InvenTreeは、Djangoベースのバックエンド（Python）とReactベースのフロントエンド（TypeScript）で構成される在庫管理システムであり、両レイヤーに対して包括的なテスト体制を整備しています。

## テスト戦略

### テストレベル

| レベル | 目的 | 担当 |
| --- | --- | --- |
| 単体テスト | 個々のモデル、ビュー、APIエンドポイント、ユーティリティ関数の動作検証 | 開発者 |
| 結合テスト | モジュール間連携、データベース操作、プラグインシステムの統合検証 | 開発者 |
| システムテスト | E2Eテストによるフロントエンド・バックエンド全体の動作検証 | QA/開発者 |
| 受入テスト | ユーザーシナリオに基づく機能検証、デモデータセットによる実環境テスト | QA |

### テスト種別

| 種別 | 概要 | 実施タイミング |
| --- | --- | --- |
| 機能テスト | APIエンドポイント、モデル操作、ビューの機能検証 | 開発時・PR作成時 |
| 性能テスト | クエリ数制限（MAX_QUERY_COUNT=250）、実行時間制限（MAX_QUERY_TIME=7.5s）によるパフォーマンス監視 | 開発時・CI |
| セキュリティテスト | 認証・認可テスト、権限ベースアクセス制御の検証 | 開発時・PR作成時 |
| マイグレーションテスト | データベースマイグレーションの整合性検証（タグ: migration_test） | 専用テスト実行時 |
| 翻訳テスト | 国際化対応の検証 | 専用テスト実行時 |

## テスト環境

| 環境 | 用途 | 構成 |
| --- | --- | --- |
| ローカル開発環境 | 開発者によるローカルテスト | SQLite/PostgreSQL、Django開発サーバー、Vite開発サーバー |
| Docker環境 | コンテナ化されたテスト環境 | PostgreSQL 17、Redis 7、Gunicorn、Caddy |
| CI環境（GitHub Actions） | 自動テスト実行 | GitHub-hosted runners、並列ワーカー（最大3） |
| デモデータ環境 | 実データに近い環境でのテスト | demo-datasetリポジトリからのデータ投入 |

## テストツール

### バックエンド（Python/Django）

| ツール | 用途 | バージョン |
| --- | --- | --- |
| pytest | テスト実行フレームワーク | 9.0.2 |
| pytest-django | DjangoテストのPytestサポート | 4.11.1 |
| coverage | コードカバレッジ計測 | 7.13.1 |
| django-test-migrations | マイグレーションテスト | 1.5.0 |
| django-slowtests | 遅いテストのレポート | 1.1.1 |
| pytest-codspeed | パフォーマンス計測 | 4.2.0 |
| Django TestCase | Django標準テストケース | Django内蔵 |
| REST Framework APITestCase | API テスト | DRF内蔵 |

### フロントエンド（TypeScript/React）

| ツール | 用途 | バージョン |
| --- | --- | --- |
| Playwright | E2Eテストフレームワーク | 1.56.0 |
| nyc | カバレッジ計測（Istanbul） | 17.1.0 |
| Vite | テスト用ビルドツール | 7.1.11 |

## カバレッジ目標

| 対象 | 目標値 |
| --- | --- |
| 行カバレッジ | プロジェクト全体で測定（具体的な目標値は明示されていない） |
| 分岐カバレッジ | 重要パスを優先的にカバー |

### カバレッジ計測設定

```toml
[tool.coverage.run]
source = ["src/backend/InvenTree", "InvenTree"]
dynamic_context = "test_function"

[tool.coverage.html]
show_contexts = true
```

## テストデータ

### フィクスチャファイル

InvenTreeでは、YAMLおよびJSON形式のフィクスチャファイルを使用してテストデータを管理しています。

| モジュール | フィクスチャ |
| --- | --- |
| order | order.yaml, return_order.yaml, sales_order.yaml |
| part | bom.yaml, category.yaml, params.yaml, part_pricebreaks.yaml, part.yaml, test_templates.yaml |
| users | users.yaml |
| common | 共通設定フィクスチャ |
| build | ビルド関連フィクスチャ |

### テストデータ準備方針

1. **フィクスチャ使用**: テストクラスで`fixtures`属性を指定し、必要なデータをロード
2. **setUpTestData**: クラスレベルでテストデータを一度だけ作成（パフォーマンス最適化）
3. **デモデータセット**: `invoke setup-test`コマンドで実環境に近いデータをセットアップ可能

### テストユーザーとロール

```python
# テストユーザー設定例
username = 'testuser'
password = 'mypassword'
email = 'test@testing.com'
superuser = False
is_staff = True
auto_login = True
roles = []  # または 'all' で全ロール付与
```

## 不具合管理

### テスト失敗時の対応

1. **CI自動リトライ**: CI環境では最大3回のリトライを実施
2. **ローカル確認**: 開発者はローカルで再現・修正
3. **GitHub Issues**: 持続的な問題はIssueとして管理

### テスト除外タグ

- `migration_test`: マイグレーションテストを除外（通常実行時）
- `performance_test`: パフォーマンステストを除外（通常実行時）

## CI/CD連携

### テスト実行コマンド

```bash
# 基本的なテスト実行
invoke test

# 特定のテストを実行
invoke test --runtest=company.test_api

# カバレッジ付きテスト
invoke test --coverage

# pytestを使用したテスト
invoke test --pytest

# マイグレーションテストを含める
invoke test --migrations

# 遅いテストのレポート
invoke test --report

# テストデータベースを保持
invoke test --keepdb
```

### テスト対象アプリケーション

以下のDjangoアプリケーションがテスト対象となります：

- build
- common
- company
- importer
- machine
- order
- part
- report
- stock
- users
- plugin
- InvenTree
- generic

### Playwrightテスト設定（フロントエンドE2E）

```typescript
// playwright.config.ts
{
  testDir: './tests',
  fullyParallel: false,
  timeout: 90000,
  retries: IS_CI ? 3 : 0,
  workers: IS_CI ? 3 : 1,
  projects: [
    { name: 'chromium', use: { ...devices['Desktop Chrome'] } },
    { name: 'firefox', use: { ...devices['Desktop Firefox'] } }
  ]
}
```

### E2Eテスト構成

| テストファイル | 対象機能 |
| --- | --- |
| pui_login.spec.ts | ログイン・認証 |
| pui_settings.spec.ts | 設定画面 |
| pui_part.spec.ts | 部品管理 |
| pui_stock.spec.ts | 在庫管理 |
| pui_build.spec.ts | ビルド管理 |
| pui_purchase_order.spec.ts | 購買発注 |
| pui_sales_order.spec.ts | 販売受注 |
| pui_company.spec.ts | 会社管理 |
| pui_dashboard.spec.ts | ダッシュボード |
| pui_tables.spec.ts | テーブルコンポーネント |
| pui_forms.spec.ts | フォームコンポーネント |
| pui_modals.spec.ts | モーダルコンポーネント |
| pui_plugins.spec.ts | プラグイン機能 |
| pui_machines.spec.ts | マシン管理 |
| pui_permissions.spec.ts | 権限管理 |
| pui_importing.spec.ts | インポート機能 |
| pui_exporting.spec.ts | エクスポート機能 |
| pui_printing.spec.ts | 印刷機能 |

## 備考

### テストベースクラス

InvenTreeでは、以下のカスタムテストベースクラスを提供しています：

| クラス | 用途 |
| --- | --- |
| InvenTreeTestCase | 基本的なDjangoテストケース（UserMixin、ExchangeRateMixin、PluginRegistryMixin含む） |
| InvenTreeAPITestCase | APIテスト用（TestQueryMixin追加） |
| InvenTreeAPIPerformanceTestCase | パフォーマンステスト用（厳格なクエリ制限） |
| AdminTestCase | Django Adminインターフェーステスト用 |

### クエリ数制限

パフォーマンス監視のため、以下の制限が設定されています：

- 通常テスト: MAX_QUERY_COUNT = 250
- 警告閾値: WARNING_QUERY_THRESHOLD = 100
- パフォーマンステスト: MAX_QUERY_COUNT = 50
- クエリ時間制限: MAX_QUERY_TIME = 7.5秒（パフォーマンステスト: 60秒）

### Mixinクラス

| Mixin | 機能 |
| --- | --- |
| UserMixin | テストユーザーの作成・ログイン・ロール管理 |
| PluginMixin | プラグインのロード確認 |
| ExchangeRateMixin | 為替レートテストデータ生成 |
| TestQueryMixin | クエリ数・時間の検証 |
| PluginRegistryMixin | プラグインレジストリの初期化待機 |
| PartImageTestMixin | 部品画像アップロードテスト用 |
