# テスト方針書

## 概要

本ドキュメントは、Avalonia UIフレームワークプロジェクトにおけるテスト戦略、テスト環境、およびテスト実行方法を定義する。Avaloniaは.NETベースのクロスプラットフォームUIフレームワークであり、Windows、macOS、Linux、iOS、Android、WebAssemblyなど複数のプラットフォームをサポートしている。本テスト方針は、これらすべてのプラットフォームでの品質保証を目的としている。

## テスト戦略

### テストレベル

| レベル | 目的 | 担当 |
| --- | --- | --- |
| 単体テスト | 個々のコンポーネント・クラス・メソッドの正確性を検証する。コントロール、レイアウト、データバインディング、マークアップパーサーなどの機能単位をテストする。 | 開発者 |
| 結合テスト | 複数のコンポーネント間の相互作用を検証する。レンダリングパイプライン、スタイリングシステム、XAMLローダーとコントロールの統合などをテストする。 | 開発者 |
| システムテスト | 完全なアプリケーションとしての動作を検証する。Appiumを使用したUI自動化テスト、プラットフォーム固有の統合テストを実施する。 | QAチーム / 開発者 |
| 受入テスト | エンドユーザー観点での機能検証。ビジュアル回帰テスト（レンダリング結果の画像比較）を含む。 | QAチーム / ステークホルダー |

### テスト種別

| 種別 | 概要 | 実施タイミング |
| --- | --- | --- |
| 機能テスト | コントロールの動作、イベント処理、データバインディング、スタイリングなどの機能検証 | 開発時・PR作成時・CI/CD |
| 性能テスト | レイアウト計算、スタイル適用、レンダリング、コンポジションのベンチマーク測定。BenchmarkDotNetを使用。 | リリース前・パフォーマンス改善時 |
| レンダリングテスト | グラフィック出力の正確性を画像比較により検証（Skiaバックエンド） | 開発時・PR作成時・CI/CD |
| メモリリークテスト | コントロールやリソースの適切な解放を検証。WeakReferenceを使用したリーク検出。 | 開発時・PR作成時・CI/CD |
| ビルドテスト | 各プラットフォーム向けビルドの成功を検証（iOS、Android、Browser、Desktop、NativeAOT） | CI/CD |
| 統合テスト | プラットフォーム固有のAPI（Win32、Appium）との統合を検証 | CI/CD・プラットフォーム固有パイプライン |
| セキュリティテスト | 入力検証、XAMLパース時のセキュリティを検証 | リリース前 |

## テスト環境

| 環境 | 用途 | 構成 |
| --- | --- | --- |
| Linux (Ubuntu 24.04) | 単体テスト・ビルド検証 | Azure Pipelines ubuntu-24.04 VMイメージ、.NET 10.0 SDK、.NET 8.0 Runtime |
| macOS 15 | 単体テスト・ネイティブビルド・統合テスト | Azure Pipelines macos-15 VMイメージ、Xcode 26.0、.NET 10.0 SDK |
| Windows 2025 | 単体テスト・ビルド検証・統合テスト | Azure Pipelines windows-2025 VMイメージ、.NET 10.0 SDK、WinAppDriver |
| macOS (自己ホスト) | Appium統合テスト | AvaloniaMacPool、Appium、Xcode 15.2 |

## テストツール

| ツール | 用途 | バージョン |
| --- | --- | --- |
| xUnit.v3 | 単体テストフレームワーク（主要） | 3.2.1 |
| NUnit | 単体テストフレームワーク（Headlessテスト用） | 4.4.0 |
| Moq | モックライブラリ | 4.20.72 |
| BenchmarkDotNet | パフォーマンスベンチマーク | 0.15.6 |
| Appium.WebDriver | UI自動化テスト | 4.4.5 / 5.2.0 (Appium2) |
| Microsoft.NET.Test.Sdk | テスト実行基盤 | 18.0.1 |
| Microsoft.Testing.Extensions.TrxReport | テスト結果レポート | 2.0.2 |
| Microsoft.Reactive.Testing | リアクティブ拡張テスト | 6.1.0 |
| SixLabors.ImageSharp | 画像比較（レンダリングテスト） | 2.1.12 |
| WinAppDriver | Windows UI自動化 | Azure DevOps タスク経由 |
| Nuke.GlobalTool | ビルドオーケストレーション | 9.0.4 |

## カバレッジ目標

| 対象 | 目標値 |
| --- | --- |
| 行カバレッジ | 明示的な目標値は設定されていないが、主要コントロール・コア機能の網羅的テストを推奨 |
| 分岐カバレッジ | 主要ロジックパスのカバレッジを確保 |

**備考**: 本プロジェクトでは、カバレッジ数値よりもテストの品質と網羅性を重視している。特に以下の領域での高いカバレッジを目標とする：
- コントロールの状態遷移
- レイアウト計算ロジック
- データバインディング
- XAMLパーサー
- レンダリングパイプライン

## テストデータ

テストデータの準備方針：

1. **埋め込みリソース**: フォントファイル（.ttf）、テスト用PNG画像、XAMLファイルはテストプロジェクトに埋め込みリソースとして含める
2. **期待画像ファイル**: レンダリングテスト用の期待結果画像は `tests/TestFiles/` ディレクトリに格納
3. **テストフィクスチャ**: `Avalonia.UnitTests` プロジェクトで共通のテストヘルパー、モックオブジェクト、テストルートを提供
4. **テストビュー**: XAMLベースのテストビューは `Views/` サブディレクトリに配置

## 不具合管理

不具合の管理方法：

1. **GitHub Issues**: 不具合はGitHub Issuesで管理し、適切なラベル（bug, regression等）を付与
2. **CIでの検出**: Azure Pipelinesでのテスト失敗はTRX形式でレポートされ、Azure DevOpsで可視化
3. **リグレッション防止**: 修正された不具合には対応するテストケースを追加
4. **ビジュアルリグレッション**: レンダリングテストの期待画像との差異で視覚的な回帰を検出

## CI/CD連携

CI/CDパイプラインでのテスト実行について：

### Azure Pipelines メインパイプライン (`azure-pipelines.yml`)

| ジョブ | プラットフォーム | 実行内容 |
| --- | --- | --- |
| GetPRNumber | Linux | バージョン情報出力 |
| Linux | Ubuntu 24.04 | ワークロードインストール (android, macos, wasm-tools)、ビルド、テスト実行 |
| macOS | macOS 15 | ワークロードインストール、ネイティブコード生成、Xcodeビルド、テスト実行 |
| Windows | Windows 2025 | ワークロードインストール、Nukeビルド、テスト実行 |

### 統合テストパイプライン (`azure-pipelines-integrationtests.yml`)

| ジョブ | プラットフォーム | 実行内容 |
| --- | --- | --- |
| Mac | 自己ホストプール | IntegrationTestAppビルド、Appium経由の統合テスト |
| Windows | Windows 2025 | WinAppDriver起動、Win32統合テスト、Appium統合テスト |

### テスト結果公開

- **フォーマット**: VSTest (TRX)
- **出力先**: `$(Build.SourcesDirectory)/artifacts/test-results/*.trx`
- **公開タスク**: `PublishTestResults@2`

### ビルドコマンド

```bash
# Linux
./build.sh --target CiAzureLinux --configuration=Release

# macOS
./build.sh --target CiAzureOSX --configuration Release --skip-previewer

# Windows
nuke --target CiAzureWindows --configuration Release
```

## テストプロジェクト構成

| プロジェクト | 種別 | 説明 |
| --- | --- | --- |
| Avalonia.Base.UnitTests | 単体 | 基本クラス、プロパティシステムのテスト |
| Avalonia.Controls.UnitTests | 単体 | UIコントロールのテスト |
| Avalonia.Markup.UnitTests | 単体 | マークアップパーサーのテスト |
| Avalonia.Markup.Xaml.UnitTests | 単体 | XAMLパーサーのテスト |
| Avalonia.Skia.UnitTests | 単体 | Skiaレンダリングバックエンドのテスト |
| Avalonia.Skia.RenderTests | レンダリング | 画像比較によるレンダリング検証 |
| Avalonia.LeakTests | メモリ | メモリリーク検出テスト |
| Avalonia.Benchmarks | 性能 | BenchmarkDotNetによるパフォーマンス計測 |
| Avalonia.IntegrationTests.Appium | 統合 | Appiumを使用したUI自動化テスト |
| Avalonia.IntegrationTests.Win32 | 統合 | Win32 API統合テスト |
| Avalonia.Generators.Tests | 単体 | ソースジェネレーターのテスト |
| Avalonia.DesignerSupport.Tests | 単体 | デザイナーサポートのテスト |
| Avalonia.Build.Tasks.UnitTest | 単体 | MSBuildタスクのテスト |
| Avalonia.Headless.*.UnitTests | 単体 | ヘッドレス実行環境のテスト |
| BuildTests.* | ビルド | 各プラットフォーム向けビルド検証 |

## 備考

1. **ターゲットフレームワーク**: テストは主に `net10.0` をターゲットとし、レガシーサポートとして `net8.0` も対象
2. **プラットフォーム固有テスト**: `PlatformFactAttribute` を使用してプラットフォーム固有のテストを制御
3. **リリースビルド専用テスト**: `ReleaseFactAttribute` を使用してリリースビルドでのみ実行されるテストを定義（特にメモリリークテスト）
4. **Headlessテスト**: UIレンダリングなしでテストを実行するための `Avalonia.Headless` 基盤を提供
5. **CLAボット**: コントリビューター向けにCLA（Contributor License Agreement）ボットがGitHub Actionsで動作
