GUI アプリケーションのテスト

アルバイトをやっていて思ったことをつらつらと。
GUI アプリケーションのテストをする際に、どこが難しいのかというと、

  • GUI は、ユーザの指定したレイアウトを記憶することが多い。ウィンドウの表示位置とか、スクロールバーの値とか、2ペインのウィンドウの大きさの比とか。これによりテスト対象のコンポーネントの位置が変化する
  • GUI は表示されていないオブジェクトに対する入力が行えないし、ユーザからの入力系列をキャッシュするバッファという概念もない。そのため、アプリケーションがある特定の状態になってから操作する、というテストをうまく作れない
  • GUI で表示されるデータは、ユーザという高機能なシステムが理解できればよく、他のアプリケーションから再利用される状況は想定していない。つまり、デバッガからうまく扱えるようになっていない

だと思う。expect でテストを一生懸命書く感じになる。

複数のテストを自動で実行する際にどこが難しいのかというと、

  • 「初期化」が難しい
  • 結果の判定が難しい

ことだと思う。どちらも「GUI アプリケーションの状態」がなんなのかよくわかっていないのが問題。

テスト対象アプリケーションにどんな機能があれば解決できるかというと

  • GUI の状態」の定義
  • GUI アプリケーションの状態のスナップショットを取り、いつでもそこに復帰できる機能
  • 特定のイベントが起きるまで待機する機能
  • 座標やコンポーネントの表示名以外の方法で、特定の GUI コンポーネントを普遍的に指定できる機能
  • GUI アプリケーションの状態を他のアプリケーション(デバッガ)から取得できる機能

だと思う。

結論:これらの機能を実現する GUI フレームワークが必要だ!
デバッグモードでビルドすると、任意のタイミングで GUI の状態をシリアライズできるようなもの。ちなみに Plan9 ではプロセスをファイルで表現していて、プロセスファイルシステム以下のファイルにアクセスすることで、アプリケーションの状態を再利用可能な形で(テキストで)取得することができる(たぶん)。ただ、取得できるデータの形式はアプリケーションによる(たぶん)。