Google社より提供されているAndroid向けの自動試験ツール"UI Automator"を今後導入しようかと思い、調査してみました。

UI Automatorの特徴としては、以下のものがあげられます。
  • UIマターの自動試験が実施可能
  • ゲームのようなSurfaceView直描画のアプリでも自動試験が実施可能(ただし、何を持って試験OKとするか判断し辛い)
  • 全く知らないアプリの自動試験を可能にする
基本的な構成要素として以下のようなものがあります。
名称概要
UiDevice デバイス全体への操作を目的としたAPI
提供されているAPIとして、以下のようなものがある。
  • 座標と指定する必要があるClick、Drag、Swipeなど
  • システムキー操作
  • キーパッド操作
UiObject View単位の操作を目的としたAPI。基本的にViewインスタンスに対してUiObjectインスタンスが紐づく
UiDevice.findObject(s)でリソースIDなどの検索条件を指定して取得する
提供されているAPIとして、以下のようなものがある。
  • 座標と指定する必要がないClick、Swipeなど
UiObject2使用目的などはUiObjectと同等。機能が拡張されている。ただ、UiObjectよりViewの状態に沿ったインスタンスとなっているため、紐づくViewが表示されていない状態になったら、該当のUiObject2インスタンスに対して操作を行うとStaleObjectExceptionが発生する。またその状態で再度UiDevice.findObjectを実施してもnullが返却される。
UiScrollableスクロール可能なView単位の操作を目的としたAPI。UiDevice.findObject(s)では返却されないため、使用時に自分でインスタンス生成して使用する必要がある。詳細はこちらを参照
UiSelectorUiObjectを探すための条件を保持するクラス
BySelectorUiObject2を探すための条件を保持するクラス
インスタンスはByクラスメソッドにて生成
UiWatcher試験中に予期しないことが発生したときにコールバックしてもらうためのWatcher
Until条件を満たすまでの待機条件を保持するクラス

基本的にはUiObjectを特定して、それに対してClick/Swipeなどを実施することで対応できる。ただし、稀にこちらのようなケースにおいてUiObjectでは対応できないケースが存在するので、そういうときは座標を直接指定したUiDeviceを使うなどの工夫が必要になりそうです。
また、ListViewやScrollViewなどのように表示されている子要素以外にも要素が存在し、表示されていない子要素にアクセスする必要がある場合、UiScrollableを使用する必要が出てきます。その際はこちらを参考にしてみてください。

UI Automatorは基本的にはアプリ毎にプロジェクトを作成し、操作手順に合わせた実装を行っていくことになりますが、毎回プロジェクトを作成するのは面倒なのではと思い、JSONで作成したスクリプトに合わせて動作するインタプリタ的なものを作成してみました。
ソース

使い方などは同梱されている"README.md"を参照してください。

コメントの投稿