Skip to content

ibus-akaza の E2E テストの整備 #354

@tokuhirom

Description

@tokuhirom

問題

現状、ibus-akaza(IBus インプットメソッド)には適切な E2E(End-to-End)テストがありません。

現在のテスト状況

ユニットテスト

  • ✅ libakaza: 豊富なユニットテストと統合テスト
  • ✅ libakaza/graph_resolver: Viterbi アルゴリズムのテスト
  • ✅ ibus-akaza/context.rs: keyval_to_char などの小規模テスト
  • ❌ ibus-akaza: 全体的な入力フローのテストなし

E2E テストの欠如

テストできていないこと:

  1. 実際のキー入力から変換までの統合フロー
  2. IBus との連携動作
  3. GUI アプリケーションとの相互作用
  4. 複数アプリケーション間での動作
  5. 文節操作(Shift+左右キー)の動作
  6. 候補選択と確定の動作
  7. クラッシュリカバリ

E2E テストの重要性

1. IME 特有の複雑性

IME は以下のような複雑な相互作用を持ちます:

  • ホストアプリケーション(ブラウザ、エディタなど)
  • IBus デーモン
  • GTK/Qt などの GUI フレームワーク
  • X11/Wayland ディスプレイサーバー

これらの統合動作は単体テストでは検証できません。

2. ユーザーエクスペリエンスの保証

IME のバグは以下のような深刻な影響があります:

3. リグレッション防止

現在のクラッシュ修正シリーズ(PR #348-351)のような変更が、実際の使用環境で正しく動作することを保証できません。

提案される改善策

1. 自動化された E2E テストフレームワークの導入

オプション A: atspi (Assistive Technology Service Provider Interface)

# Python + pyatspi の例
import pyatspi

def test_basic_hiragana_input():
    # アプリケーションを起動
    app = launch_test_app()
    text_field = app.find_text_field()
    
    # IME を有効化
    text_field.focus()
    
    # キー入力をシミュレート
    send_keys("watashi")
    assert get_preedit_text() == "わたし"
    
    # スペースで変換
    send_key("space")
    candidates = get_candidates()
    assert "私" in candidates
    
    # Enter で確定
    send_key("return")
    assert text_field.text == "私"

メリット:

  • Linux アクセシビリティ標準
  • IBus と統合しやすい
  • GUI 自動化が可能

デメリット:

  • セットアップが複雑
  • CI での実行にディスプレイが必要

オプション B: Headless X11 + xdotool

# GitHub Actions での実行例
- name: E2E Test
  run: |
    # 仮想ディスプレイを起動
    Xvfb :99 -screen 0 1024x768x24 &
    export DISPLAY=:99
    
    # IBus デーモンを起動
    ibus-daemon -drx
    
    # テストアプリケーションを起動
    gedit &
    
    # xdotool でキー入力をシミュレート
    xdotool key ctrl+space  # IME 有効化
    xdotool type "watashi"
    xdotool key space       # 変換
    xdotool key Return      # 確定
    
    # 結果を検証
    xdotool getactivewindow getwindowname | grep ""

メリット:

  • CI で実行しやすい
  • シェルスクリプトで書ける

デメリット:

  • 低レベルで壊れやすい
  • 変換候補の検証が難しい

オプション C: カスタムテストハーネス

// ibus-akaza 専用のテストハーネス
#[test]
fn test_conversion_flow() {
    let mut engine = create_test_engine();
    
    // キー入力シミュレート
    engine.process_key_event('w' as u32, 0, 0);
    engine.process_key_event('a' as u32, 0, 0);
    // ...
    
    // Preedit テキストを確認
    assert_eq!(engine.get_preedit(), "わ");
    
    // 変換
    engine.process_key_event(IBus_KEY_space, 0, 0);
    
    // 候補を確認
    let candidates = engine.get_candidates();
    assert!(candidates.contains(&"私"));
}

メリット:

  • Rust ネイティブ
  • 高速で安定
  • CI で簡単に実行

デメリット:

  • 実際の IBus 環境とは異なる
  • GUI レイヤーのテストはできない

2. 段階的な導入計画

Phase 1: 基本的な変換フローのテスト

  • ひらがな入力
  • スペースで変換
  • 候補選択
  • 確定

Phase 2: 高度な機能のテスト

  • 文節操作(Shift+左右キー)
  • カタカナ変換
  • 全角英数変換
  • 学習機能

Phase 3: エラーハンドリングのテスト

  • 不正な入力への対応
  • 辞書ファイル欠損時の動作
  • メモリ不足時の動作

Phase 4: パフォーマンステスト

  • 長文入力の応答時間
  • メモリ使用量
  • CPU 使用率

3. CI/CD への統合

# .github/workflows/e2e-test.yml
name: E2E Tests

on: [push, pull_request]

jobs:
  e2e:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y ibus ibus-gtk4 xvfb xdotool
      
      - name: Build ibus-akaza
        run: cargo build --release
      
      - name: Run E2E tests
        run: |
          Xvfb :99 &
          export DISPLAY=:99
          ./scripts/run-e2e-tests.sh

期待される効果

  1. 品質向上

    • リグレッションの早期発見
    • ユーザー体験の保証
  2. 開発速度向上

    • 手動テストの削減
    • 自信を持ったリファクタリング
  3. ドキュメント効果

    • テストコードが使用例となる
    • 期待される動作が明確に

関連

優先度

High - IME の品質保証に直結する重要な課題

ラベル

  • enhancement
  • testing
  • infrastructure
  • high-priority

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions