# テスト方針書

## 概要

本ドキュメントは、Nushell（モダンなシェル）プロジェクトにおけるテスト方針を定義したものである。Nushellは Rust で実装されており、Cargoの組み込みテストフレームワークを活用した包括的なテスト体制を構築している。本プロジェクトは31以上のクレート（サブパッケージ）から構成されるワークスペース構造を採用しており、各クレートに対して単体テスト、結合テスト、およびベンチマークテストを実施している。

## テスト戦略

### テストレベル

| レベル | 目的 | 担当 |
| --- | --- | --- |
| 単体テスト | 個々の関数・モジュールの動作検証。各クレート内の `#[test]` アトリビュート付き関数で実装 | 開発者 |
| 結合テスト | クレート間の連携、コマンド実行の検証。`tests/` ディレクトリ配下で実装 | 開発者 |
| システムテスト | 標準ライブラリ (`nu-std`) のテスト、Python仮想環境との連携テスト | CI/CD |
| プラグインテスト | プラグインシステムの動作検証。`nu_plugin_*` クレートで実装 | 開発者 |

### テスト種別

| 種別 | 概要 | 実施タイミング |
| --- | --- | --- |
| 機能テスト | コマンド、パーサー、プロトコルの機能検証 | 開発時、PR作成時 |
| 性能テスト | ベンチマークによる性能測定（tango-bench使用） | 必要時、リリース前 |
| セキュリティテスト | 依存関係の脆弱性監査（cargo-audit使用） | PR作成時、mainブランチプッシュ時 |
| 静的解析 | Clippy によるリント、typos によるスペルチェック | PR作成時 |
| ファジングテスト | パーサーの堅牢性検証（libfuzzer-sys使用） | 必要時 |
| WASMビルドテスト | WebAssemblyターゲットのビルド・リント検証 | PR作成時 |

## テスト環境

| 環境 | 用途 | 構成 |
| --- | --- | --- |
| ローカル開発環境 | 開発者による単体・結合テスト | Rust 1.91.1+, Cargo |
| GitHub Actions (ubuntu-22.04) | Linux環境でのCI/CDテスト | Ubuntu 22.04, Rust toolchain |
| GitHub Actions (macos-latest) | macOS環境でのCI/CDテスト | macOS latest, Rust toolchain |
| GitHub Actions (windows-latest) | Windows環境でのCI/CDテスト | Windows latest, Rust toolchain |

## テストツール

| ツール | 用途 | バージョン |
| --- | --- | --- |
| Cargo test | Rustの標準テストフレームワーク | Cargo同梱 |
| rstest | パラメータ化テスト、テストフィクスチャ | 0.23 |
| pretty_assertions | アサーション出力の可読性向上 | 1.4 |
| tempfile | 一時ファイル・ディレクトリの作成 | 3.24 |
| mockito | HTTPモックサーバー | 1.7 |
| quickcheck | プロパティベーステスト | 1.1 |
| tango-bench | ベンチマークテスト | 0.6 |
| libfuzzer-sys | ファジングテスト | 0.4 |
| cargo-audit | セキュリティ監査 | latest |
| typos | スペルチェック | 1.43.5 |
| Clippy | Rustリンター | Rust toolchain同梱 |

## カバレッジ目標

| 対象 | 目標値 |
| --- | --- |
| 行カバレッジ | 明示的な目標値は設定されていない |
| 分岐カバレッジ | 明示的な目標値は設定されていない |

備考: 本プロジェクトでは明示的なカバレッジ目標は設定されていないが、各コマンド・モジュールに対して広範なテストケースが実装されており、実質的に高いテストカバレッジを維持している。

## テストデータ

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

1. **フィクスチャファイル**: `tests/fixtures/` ディレクトリに静的テストデータを配置
2. **一時ファイル**: `tempfile` クレートを使用して動的にテストデータを生成・管理
3. **Playground**: `nu-test-support` クレートの `playground` モジュールでテスト用の隔離環境を提供
4. **テストマクロ**: `nu!` マクロにより、テスト用のNushellコマンド実行環境を簡単に構築可能
5. **プラグインテスト**: `nu-plugin-test-support` クレートでプラグインテスト用のヘルパーを提供

## 不具合管理

本プロジェクトでは以下の方法で不具合を管理している:

1. **GitHub Issues**: バグ報告、機能要求はGitHub Issuesで管理
2. **プルリクエストレビュー**: CI/CDでのテスト必須化によりリグレッションを防止
3. **継続的インテグレーション**: 各PRでの自動テスト実行により、マージ前に問題を検出
4. **ラベル管理**: `.github/workflows/labels.yml` によるIssue/PRのラベル自動管理

## CI/CD連携

GitHub Actionsを使用した継続的インテグレーションパイプラインが構成されている:

### メインCI (`ci.yml`)

1. **fmt-clippy ジョブ**:
   - `cargo fmt --all -- --check`: コードフォーマットチェック
   - `cargo clippy --workspace --exclude nu_plugin_*`: メインコードのリント（`-D warnings -D clippy::unwrap_used` 等のオプション付き）
   - `cargo clippy --tests`: テストコードのリント
   - `cargo clippy --benches`: ベンチマークコードのリント

2. **tests ジョブ**:
   - `cargo test --workspace --profile ci --exclude nu_plugin_*`: ワークスペース全体のテスト実行
   - リポジトリのクリーン状態確認

3. **std-lib-and-python-virtualenv ジョブ**:
   - Nushellのインストール
   - 標準ライブラリテスト: `nu -c 'use crates/nu-std/testing.nu; testing run-tests --path crates/nu-std'`
   - Python仮想環境でのテスト
   - MSRVとrust-toolchainの整合性確認

4. **plugins ジョブ**:
   - プラグインのClippy検査
   - プラグインテスト: `cargo test --profile ci --package nu_plugin_*`

5. **wasm ジョブ**:
   - WebAssemblyターゲットへのビルド・リント検証

### その他のワークフロー

- **audit.yml**: 依存関係のセキュリティ監査
- **typos.yml**: スペルチェック
- **nightly-build.yml**: ナイトリービルド
- **release.yml**: リリースビルド
- **beta-test.yml**: ベータテスト

## 備考

1. **テストプロファイル**: CI環境では `ci` プロファイル (`--profile ci`) を使用し、デバッグ情報を削減して高速化を図っている

2. **標準ライブラリテスト**: Nushell自身で書かれたテストフレームワーク (`crates/nu-std/testing.nu`) を使用し、アノテーションベースのテスト定義が可能（`#[test]`, `#[ignore]`, `#[before-each]` 等）

3. **並列実行**: テストは並列実行可能であり、`--threads` オプションで並列度を制御可能

4. **プラグインテスト分離**: プラグイン (`nu_plugin_*`) のテストはメインワークスペースのテストとは分離して実行される

5. **クロスプラットフォーム**: Windows, macOS, Linux (Ubuntu 22.04) の3プラットフォームでのテストを実施

6. **Rust バージョン**: MSRV (Minimum Supported Rust Version) は 1.91.1 に設定されており、CI で整合性が確認される
