# テスト方針書

## 概要

本ドキュメントは、dbatools PowerShellモジュールのテスト方針を定義するものです。dbatoolsはSQL Server管理用のPowerShellモジュールであり、700以上のコマンドレットを提供しています。本プロジェクトでは、Pester v5テストフレームワークを使用した自動テストと、AppVeyor/GitHub Actionsを活用したCI/CDパイプラインによる継続的テストを実施しています。

## テスト戦略

### テストレベル

| レベル | 目的 | 担当 |
| --- | --- | --- |
| 単体テスト (UnitTests) | 個々のコマンドレットのパラメータ検証、基本ロジックの確認 | 開発者 |
| 結合テスト (IntegrationTests) | 実際のSQL Serverインスタンスに対するコマンド実行、複数コマンド間の連携確認 | 開発者/CI |
| コンプライアンステスト (Compliance) | コーディング規約準拠、OTBS形式、PSScriptAnalyzerエラーチェック | CI |
| ビルドテスト (Build) | エイリアス確認、モジュール構造検証 | CI |

### テスト種別

| 種別 | 概要 | 実施タイミング |
| --- | --- | --- |
| 機能テスト | コマンドレットの機能検証、パラメータ検証、出力検証 | プルリクエスト時、プッシュ時 |
| 回帰テスト | 既存機能への影響確認、依存関係テスト | プルリクエスト時 |
| コンプライアンステスト | コードスタイル、フォーマット、セキュリティチェック | 全ビルド時 |
| クロスプラットフォームテスト | Linux、macOS、Windowsでの動作確認 | GitHub Actions |
| SQL Serverバージョン互換性テスト | SQL Server 2008R2〜2022での動作確認 | AppVeyor |
| レプリケーションテスト | SQL Serverレプリケーション機能のテスト | GitHub Actions (専用ワークフロー) |

## テスト環境

| 環境 | 用途 | 構成 |
| --- | --- | --- |
| AppVeyor (Windows) | メインCI環境、SQL Serverバージョン別テスト | Windows、SQL Server 2008R2SP2/2016/2017/2019/2022 |
| GitHub Actions (Linux) | クロスプラットフォームテスト | Ubuntu、Dockerコンテナ (dbatools/sqlinstance) |
| GitHub Actions (Windows) | Windowsクロスプラットフォームテスト | Windows、LocalDB、SQL Server Engine |
| GitHub Actions (macOS) | macOSクロスプラットフォームテスト | macOS、リモートSQL Server接続 |
| ローカル開発環境 | 開発者テスト | Windows/Linux/macOS、任意のSQL Serverインスタンス |

## テストツール

| ツール | 用途 | バージョン |
| --- | --- | --- |
| Pester | PowerShellテストフレームワーク | 5.7.1 |
| PSScriptAnalyzer | 静的コード解析、コーディング規約チェック | 最新 |
| Docker | テスト用SQL Serverコンテナ提供 | 最新 |
| AppVeyor | Windows CI/CDプラットフォーム | - |
| GitHub Actions | クロスプラットフォームCI/CDプラットフォーム | - |

## カバレッジ目標

| 対象 | 目標値 |
| --- | --- |
| パラメータ検証テスト | 100% (全公開コマンドに必須) |
| 結合テスト | 全公開コマンドに対して最低1テスト |
| テストファイル存在率 | 100% (713テストファイル/約700コマンド) |

## テストデータ

### テスト設定

テスト設定は `Get-TestConfig` コマンドで取得し、以下の設定を利用します:

- `$TestConfig.InstanceSingle`: 単一インスタンステスト用
- `$TestConfig.InstanceMulti1/InstanceMulti2`: 複数インスタンステスト用
- `$TestConfig.InstanceCopy1/InstanceCopy2`: コピー系テスト用
- `$TestConfig.InstanceHadr`: 高可用性テスト用
- `$TestConfig.InstanceRestart`: 再起動テスト用
- `$TestConfig.SqlCred`: SQL Server認証情報
- `$TestConfig.Temp`: 一時ファイル用ディレクトリ

### テストデータ管理方針

1. テスト用データベース名は `dbatoolsci_` プレフィックスを使用
2. `Get-Random` を使用して一意のリソース名を生成
3. `BeforeAll` ブロックでテストリソースを作成
4. `AfterAll` ブロックで確実にクリーンアップ
5. `EnableException` を BeforeAll/AfterAll で有効化してセットアップ/クリーンアップ失敗を検出

## 不具合管理

### テスト失敗時の再試行

- AppVeyorでは最大3回までテストを再試行
- 再試行前にSQL Serverサービスを再起動して状態をリセット

### テスト結果の収集

- `Pester5Results*.xml`: Pesterテスト結果 (Export-Clixml形式)
- `TestFailureSummary_Pester5_*.json`: 失敗テストの詳細情報
- `OverallTestSummary.json`: 全テスト実行サマリー
- `DetailedTestFailures_Pester5.json`: 詳細な失敗情報 (Finalize時)
- `dbatools_messages_and_errors.xml.zip`: dbatoolsログ/エラー情報

### 無効化されたテスト

- `disabled`: 全環境で無効化されたテスト
- `appveyor_disabled`: AppVeyorでのみ無効化されたテスト
- テスト無効化は `tests/pester.groups.ps1` で管理

## CI/CD連携

### AppVeyor ワークフロー

1. **ビルドマトリクス**: SINGLE(1/3, 2/3, 3/3)、MULTI、COPY、HADR、RESTART、default、2008R2SP2Express(1/2, 2/2)
2. **プリテスト**: `appveyor.prep.ps1` (環境準備)、`appveyor.sqlserver.ps1` (SQL Server構成)
3. **テスト実行**: `appveyor.pester.ps1` (Pesterテスト実行)
4. **ポストテスト**: `appveyor.post.ps1` (結果収集)

### GitHub Actions ワークフロー

| ワークフロー | 目的 |
| --- | --- |
| `integration-tests.yml` | クロスプラットフォーム結合テスト (Linux/Windows/macOS) |
| `integration-tests-repl.yml` | レプリケーション機能テスト |
| `integration-tests-s3.yml` | S3関連機能テスト |
| `xplat-import.yml` | クロスプラットフォームインポートテスト |

### テスト選択ロジック

1. **PR時**: 変更されたファイルに対応するテストを自動検出
2. **コミットメッセージ**: `(do コマンド名)` パターンで特定テストを指定可能
3. **依存関係追跡**: 変更されたコマンドに依存するテストも自動実行
4. **シナリオ分割**: `pester.groups.ps1` でテストグループを定義

## テストファイル構造

### 標準ヘッダー

```powershell
#Requires -Module @{ ModuleName="Pester"; ModuleVersion="5.0" }
param(
    $ModuleName  = "dbatools",
    $CommandName = "Get-DbaDatabase",
    $PSDefaultParameterValues = $TestConfig.Defaults
)
```

### 必須テスト構成

1. **パラメータ検証テスト** (`-Tag UnitTests`): 全パラメータの存在確認
2. **結合テスト** (`-Tag IntegrationTests`): 実際のSQL Server接続テスト

### タグ一覧

| タグ | 説明 |
| --- | --- |
| UnitTests | 単体テスト |
| IntegrationTests | 結合テスト |
| Compliance | コンプライアンステスト |
| Build | ビルドテスト |
| Aliases | エイリアステスト |
| Tests | テストファイル存在確認 |

## 備考

### PowerShellバージョン互換性

- PowerShell v3以降をサポート
- `::new()` 構文は使用禁止 (`New-Object` を使用)
- PowerShell Core (pwsh) とWindows PowerShellの両方でテスト実行

### SQL Serverバージョン互換性

- SQL Server 2000〜2022をサポート
- 機能に応じて最小バージョン要件を設定
- `Connect-DbaInstance -MinimumVersion` でバージョンチェック

### コーディング規約

- OTBS (One True Brace Style) フォーマット
- UTF-8 (BOMなし) エンコーディング
- スペースによるインデント (タブ禁止)
- 行末の空白禁止
- ハッシュテーブルの `=` 記号は垂直整列必須

### ローカルテスト実行

```powershell
# モジュールインポート
Import-Module .\dbatools.psm1

# テスト設定取得
$TestConfig = Get-TestConfig

# 特定テスト実行
Invoke-Pester -Path .\tests\Get-DbaDatabase.Tests.ps1 -Output Detailed
```
