# テスト方針書

## 概要

本ドキュメントは、mruby（軽量Ruby実装）プロジェクトにおけるテスト方針を定義する。mrubyはISO/IEC 30170準拠の組み込み向けRuby実装であり、カスタムテストフレームワーク（mruby-test gem）を基盤に、複数プラットフォーム・複数コンパイラにまたがる包括的なテスト戦略を採用している。

## テスト戦略

### テストレベル

| レベル | 目的 | 担当 |
| --- | --- | --- |
| 単体テスト | 各Rubyクラス・モジュール・メソッドの機能正当性を検証。ISO/IEC 30170仕様への準拠確認を含む | mruby-test gem（`test/t/*.rb`の43テストファイル） |
| 結合テスト | mrbgem（拡張機能）単位でのC実装とRuby実装の統合動作を検証。ファイルシステム・ネットワーク等の外部リソースアクセスを含む | 各gem内 `test/` ディレクトリ（例: `mruby-dir/test/dir.rb`, `mruby-math/test/math.rb`） |
| システムテスト（バイナリテスト） | コマンドラインツール（mruby, mrbc, mirb, mrdb, mruby-strip）の入出力・終了コードを検証 | `mrbgems/mruby-bin-*/bintest/*.rb`（Open3による外部プロセステスト） |
| 受入テスト | マルチプラットフォーム（Linux/macOS/Windows）・マルチコンパイラ（GCC/Clang/MSVC/cosmocc）環境でのビルド・テスト通過 | GitHub Actions CI（`build.yml`） |

### テスト種別

| 種別 | 概要 | 実施タイミング |
| --- | --- | --- |
| 機能テスト | ISO/IEC 30170仕様コード（例: `15.2.12`）に基づくクラス・メソッドの振る舞い検証 | `rake test` 実行時（単体テスト・gem結合テスト） |
| バイナリテスト | mruby/mrbc/mirb/mrdb等コマンドラインツールのE2E検証 | `rake test:bin` 実行時 |
| 性能テスト | フィボナッチ、レイトレーシング、マンデルブロ集合等のベンチマーク。4回反復計測 | `rake benchmark` 実行時 |
| セキュリティテスト | GitHub CodeQLによるC/C++コード静的解析。OSSFuzzによるファジングテスト（10分間） | CI/CDパイプライン（PRトリガー） |
| コード品質テスト | GitHub Super-Linterによる多言語Lint、pre-commitフック（`prek`）、ls-lintによるファイル名規約チェック | CI/CDパイプライン、コミット前 |

## テスト環境

| 環境 | 用途 | 構成 |
| --- | --- | --- |
| Ubuntu 24.04 / 22.04 | メインCI環境（Linux） | GCC + Clang、`build_config/ci/gcc-clang.rb` |
| macOS 15 / 14 | macOSプラットフォームテスト | Clang（Xcode同梱）、`build_config/ci/gcc-clang.rb` |
| Windows Server 2025 / 2022 | Windowsプラットフォームテスト（MinGW） | GCC（MinGW）、`build_config/ci/gcc-clang.rb` |
| Windows Server 2022（MSVC） | Visual C++テスト | Visual Studio 2022、`build_config/ci/msvc.rb` |
| Ubuntu 24.04（Cosmopolitan） | ポータブルバイナリテスト | cosmocc、特殊ビルド設定 |
| Ubuntu 24.04（Coverage） | コードカバレッジ計測 | Clang-18 + gcovr + llvm-cov |
| Docker Compose | コンテナ化テスト実行 | `make composetest` |
| ローカル開発環境 | 開発者テスト | `rake test` / `make test` |

## テストツール

| ツール | 用途 | バージョン |
| --- | --- | --- |
| mruby-test gem（カスタム） | テストドライバー・アサーションフレームワーク（C実装 `driver.c` + Ruby実装 `assert.rb`） | mrubyバージョンに同期 |
| Open3（Ruby標準ライブラリ） | バイナリテストでの外部プロセス実行・出力キャプチャ | Ruby標準ライブラリ |
| Rake | テストビルド・実行のタスク管理 | プロジェクト同梱 |
| gcovr + llvm-cov | C/C++コードカバレッジ計測・HTMLレポート生成 | gcovr最新 / llvm-cov-18 |
| GitHub CodeQL | C/C++セキュリティ静的解析 | GitHub Actions標準 |
| Google OSS-Fuzz | ファジングテスト | OSS-Fuzz連携 |
| GitHub Super-Linter | 多言語コードLint | GitHub Actions標準 |
| prek | pre-commitフック（コード品質チェック） | プロジェクト設定 |
| ls-lint | ファイル名・ディレクトリ名規約チェック | GitHub Actions標準 |
| gnuplot | ベンチマーク結果の可視化 | `benchmark/plot.gpl` |

## カバレッジ目標

| 対象 | 目標値 |
| --- | --- |
| 行カバレッジ | 明示的な数値目標は未設定（CI/CDでカバレッジレポートを収集・アーティファクト保存） |
| 分岐カバレッジ | 明示的な数値目標は未設定（同上） |

**備考**: `coverage.yml`でカバレッジ計測が自動化されており、`-O0 -g --coverage`フラグを付けてビルドし、gcovr + llvm-cov-18でHTMLレポートを生成。テストコード（`*_test.c`, `test/`）は除外される。成果物は3日間GitHub Artifactsに保存。

## テストデータ

### データ準備方針

- **インラインデータ**: 各テストファイル内にリテラルでテストデータを直接記述する方式が基本。外部テストデータファイルは使用しない
- **フィクスチャ**: `test/assert.rb`内のグローバル変数（`$ok_test`, `$ko_test`, `$asserts`等）でテスト結果を管理
- **サンドボックス**: ファイルシステム操作テスト（mruby-dir等）はC実装のセットアップ/ティアダウン関数（`mrb_dirtest_setup` / `mrb_dirtest_teardown`）でテスト用ディレクトリを管理
- **条件付きスキップ**: 環境依存の機能は`skip`メカニズム（`MRubyTestSkip`例外）で制御。例: `skip unless Object.const_defined?(:Float)`
- **浮動小数点数**: `Mrbtest::FLOAT_TOLERANCE`を用いた許容誤差比較（`assert_float`）

### テストデータパターン

```ruby
# パターン1: インラインデータ
assert('Array.[]', '15.2.12.4.1') do
  assert_equal([1, 2, 3], Array.[](1,2,3))
end

# パターン2: 条件付きスキップ
assert('String#[] with Float') do
  skip unless Object.const_defined?(:Float)
  assert_equal('b', 'abc'[1.1])
end

# パターン3: 例外テスト
assert('Array#*') do
  assert_raise(ArgumentError) { [1].*(-1) }
end
```

## 不具合管理

### 管理方針

- **不具合報告**: GitHub Issuesを使用
- **テスト失敗の分類**: テストフレームワークが以下のカテゴリで結果を集計
  - `$ok_test`: 成功テスト数
  - `$ko_test`: 失敗テスト数
  - `$kill_test`: クラッシュテスト数（セグメンテーションフォルト等）
  - `$warning_test`: 警告テスト数
  - `$skip_test`: スキップテスト数
- **詳細報告**: `$mrbtest_verbose`フラグで詳細出力を制御。ISO仕様コード、期待値/実際値の差分表示が可能
- **CI失敗通知**: GitHub Actionsの標準通知機能により、テスト失敗時にPR/コミットに自動フィードバック

## CI/CD連携

### ワークフロー一覧

| ワークフロー | ファイル | トリガー | 内容 |
| --- | --- | --- | --- |
| Build & Test | `.github/workflows/build.yml` | push, pull_request | マルチプラットフォーム・マルチコンパイラでのビルド・テスト実行 |
| Coverage | `.github/workflows/coverage.yml` | push, pull_request | コードカバレッジ計測・HTMLレポート生成 |
| CodeQL Analysis | `.github/workflows/codeql-analysis.yml` | push, pull_request, schedule | C/C++静的セキュリティ解析 |
| OSS-Fuzz | `.github/workflows/oss-fuzz.yml` | pull_request | ファジングテスト（10分間） |
| Pre-commit | `.github/workflows/pre-commit.yml` | push, pull_request | コード品質チェック（prek） |
| Super-Linter | `.github/workflows/super-linter.yml` | push, pull_request | 多言語Lint |
| ls-lint | `.github/workflows/ls-lint.yml` | push, pull_request | ファイル名規約チェック |

### テスト実行フロー

```
GitHub Actions (build.yml)
├─ GCC-CLANG ジョブ
│  ├─ Ubuntu 24.04 / 22.04（GCC + Clang）
│  ├─ macOS 15 / 14（Clang）
│  └─ Windows 2025 / 2022（MinGW GCC）
│     └─ rake -m test:run:serial
│
├─ Cosmopolitan ジョブ
│  └─ Ubuntu 24.04（cosmocc）
│
└─ Windows-VC ジョブ
   └─ Visual Studio 2022（MSVC）
```

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

```bash
# 全テスト実行
make test        # または rake test

# ライブラリテストのみ
rake test:lib

# バイナリテストのみ
rake test:bin

# シリアル実行（並列なし）
rake test:run:serial

# ベンチマーク実行
rake benchmark

# Docker Composeでテスト
make composetest
```

## 備考

### ISO/IEC 30170準拠テスト

mrubyのテストはISO/IEC 30170（プログラミング言語Ruby）仕様への準拠を重視しており、テストケースにISO仕様コード（例: `15.2.12.4.1`）が付与されている。これにより、各テストがどの仕様条項をカバーしているかが明確になっている。

### テストフレームワークの特徴

- **C言語実装のテストドライバー**: `mrbgems/mruby-test/driver.c`でテスト実行エンジンを実装。高速実行を実現
- **親VM/子VM分離**: テスト実行時にmruby VMのインスタンスを分離し、テスト間の干渉を防止
- **カスタムアサーション**: 標準的な`assert_equal`/`assert_raise`に加え、`assert_float`（浮動小数点数比較）、`assert_operator`（演算子検証）、`assert_predicate`（述語検証）等の専用アサーションを提供

### ビルド設定によるテスト制御

`build_config/` ディレクトリ配下の設定ファイルで、テスト対象を柔軟に制御可能:

```ruby
conf.enable_test       # 単体テスト・gem結合テストの有効化
conf.enable_bintest    # バイナリテストの有効化
conf.enable_benchmark  # ベンチマークの有効化
conf.enable_debug      # デバッグビルドの有効化
```

### テストカテゴリの構成

| カテゴリ | ファイル数 | テスト内容 |
| --- | --- | --- |
| コア言語テスト | 43ファイル（`test/t/`） | Array, Hash, String, Integer, Float等の基本クラステスト |
| Gemテスト | 48+ gem（`mrbgems/*/test/`） | 拡張機能（dir, math, socket, io等）のテスト |
| バイナリテスト | 5ツール（`mrbgems/mruby-bin-*/bintest/`） | mruby, mrbc, mirb, mrdb, mruby-stripのE2Eテスト |
| ベンチマーク | 8ファイル（`benchmark/`） | フィボナッチ、レイトレーシング、マンデルブロ等の性能計測 |
