# テスト方針書

## 概要

本ドキュメントは、F# コンパイラプロジェクト（dotnet/fsharp）におけるテスト方針を定義する。本プロジェクトは、F# コンパイラ、F# Core ライブラリ、F# Compiler Service、および Visual Studio 統合機能を含む大規模なコンパイラ基盤である。品質保証のため、単体テストからE2Eテスト、性能テストまで多層的なテスト戦略を採用している。

## テスト戦略

### テストレベル

| レベル | 目的 | 担当 |
| --- | --- | --- |
| 単体テスト | 個々のコンポーネント・モジュールの機能検証、コンパイラの各フェーズ（字句解析、構文解析、型チェック、コード生成）の正確性を保証 | 開発チーム |
| 結合テスト | コンパイラサービス API の統合検証、複数モジュール間の連携確認、マルチプロジェクト解析テスト | 開発チーム |
| システムテスト | エンドツーエンドビルドテスト、AOT/トリミングテスト、プラットフォーム間互換性（Windows/Linux/macOS）の検証 | 開発チーム / CI |
| 受入テスト | 言語仕様への準拠確認（Conformance テスト）、外部プロジェクトを用いたリグレッションテスト | 開発チーム / CI |

### テスト種別

| 種別 | 概要 | 実施タイミング |
| --- | --- | --- |
| 機能テスト | コンパイラ機能、言語機能、ライブラリ機能の正確性検証 | PR時 / CI |
| 性能テスト | コンパイル速度、メモリ使用量のベンチマーク（BenchmarkDotNet使用） | PR時 / 定期実行 |
| 回帰テスト | 外部オープンソースプロジェクト（FSharpPlus, IcedTasks, FsToolkit.ErrorHandling等）を用いた互換性検証 | PR時 / CI |
| 決定性テスト | ビルド結果の決定性（Determinism）検証 | PR時 |
| コード品質テスト | コードフォーマット検査（Fantomas）、エラーコードソート検証 | PR時 |
| ILVerify | 生成されたILの検証 | PR時 |
| AOTテスト | トリミング・Ahead-of-Time コンパイルの検証 | PR時 |

## テスト環境

| 環境 | 用途 | 構成 |
| --- | --- | --- |
| Windows (VS2026 Preview) | 主要開発・テスト環境、.NET Framework 4.7.2 および .NET Core テスト | Azure DevOps プール: windows.vs2026preview.scout.amd64 |
| Linux (Azure Linux 3) | クロスプラットフォーム検証、.NET Core テスト | Azure DevOps プール: build.azurelinux.3.amd64.open |
| macOS (latest) | クロスプラットフォーム検証、.NET Core テスト | Azure DevOps VM イメージ: macos-latest |

## テストツール

| ツール | 用途 | バージョン |
| --- | --- | --- |
| xUnit | 単体テストフレームワーク | プロジェクト定義に依存 |
| FsCheck | プロパティベーステスト | プロジェクト定義に依存 |
| BenchmarkDotNet | 性能ベンチマーク | プロジェクト定義に依存 |
| Fantomas | コードフォーマット検証 | dotnet tool |
| ILVerify | IL検証 | dotnet tool |
| Microsoft.NETCore.ILDAsm | IL逆アセンブル | NuGet パッケージ |
| Microsoft.NETCore.ILAsm | ILアセンブル | NuGet パッケージ |
| Microsoft.DiaSymReader.PortablePdb | PDB読み取り | NuGet パッケージ |

## カバレッジ目標

| 対象 | 目標値 |
| --- | --- |
| 行カバレッジ | 明示的な目標値は設定されていない（コードカバレッジツールは標準構成に含まれていない） |
| 分岐カバレッジ | 明示的な目標値は設定されていない |

備考: 本プロジェクトでは、カバレッジ率よりも言語仕様への準拠（Conformance テスト）と実際のプロジェクトでの動作確認（リグレッションテスト）を重視した品質保証戦略を採用している。

## テストデータ

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

1. **インラインテストデータ**: 多くのテストケースでは、F# ソースコードをインラインで定義し、動的にコンパイル・検証を行う
2. **ベースラインファイル (.bsl)**: IL出力やエラーメッセージの期待値を `.bsl` ファイルとして管理
3. **テストプロジェクト**: `tests/service/data/` 配下にテスト用のサンプルプロジェクトを配置
4. **外部プロジェクト**: リグレッションテストでは、GitHub上の実際のF#プロジェクトをクローンしてビルド検証を実施

## 不具合管理

### 不具合管理方法

1. **GitHub Issues**: すべての不具合は GitHub Issues で管理
2. **Azure DevOps 連携**: CI/CD パイプラインでのテスト失敗は Azure DevOps 上で追跡
3. **テスト結果の公開**: XUnit 形式のテスト結果は `PublishTestResults` タスクで Azure DevOps に公開
4. **アーティファクト保存**: テストログ、ダンプファイル、ビルドログ（binlog）は失敗時にアーティファクトとして保存

## CI/CD連携

### Azure Pipelines 構成

本プロジェクトでは Azure Pipelines を使用した継続的インテグレーション・継続的デリバリーを実施している。

#### PRビルド (`azure-pipelines-PR.yml`)

| ジョブ | 説明 |
| --- | --- |
| Determinism_Debug | ビルドの決定性検証（Debug構成） |
| CheckCodeFormatting | コードフォーマット（Fantomas）とエラーコードソート検証 |
| Check_Published_Package_Versions | NuGetパッケージバージョンの重複チェック |
| WindowsLangVersionPreview | プレビュー言語バージョンでのビルド検証 |
| WindowsNoRealsig_testCoreclr | .NET Core ランタイムでのテスト実行 |
| WindowsNoRealsig_testDesktop | .NET Framework ランタイムでのテスト実行（4並列） |
| WindowsStrictIndentation | strict-indentation+ オプションでのビルド検証 |
| WindowsNoStrictIndentation | strict-indentation- オプションでのビルド検証 |
| WindowsCompressedMetadata | 圧縮メタデータ付きビルドとテスト（CoreCLR, VS, TransparentCompiler） |
| WindowsCompressedMetadata_Desktop | 圧縮メタデータ付きデスクトップテスト（4並列） |
| MockOfficial | OfficialBuildIdを使用した模擬公式ビルド |
| Linux | Linuxプラットフォームでのビルドとテスト |
| MacOS | macOSプラットフォームでのビルドとテスト |
| EndToEndBuildTests | エンドツーエンドビルドテスト |
| Plain_Build_* | FSharp.Compiler.Service.sln の単純ビルド（Windows/Linux/macOS） |
| Benchmarks | 高速ベンチマークのスモークテスト |
| Build_And_Test_AOT_Windows | AOT/トリミングテスト |
| ILVerify | IL検証テスト |
| リグレッションテスト | 外部プロジェクト（FSharpPlus, IcedTasks, FsToolkit.ErrorHandling, OpenTK, Prime, Nu等）のビルド検証 |

#### 公式ビルド (`azure-pipelines.yml`)

| ステージ | 説明 |
| --- | --- |
| build | 署名付きビルド、ローカライゼーション、テスト実行 |
| post-build | シンボル検証、SDL検証 |
| VS Insertion | Visual Studio への挿入 |

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

```bash
# Windows - すべてのテスト（統合・AOT除く）
eng\CIBuild.cmd -configuration Release -testAllButIntegrationAndAot

# Windows - CoreCLR テストのみ
eng\CIBuild.cmd -configuration Release -testCoreclr

# Windows - Desktop テストのみ
eng\CIBuild.cmd -configuration Release -testDesktop

# Linux/macOS
./eng/cibuild.sh --configuration Release --testcoreclr
```

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

### 主要テストプロジェクト

| プロジェクト | 対象 | テスト種別 |
| --- | --- | --- |
| FSharp.Compiler.Service.Tests | F# Compiler Service API | 単体テスト、結合テスト |
| FSharp.Compiler.ComponentTests | コンパイラコンポーネント | 単体テスト、Conformanceテスト、EmittedILテスト |
| FSharp.Core.UnitTests | FSharp.Core ライブラリ | 単体テスト |
| FSharp.Build.UnitTests | FSharp.Build MSBuild タスク | 単体テスト |
| FSharp.Compiler.Private.Scripting.UnitTests | スクリプティング機能 | 単体テスト |
| FSharp.Compiler.LanguageServer.Tests | Language Server Protocol | 単体テスト |
| VisualFSharp.UnitTests | Visual Studio 統合 | 単体テスト |
| FSharp.Editor.Tests | VS Editor 統合 | 単体テスト |
| FSharpSuite.Tests | F# テストスイート | 結合テスト |
| EndToEndBuildTests | E2Eビルド検証 | システムテスト |
| AheadOfTime Tests | AOT/トリミング | システムテスト |
| FSharp.Compiler.Benchmarks | パフォーマンス | 性能テスト |

### テストユーティリティ

- **FSharp.Test.Utilities**: 共通テストユーティリティ、コンパイラアサーション、プロジェクト生成ヘルパー

## 備考

### テスト並列実行

- xUnit の `parallelizeAssembly: true` 設定により、テストはアセンブリレベルで並列実行される
- Desktop テストは Azure Pipelines 上で4並列ジョブとして実行される

### テストのスキップ

- プラットフォーム依存のテストは条件付きコンパイル (`Condition="'$(OS)' == 'Unix'"`) で制御
- 一部のテストは `SkipTests` 変数で CI 上でスキップ可能

### 決定性ビルド

- `eng\test-determinism.cmd` スクリプトでビルドの決定性を検証
- 同一入力から同一出力が生成されることを保証

### 外部プロジェクトリグレッションテスト

以下の外部プロジェクトを使用したリグレッションテストを実施:
- FSharpPlus
- IcedTasks
- FsToolkit.ErrorHandling
- OpenTK
- Prime
- Nu

これらのテストにより、実際のF#プロジェクトでの互換性を確認している。
