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

264 lines
5.4 KiB
Markdown
Raw Normal View History

# Testing - テスト計画
## 📋 概要
Python-Hakorune統合のテスト計画です。
## 🎯 テスト戦略
### テストレベル
1. **ユニットテスト**
- 個別コンポーネントのテスト
- 型変換のテスト
- エラーハンドリングのテスト
2. **統合テスト**
- Python-Hakorune連携テスト
- FFI境界のテスト
- GIL管理のテスト
3. **E2Eテスト**
- 実用的なユースケーステスト
- パフォーマンステスト
- 互換性テスト
## 🧪 テストケース
### 1. 基本機能テスト
#### Python実行
```hakorune
// test_python_eval.hkr
local py = new PyRuntimeBox()
local result = py.eval("2 + 3")
assert(result.to_int() == 5)
```
#### モジュールインポート
```hakorune
// test_python_import.hkr
local py = new PyRuntimeBox()
local math = py.import("math")
local pi = math.getattr("pi")
assert(pi.to_string() == "3.14159...")
```
#### オブジェクト操作
```hakorune
// 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. 型変換テスト
```hakorune
// 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. エラーハンドリングテスト
```hakorune
// test_python_error.hkr
local py = new PyRuntimeBox()
// Python例外のキャッチ
try {
py.eval("1 / 0") // ZeroDivisionError
} catch(e) {
assert(e.contains("ZeroDivisionError"))
}
```
### 4. GIL管理テスト
```rust
// tests/gil_management.rs
#[test]
fn test_gil_acquisition() {
// GILの正しい獲得・解放
}
#[test]
fn test_nested_gil_calls() {
// ネストしたPython呼び出し
}
#[test]
fn test_concurrent_access() {
// 複数スレッドからのアクセス
}
```
### 5. メモリ管理テスト
```rust
// 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. パフォーマンステスト
```rust
// 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統合
```yaml
# .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環境での網羅的テスト
## 🔗 関連ドキュメント
- [Phase 20 メインREADME](../README.md)
- [Core Implementation](../core-implementation/)
- [Design Documents](../design/)