Files
hakorune/docs/private/roadmap/phases/phase-20-python-integration/testing

Testing - テスト計画

📋 概要

Python-Hakorune統合のテスト計画です。

🎯 テスト戦略

テストレベル

  1. ユニットテスト

    • 個別コンポーネントのテスト
    • 型変換のテスト
    • エラーハンドリングのテスト
  2. 統合テスト

    • Python-Hakorune連携テスト
    • FFI境界のテスト
    • GIL管理のテスト
  3. E2Eテスト

    • 実用的なユースケーステスト
    • パフォーマンステスト
    • 互換性テスト

🧪 テストケース

1. 基本機能テスト

Python実行

// test_python_eval.hkr
local py = new PyRuntimeBox()
local result = py.eval("2 + 3")
assert(result.to_int() == 5)

モジュールインポート

// test_python_import.hkr
local py = new PyRuntimeBox()
local math = py.import("math")
local pi = math.getattr("pi")
assert(pi.to_string() == "3.14159...")

オブジェクト操作

// test_python_object.hkr
local py = new PyRuntimeBox()
local obj = py.eval("{'x': 10, 'y': 20}")
local x = obj.getattr("x")
assert(x.to_int() == 10)

2. 型変換テスト

// test_type_conversion.hkr
local py = new PyRuntimeBox()

// Bool変換
local py_true = py.eval("True")
assert(py_true.to_bool() == true)

// Int変換
local py_int = py.eval("42")
assert(py_int.to_int() == 42)

// String変換
local py_str = py.eval("'hello'")
assert(py_str.to_string() == "hello")

// List変換
local py_list = py.eval("[1, 2, 3]")
// ... ArrayBox への変換テスト

3. エラーハンドリングテスト

// test_python_error.hkr
local py = new PyRuntimeBox()

// Python例外のキャッチ
try {
    py.eval("1 / 0")  // ZeroDivisionError
} catch(e) {
    assert(e.contains("ZeroDivisionError"))
}

4. GIL管理テスト

// tests/gil_management.rs
#[test]
fn test_gil_acquisition() {
    // GILの正しい獲得・解放
}

#[test]
fn test_nested_gil_calls() {
    // ネストしたPython呼び出し
}

#[test]
fn test_concurrent_access() {
    // 複数スレッドからのアクセス
}

5. メモリ管理テスト

// tests/memory_management.rs
#[test]
fn test_no_memory_leak() {
    // メモリリークがないことを確認
    for _ in 0..1000 {
        let obj = create_python_object();
        drop(obj);
    }
    // メモリ使用量が増加していないことを確認
}

#[test]
fn test_reference_counting() {
    // Pythonオブジェクトの参照カウント
}

6. パフォーマンステスト

// benches/python_integration.rs
#[bench]
fn bench_python_call_overhead(b: &mut Bencher) {
    // Python呼び出しのオーバーヘッド測定
}

#[bench]
fn bench_type_conversion(b: &mut Bencher) {
    // 型変換のパフォーマンス測定
}

📊 テスト環境

サポート対象

環境 Python Platform 備考
Linux 3.8+ x86_64 優先
macOS 3.8+ x86_64, arm64 優先
Windows 3.8+ x86_64 後段

CI/CD統合

# .github/workflows/python-integration.yml
name: Python Integration Tests

on: [push, pull_request]

jobs:
  test:
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        python-version: ['3.8', '3.9', '3.10', '3.11']

    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python-version }}
      - name: Run tests
        run: cargo test --features python-integration

🔧 テストツール

1. ユニットテスト

  • Cargo test framework
  • #[test] アトリビュート
  • アサーションマクロ

2. 統合テスト

  • tests/ ディレクトリ
  • E2Eシナリオ

3. ベンチマーク

  • Criterion.rs
  • パフォーマンス回帰検出

4. メモリリークチェック

  • Valgrind
  • AddressSanitizer
  • Python memory profiler

📋 テストチェックリスト

基本機能

  • Python eval実行
  • モジュールインポート
  • オブジェクト属性アクセス
  • メソッド呼び出し
  • 例外ハンドリング

型変換

  • bool変換
  • int変換
  • string変換
  • list変換
  • dict変換
  • None処理

FFI境界

  • Handle管理
  • TLV型変換
  • エラー伝搬

GIL管理

  • GIL獲得・解放
  • ネスト呼び出し
  • マルチスレッド

メモリ管理

  • 参照カウント
  • リーク検出
  • 循環参照処理

パフォーマンス

  • 呼び出しオーバーヘッド
  • 型変換コスト
  • メモリ使用量

プラットフォーム

  • Linux (x86_64)
  • macOS (x86_64)
  • macOS (arm64)
  • Windows (x86_64)

⚠️ 既知の課題

1. GILデッドロック

  • 問題: ネスト呼び出しでデッドロックの可能性
  • 対策: GIL獲得・解放のログ、タイムアウト検出

2. メモリリーク

  • 問題: 参照カウントの管理ミス
  • 対策: 定期的なリークチェック、自動テスト

3. プラットフォーム固有問題

  • 問題: Python配布形態の違い
  • 対策: CI環境での網羅的テスト

🔗 関連ドキュメント