# テスト方針書

## 概要

本ドキュメントは、Wikipedia iOS アプリケーションプロジェクトにおけるテスト方針を定義するものです。本プロジェクトは Swift および Objective-C で実装された iOS アプリケーションであり、XCTest フレームワークを中心としたテスト基盤を採用しています。テストは GitHub Actions によるCI/CDパイプラインで自動実行され、コードの品質維持と機能の安定性を保証します。

## テスト戦略

### テストレベル

| レベル | 目的 | 担当 |
| --- | --- | --- |
| 単体テスト | 個々のコンポーネント、クラス、関数の動作を検証。ビジネスロジック、データ処理、ユーティリティ関数の正確性を確認 | 開発者 |
| 結合テスト | モジュール間の連携、データコントローラとサービス層の統合、Core Data 操作の整合性を検証 | 開発者 |
| UIテスト | ユーザーインターフェースの動作確認、画面遷移、ユーザーインタラクションの検証 | 開発者 / QA |
| ビジュアルテスト | UIコンポーネントの見た目、レイアウト、異なるロケール/テーマでの表示を検証 | 開発者 / QA |
| パフォーマンステスト | 記事表示速度、コンテキストメニュー表示時間、読み込みリスト操作のパフォーマンスを測定 | 開発者 |

### テスト種別

| 種別 | 概要 | 実施タイミング |
| --- | --- | --- |
| 機能テスト | 検索、記事表示、通知、寄付、ウォッチリスト、履歴管理などの機能が仕様通り動作するかを検証 | 開発時、PR作成時 |
| 性能テスト | 記事のセットアップ時間、コンテキストメニュー構成時間、読み込みリスト作成時間を測定 | 手動実行（Performance Testing スキーム） |
| ビジュアル回帰テスト | FBSnapshotTestCase を使用したUI要素のスナップショット比較 | 開発時、PR作成時 |
| ローカライゼーションテスト | 複数言語（英語、ヘブライ語、ドイツ語、ベトナム語等）での表示確認 | UIテスト実行時 |

## テスト環境

| 環境 | 用途 | 構成 |
| --- | --- | --- |
| ローカル開発環境 | 開発中のテスト実行 | Xcode 16.4、iOS Simulator（iPhone 16等） |
| CI環境（GitHub Actions） | 自動テスト実行 | macOS-latest、Xcode 16.4、iOS 18.5、iPhone 16 Simulator |
| パフォーマンステスト環境 | 手動パフォーマンス測定 | Performance Testing スキーム、Release ビルド構成 |

## テストツール

| ツール | 用途 | バージョン |
| --- | --- | --- |
| XCTest | iOS標準テストフレームワーク。単体テスト、UIテスト、パフォーマンステストの基盤 | Xcode同梱 |
| FBSnapshotTestCase | ビジュアル回帰テスト用のスナップショットテストライブラリ | Third Party として導入 |
| Nocilla (LSNocilla) | ネットワークリクエストのスタブ・モック化 | Third Party として導入 |
| xcpretty | xcodebuild 出力の整形ツール。CI環境でのテスト結果表示に使用 | CI環境で使用 |
| fastlane snapshot | UIテストと組み合わせたスクリーンショット自動取得 | fastlane ツールチェーン |

## カバレッジ目標

| 対象 | 目標値 |
| --- | --- |
| 行カバレッジ | 明示的な目標値は設定されていない（Wikipedia.xctestplan で codeCoverage: false） |
| 分岐カバレッジ | 明示的な目標値は設定されていない |

**備考**: テストプランの設定上、コードカバレッジ収集は無効化されています。カバレッジよりもクリティカルパスの機能テストを優先している方針と考えられます。

## テストデータ

### フィクスチャファイル
テストデータは `WikipediaUnitTests/Fixtures/` ディレクトリに JSON ファイル、画像ファイル、HTML ファイルとして配置されています。

- **JSON フィクスチャ**: API レスポンスのモック（検索結果、記事サマリー、フィード応答など）
- **画像フィクスチャ**: 画像処理テスト用のサンプル画像
- **HTML フィクスチャ**: Mobile HTML レンダリングテスト用

### モックオブジェクト
- `WMFDataMocks` パッケージ: ネットワークレスポンスのモック
- `MockCLLocationManager`, `MockCLHeading`, `MockUIDevice`: デバイス関連機能のモック
- `WMFMockSuccessURLSession`, `WMFMockServerErrorSession`, `WMFMockNoInternetConnectionSession`: ネットワークセッションのモック

### リファレンス画像
ビジュアルテスト用のリファレンス画像は `WikipediaUnitTests/ReferenceImages_64/` に保存されています。異なるデバイス解像度（@2x, @3x）とロケール（LTR, RTL）に対応しています。

## 不具合管理

- **バグトラッキング**: GitHub Issues での管理が想定される（オープンソースプロジェクトの標準的な運用）
- **テスト失敗時**: CI パイプラインでテストが失敗した場合、PR のマージがブロックされる
- **フレークテスト**: 特定の不安定なテストは xctestplan でスキップ設定
  - `ArticleCacheReadingManualTests`, `ArticleManualPerformanceTests`, `ArticleViewControllerTests` など
  - パフォーマンステストは手動実行専用として分離

## CI/CD連携

### GitHub Actions ワークフロー
- **トリガー**: `main` ブランチへの Pull Request 作成時、および手動実行（workflow_dispatch）
- **並列実行**: Wikipedia、WMFComponents、WMFData の3つのスキームが並列にテストされる
- **同時実行制御**: 同一ブランチでの複数実行は最新のみ実行（cancel-in-progress: true）

### テストスキーム構成
| スキーム | テストターゲット | テストプラン |
| --- | --- | --- |
| Wikipedia | WikipediaUnitTests | Wikipedia.xctestplan |
| WMFComponents | WMFComponentsTests | WMFComponents.xctestplan |
| WMFData | WMFDataTests | WMFData.xctestplan |
| WikipediaUITests | WikipediaUITests | UITests.xctestplan |
| Performance Testing | WikipediaUnitTests（選択的） | 手動選択テスト |

### テストプラン設定
- **言語/地域**: デフォルトは英語/米国（en/US）
- **タイムゾーン**: テスト環境変数で America/New_York を設定
- **UIテスト構成**: 複数言語・テーマの組み合わせ
  - System Language (Light)
  - Hebrew (Sepia) - RTL テスト
  - German (Dark)
  - Vietnamese (Black)

## 備考

### Swift Package Manager テストターゲット
- **WMFData**: `WMFDataTests` テストターゲットを含む Swift パッケージ（swift-tools-version: 5.8）
- **WMFComponents**: `WMFComponentsTests` テストターゲットを含む Swift パッケージ（WMFDataMocks に依存）

### スキップされているテスト
以下のテストはテストプランでスキップ設定されており、CI では実行されません：
- `ArticleCacheReadingManualTests` - 手動キャッシュ読み込みテスト
- `ArticleManualPerformanceTests` - 手動パフォーマンステスト
- `LegacyCoreDataMigratorTests` - レガシーデータ移行テスト
- `ReadingListManualPerformanceTests` - 読み込みリストパフォーマンステスト
- `TalkPageManualPerformanceTests` - トークページパフォーマンステスト
- `WMFSearchFetcherTests` - 検索フェッチャーテスト

### テスト実行コマンド（ローカル）
```bash
# Wikipedia スキームのテスト実行
xcodebuild test \
  -scheme Wikipedia \
  -project Wikipedia.xcodeproj \
  -destination "platform=iOS Simulator,name=iPhone 16,OS=18.5"

# WMFData パッケージのテスト実行
xcodebuild test \
  -scheme WMFData \
  -project Wikipedia.xcodeproj \
  -destination "platform=iOS Simulator,name=iPhone 16,OS=18.5"

# WMFComponents パッケージのテスト実行
xcodebuild test \
  -scheme WMFComponents \
  -project Wikipedia.xcodeproj \
  -destination "platform=iOS Simulator,name=iPhone 16,OS=18.5"
```
