BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Android の自動テストツール

Android の自動テストツール

原文(投稿日:2011/09/30)へのリンク

 

Android アプリケーションで自動テストを実行するフレームワークやツールは数多い。Activity Instrumentation,MonkeyRunnerRobotiumRobolectric,他にも多数のものがある。そのひとつである LessPainful は,実際のデバイス上でサービスとして自動テスト機能を提供するツールだ。

Android には基本的な実装テストのサポートがある。そのひとつが android.test パッケージの ActivityInstrumentationTestCase2 クラスだ。これは JUnit の TestCase を拡張したもので,Android のアクティビティをテストする機能を備えている。アプリケーションのテスト時には,アクティビティの実装が Android エミュレータまたは実機上の Dalvik VM 内でそれぞれ起動される。

Android SDK には MonkeyRunner というテストツールも同梱されていて,Python で記述されたテスト用の API と実行環境を提供している。用意されているのは,デバイスへの接続,アプリのインストールとアンインストール,アプリの実行,スクリーンショットの取得,特定のコマンド実行後の表示が想定された内容であることを確認するためのイメージ比較,アプリケーションに対するテストパッケージの実行などを行う API だ。このツールは ActivityInstrumentationTestCase2, ProviderTestCase, ServiceTestCase, SingleLaunchActivityTestCase などで定義されたテストケースを InstrumentationTestRunner クラスで実行する。

Robotium も同様に,InstrumentationTestRunner 経由で Android のテストサポート機能に接続するフレームワークであり,複数のアクティビティに渡って実行される機能テストやシステムテスト,受け入れテストを実行可能である。Robotium はアクティビティ,ダイアログ,トースト,メニュー,さらには Honeycomb のコンテキストメニューもサポートし,Maven や Ant と統合された継続的統合テストを実行する。Selenium に近いが,Android アプリケーション用であることが違う。

Robolectric はこれらとは別の方法を選択している。このテストフレームワークは Android の提供するテスト機能に依存せず,シャドーオブジェクトを使用して通常のワークステーション/サーバ JVM でテストを実行する。テスト対象アプリの再コンパイル,パッケージング,エミュレータあるいは実機へのデプロイと実行,という作業を回避することによって,テスト実行に要する時間を削減する。Pivotal Labs は,Robolectric を使用すれば 1,047 件のテストを 28 秒で実行 可能である,と言っている。

LessPainful の Android テストはさらに一歩進んで,複数の実機上でアプリケーションの自動テストが可能である。ビジネス的表現の可能な DSL である Cucumber で記述されたテストファイルをアプリケーション (*.apk) とともにアップロードして,テスト実行に使用するデバイス設定を選択すれば,自動的にテストが実行されてレポートが生成される。サポート対象デバイスの一覧には Garmin Asus,HTC 製の一部,LG,Samsung Galaxy,Sony Xperia,Motorola Motodefy などが挙がっている。

我々は LessPainful の CEO である Jonas Maturana 氏に,ソフトウェアの詳細に関する話を聞いた。以下はそのインタビューの一部である。

InfoQ: 異なるバージョンの Android でアプリを実行する場合,どのような問題があるのでしょう? 開発者は自身のアプリを確実に動作させるために,すべてのバージョンの Android でテストしなければならないのでしょうか?

JML: 一例ですが,Android 2.2 以前の SAXParser にはContentHandler.startElement のコールバックにバグがあって,アプリに不正な動作を引き起こします。

一般論として言えば,OS バージョンの間には非常に多くの違いがあります。2.1-update1 ではクラッシュするものが,2.1-update3 や 2.2 では動作する場合もあるのです。

InfoQ: Android デバイス間のフラグメンテーションは,事実として存在するのでしょうか? 例えば Android 2.2 の HTC では動作するが Samsung では動作しないような (他のバージョンと製造業社でも構いません) アプリの例があるのでしょうか?

JML: LG 製のデバイスでは,HorizontalScrollViews が子ビューのバックグラウンドイメージを非表示にすることが時々あります。私たちのテストでは,OS に関係なくすべての LG 携帯電話で発生しています。

テーマをアプリ自身で処理していない場合には,デバイスによってアプリの外観が異なります。例えば Motorola は,入力フィールドを赤いボーダで強調表示しています。私が以前関係していたプロジェクトでは,入力エラーをこれとまったく同じ,赤色のボーダで表示していたことがありました。

その他,製造会社というよりもハードウェア自体に関連する問題もあります。例えば RAM 容量の少ないデバイスでは,高解像度のカメラが原因でイメージを処理するときにクラッシュすることがあります。

InfoQ: テストはどのように実行されるのでしょうか?

JML: 基本的には ActivityInstrumentationTestCase2 のインスタンスとして,Robotium が実行します。アプリケーションに対して行う変更は,シグネチャの削除と更新だけです。

テストが終了するとアプリケーションはアンインストールされ,デバイスの設定はデフォルトに戻されます。

InfoQ: MonkeyRunner や Robotium,あるいは Robolectric と比較して,あなた方のサービスが優れている点は何でしょうか?

JML: LessPainful はフレームワークではなく,サービスなのです。私たちは単にテストができるということだけでなく,多くの時間を費やさずに,フレームワークよりも多くのエラーを検出できるようなサービス構築を目標にしています。

そしてもうひとつ,私たちは Cucumber の採用によって,開発チーム外部とも共有可能な,非常に高いレベルのテスト仕様を実現できていると考えています。

私たちの目標は git に対して git ライブラリが持つ役割ではなく,github の役割を果たすことである,と思っていただければいいでしょう。

InfoQ: より多くのデバイスをサポートする計画はありますか?

JML: はい,今後さらに多くのデバイスを,サポート対象として継続的に追加していく予定です。デバイスに対する要望があれば,対応していきたいと思います。

私たちは現在,iOS デバイスのサポート作業も進めています。今年の秋には公開ベータ版を準備できるでしょう。

InfoQ: LessPainful Enterprise とは,どのようなものでしょう?

JML: ボックスとして提供するものです。多分 Mac Mini を使用することになると思いますが,ユーザニーズに対しては柔軟に対応するつもりです。LessPainful Enterprise はまだ市販品ではありませんが,ユーザの要求を本当の意味で満足するものになると思います。

 

 

この記事に星をつける

おすすめ度
スタイル

BT