スポンサーリンク

Androidアプリの自動テストツールで最も有望か - 「NativeDriver」,Google製「WebDriver」の拡張 (公式のAndroid版Selenium)


これはWebアプリ開発者にとっても,モバイルアプリ開発者にとっても朗報である。


下図は,「Webアプリ + モバイルアプリの,自動テストツールの技術動向」を表す。

 ┌─── Webの自動テスト────┐  ┌モバイルの自動テスト┐
 |                              |  |                    |
 |   Selenium        WebDriver  |  |Robotium─→Sirocco |
 |    (2004,      (2009, Google)|  | (2010)      (2010) |
 | ThoughtWorks)       |   |  |  |                    |
 |       |            |   └────────┐          |
 |       |            |       |  |        |          |
 |       |            |       |  |        |          |
 |       ↓            ↓       |  |        ↓          |
 |      Selenium WebDriver      |  |    NativeDriver    |
 | (=Selenium 2.0, 2011/07〜)  |  |  (Google, 2011/06) |
 |              |              |  |        |          |
 |              ↓              |  |        ↓          |
 |   順調にバージョンアップ中   |  |    iOSにも対応     |
 |                              |  |    (2011/08)     |
 |                              |  |                    |
 └───────────────┘  └──────────┘


Webアプリのテスト自動化には,Seleniumを使うのがデファクトスタンダードだった。

Seleniumは,2011年7月にGoogleの「WebDriver」と統合し,バージョンが2になった。



GoogleのWebDriverは,Googleのエンジニアたちが使っているテストツールである。

最近,AndroidやiPhoneなどのモバイルアプリにも対応すべく機能が拡張され,

NativeDriver」と名前を変え,2011年6月に登場した。
もちろんオープンソース。



今やWebDriverは,Seleniumプロジェクトと統合されている。
(現時点では,もはや WebDriver=Selenium と考えて差し支えない。)

そのWebDriverプロジェクトが,Android向けのテストツールとして
「NativeDriver」を提供し始めたのである。

さらに,Androidというプラットフォーム自体,Googleが提供している。


つまり…
Seleniumの感覚でAndroidを自動テストできるような,Google公認のツールが生まれた
という意味。


という事は:

  • モバイルアプリ開発者は,Androidアプリの自動テストツールとして,将来「NativeDriver」が,高確率でデファクトスタンダードとして受け入れられてゆく可能性を視野に入れるべき。
  • Webアプリ開発者も,「SeleniumがGoogleのお墨付きになった」という点で「鬼に金棒状態」と考え,旧Selenium 1.0 の世界観にとらわれることなく,WebDriverやその亜種の発展を寛容に受け入れるべき。それは「Selenium文化」の発展につながる。

という結論が導き出せると思われる。
(2011年9月時点)



デベロッパは,自分のスキルポートフォリオに「WebDriver」「NativeDriver」を

有力馬として加えてみるのはどうだろうか。



以下は,上述の結論を導き出すに至るまでの調査ログと,

Androidアプリの自動テストツールに関するまとめ・リンク集。

※「Robotium」や「Scirocco」などの先駆者についても記述。

AndroidアプリのCUIテスト

  • (CUI-1)adbから,端末OS内でシェルを実行する
  • (CUI-2)端末上のアプリから,端末OS内でシェルを実行する

AndroidアプリのGUIテスト

  • (GUI-1)JUnitのテストコードから直接,画面操作をエミュレートする
  • (GUI-2)非公式の「Android版Selenium」である,「Robotium」で自動テストする
  • (GUI-3)「Robotium」を進化させた「Scirocco」で自動テストする
  • (GUI-4)Google公認の「Android版Selenium」である,「Native Driver」を使って自動テストする

AndroidアプリのCUIテスト

(CUI-1)adbから,端末OS内でシェルを実行する

adb shellコマンドを利用すればよい。

デバイスやエミュレータの状態を管理するadbツール(2007年の情報)
http://www.atmarkit.co.jp/fjava/colum...

  • adb shell : 接続してみると分かりますが、中身はLinuxなので、Linuxを使ったことがあればいろいろと調べることができます

(CUI-2)端末上のアプリから,端末OS内でシェルを実行する

GScript Androidというアプリを利用:

Androidの自動操作を行う「Gscript Android」
http://moongift.jp/2010/12/20101203-3/

  • Gscript Androidはアプリ内でシェルスクリプトを書き、実行するアプリだ。作成したコードは保存し、後で呼び出すことができる。さらにショートカットを作成して、ホーム画面に配置しておくこともできる


[Android] シェルスクリプトを実行するランチャ GScript
http://mobile54sblog.blogspot.com/200...

  • 「/sdcard/gscript」フォルダに入っているファイルを「Load File」でロードし,一覧からスクリプトを実行できる
  • 1回1回はちょっとしたことであっても、何度も実行すると結構面倒な処理として、フォントの日本語化や無線LANのAdhoc対応への書き換えなどがある。こういった一連の処理をシェルスクリプトにしておけば,それを毎日一回実行すれば良いが、Terminal Emulatorを起動して、「sh /sdcard/xxx.sh」とタイプするのも面倒

AndroidアプリのGUIテスト

(GUI-1)JUnitのテストコードから直接,画面操作をエミュレートする

InstrumentationTestCaseを使うサンプルコード:

Android 画面遷移を含むJunit自動テスト
http://engineer-brain.blogspot.com/20...

  • InstrumentationTestCaseクラスを継承し、getInstrumentation()を使うことで、現在有効になってるアクティビティを補足しながら自動で画面遷移を行うことができる
  • TouchUtilsを使うことで、ボタンを押したことにできる

(GUI-2)非公式の「Android版Selenium」である,「Robotium」で自動テストする

Robotiumの使い方とサンプルコード:

RobotiumでAndroidアプリのシナリオテストを自動化する(2010年10月の情報)
http://d.hatena.ne.jp/thorikawa/20101...

  • RobotiumとはAndroidアプリケーションのブラックボックスレベルのテストを自動化するためのTest Framework。Android版Seleniumというのが謳い文句
  • 内部の実装としては,リフレクションを使ってWindowManagerからビューを取得したりとかなりエグいことをやっている
  • ネックなのは信頼性。OSのバージョンアップに伴い,メソッドが動かなかったりする。まだ不安があるので、Robotiumだけでテストを書くというわけにはいかない

(GUI-3)「Robotium」を進化させた「Scirocco」で自動テストする

Scirocco(シロッコ)の使い方とサンプルの実行方法:

AndroidのUI自動テストツール Scirocco 触ってみた。(2011年5月の情報)
http://d.hatena.ne.jp/re_shikajiro/20...

  • 中ではrobotiumを動かしてるので、記述は簡略
  • UIテストの後スクリーンショットを撮って保存したり、レポートを出力することが出来る
  • 文字化けやJDKバージョン違いなどに注意

(GUI-4)Google公認の「Android版Selenium」である,「Native Driver」を使って自動テストする

NativeDriverとは,WebDriver(=Selenium)のネイティブアプリ版である。


まず,SeleniumとWebDriverのプロジェクト統合について:

Selenium History - Selenium HQ
http://seleniumhq.org/about/history.html

  • Seleniumの開発の歴史


Open Source At Google - Introducing WebDriver(2009年5月の情報)
http://google-opensource.blogspot.com...

  • WebDriverの初回発表


InfoQ - Selenium 2 (別名 Selenium WebDriver) がリリース(2011年7月の情報)
http://www.infoq.com/jp/news/2011/07/...

  • Selenium 2 で最大の新機能は,Selenium 1 (別名 Selenium RC) と競合する Web アプリケーションテストフレームワークであった WebDriver を統合したこと
  • Selenium の前回の安定版リリースは,2010年2月にリリースされた Selenium 1.0.3 だ。Selenium 2 は Selenium 1 と後方互換性を持っているが,新たに Selenium を使用するのであれば,新しい WebDriver API を用いた方がよい


Webテスト自動化フレームワーク「Selenium 2.0」リリース、Google発のテストツール「WebDriver」を搭載(2011年7月の情報)
http://sourceforge.jp/magazine/11/07/...

  • WebDriverは、米Googleが2009年にWebアプリテスト自動化のフレームワークとして発表したオープンソース技術


「Selenium 2.6」リリース 、「Grid」や「WebDriver」などの安定性や機能が大きく改善される(2011年9月の情報)
http://sourceforge.jp/magazine/11/09/...


Android版Native Driverについての概要:

InfoQ - NativeDriverを使ったネイティブモバイルアプリのテスト自動化(2011年6月の情報)
http://www.infoq.com/jp/news/2011/06/...

  • GoogleはNativeDriverを開発した。これはWebDriver APIの一実装であり、 SeleniumがやっているようなブラウザUIではなく、ネイティブUIを使ったアプリの機能テストを実行するためのテスト自動化フレームワーク


【超訳】AndroidのUIをUnitTestできるNative Driver(2011年6月の情報)
http://d.hatena.ne.jp/androidzaurus/2...

  • Googleでは多くのプラットフォーム上でWebアプリケーションをテストするのにWebDriverを使っている
  • スクリーンショットも撮れるし、NativeDriverを改良するにつれて新しいやり方で使っていく予定。標準のInstrumentationテストより、AndroidのNativeDriverのテストが強力


Google製アプリ操作自動化ツール「NativeDriver」がiOSに対応(2011年8月の情報)
http://journal.mycom.co.jp/news/2011/...

  • Googleは8月17日、モバイルアプリケーションの操作を自動化するテストツール「NativeDriver」をiPhoneやiPadのOSである「iOS」に対応させたと発表した。これで「NativeDriver」はAndroidとiOSの双方のアプリケーションに対応したことになる


Native Driverサンプルコード:

NativeDriverを使ってみた:サンプルテストコード読む編その1(2011年7月の情報)
http://d.hatena.ne.jp/shinsuku/201107...

  • キモはテストコード自体から任意のActivityを起動しているところ。SDK付属のInstrumentationTestCaseではあくまでテスト対象のActivityが主でテストケースはそれに依存する形になるのですが、NativeDriverではその制約がありません
  • driver.startActivityとかsendKeysなどのメソッドが存在


利用手順:

NativeDriver を使ってみた(2011年8月の情報)
http://d.hatena.ne.jp/n593977/2011081...

  • instrumentationというのは、JavaのバイトコードとVMの間にインターセプトできる技術
  • robotiumと比べると、レイアウトを記述したxmlで定義したidを対象にテストが書けるところが良いと感じた(robotiumだと、ボタンのラベルを指定するなど、いまいちスマートじゃない)

参考

Androidアプリ開発のテスト自動化ツールに関するまとめ

技術 / Android / TestAutomation
http://www.glamenv-septzen.net/view/987

補足

自動テストに関する世間の技術動向に関して,私が望んでいた将来が近づいてきた。

システム開発で,「あればいいのに」と思う7つのもの
http://language-and-engineering.hatenablog.jp/entry/20110101/p1

  • (2)Windowsのウィンドウ部品を,jQueryのように操作できる,セレクタAPI。
  • (6)クロスブラウザで,ブラウザを自動操作するための,共通言語。


この点に関する,私の過去の努力の足跡の数々(公開済みのもののみ):

プロジェクト専用のDSLで,効率的にIEを自動操作する(WSH/JScript)
http://language-and-engineering.hatenablog.jp/entry/20100310/p1


ブラウザのビジー状態を判定するための,より良い方法 (WSHでIEを自動操作する際,COMのアプリケーションイベントを利用する)
http://language-and-engineering.hatenablog.jp/entry/20100410/p1


"Excelenium"(エクセレニウム)で,快適な自動回帰テストを  (Seleniumのテストスクリプトとテスト仕様書を自動生成)
http://language-and-engineering.hatenablog.jp/entry/20090524/p1


IE AutoTester で,UIの回帰テストを完全自動化
http://language-and-engineering.hatenablog.jp/entry/20090922/p1


「実行可能ドキュメント」が満たすべき性質 − テスト自動化ツール「Excelenium」で使われている技術や手法
http://language-and-engineering.hatenablog.jp/entry/20101112/p1

これら自作ツール類は,いずれWebDriverに統一されていくか,もしくは基盤の大部分がそれにリプレースされてゆく事になるだろう。

補足2

2013年におけるツールの普及状況については,下記のエントリで詳しくまとめて下さった方がいるのでそちらを参照。

Androidの自動テストツール、今(2013年)から使うなら何がよいのか - kk_Atakaの日記
http://d.hatena.ne.jp/kk_Ataka/201308...

  • よく検索に引っかかる NativeDriver はとっくに開発終了
  • Windows 使いなら robotium あたりが無難かもしれない