ようやく AWS Device Farm を使う時間ができたので触ってみました。
仕事では、Robotium で Android アプリのテストをがっつり書いているので、Device Farm で Robotium のテストを動かす方法を記します。
はじめに
サンプルアプリ
Android Studio の Loading Activity のテンプレートの動作に対して、Robotium でテストを書いたサンプルアプリを DeviceFarmSampleAndroid に置いているので、サクッと試してみたい方はそちらをご利用下さい。
※必ず失敗するパターンを含めています。
以後はこのサンプルアプリを使って解説します。
AWS のアカウント取得
https://aws.amazon.com/jp/getting-started/?nc2=h_l2_cc
を参考に、無料アカウントで良いので取っておいて下さい。
※Device Farm には、250 Device minute の無料枠があります。(2016/01/17現在)
https://aws.amazon.com/jp/device-farm/
アプリのバイナリ(apk ファイル)作成
Android アプリのルートディレクトリ(*.iml ファイルや、gradlew ファイルがあるフォルダ)にて、
-
./gradlew assembleDebugを実行して、アプリ本体の apk ファイルを作成 -
app/build/outputs/apk/app-debug.apkができていれば OK -
./gradlew assembleAndroidTestを実行して、テストの apk ファイルを作成 -
app/build/outputs/apk/app-debug-androidTest*.apkができていれば OK
ここで生成した、アプリ本体とテストの2つの apk ファイルを使います。
(テスト apk は、app-debug-androidTest-unaligned.apk ができていました。←で OK)
Device Farm でテストを実行する
プロジェクト作成
- AWS の画面で、Device Farm を開く
-
Create a new projectボタンをクリック

- プロジェクト名を入力する

何でも良いのですが、DeviceFarmSampleAndroidと入れておきました。
- 作成されたプロジェクトを開く

↑のDeviceFarmSampleAndroidをクリック
テストの設定と実行
- Create a new run

左側のボタン(ドロイドくん / リンゴ)をクリック
- 本体 apk ファイルの指定

↑ Uploadボタンをクリックして、本体の apk ファイル(app/build/outputs/apk/app-debug.apk)を指定する。
- アプリケーションの情報が表示される

Run nameはデフォルトで入力されている。(変えたければ変更可能)
Next stepをクリック
- テストの設定

色んなテスト方法が選択できます。
(Built-in: Fuzzを選択すると、モンキーテストが実行されます。テストケースがない場合は、ひとまずこれでも可能)
今回は、Robotium でテストを記述しているので、Instrumentationを選択
- テスト apk の指定

↑ Uploadボタンをクリックし、テスト apk ファイル(app/build/outputs/apk/app-debug-androidTest*.apk)を指

定する
- テストフィルタの設定

クラス指定やテストレベルの指定ができそうです(試していない)
ひとまず、デフォルトのままでNext stepをクリック
- 実行デバイスの選択

デフォルトで、Top Devicesが選択されています。
Create a new device poolで色んな機種を選択できそうです(試していない)
Next stepをクリック
- デバイス環境の設定

デバイス環境(他アプリ、通信環境、場所、言語、など)を必要に応じて設定できる。
デフォルトのままで、Review and start runをクリック
- 実行前の確認

いままでの設定を確認して、必要あれば修正できそう(試していない)
Confirm and start runをクリックしてテスト実行
- テスト実行中…

この画面では全体の進捗しか確認できないので、実行中の行をクリック
- テスト実行中…

実行中の端末はぐるぐる、未実行の端末は時計アイコンが表示されています。
- 実行結果1

必ず失敗するテスト(LoadingActivityTestFail#testFail)を用意しておいたので、期待通りですね!
- 実行結果2(↑の下部へスクロール)

端末毎のテスト結果が確認できます。
端末名をクリックすると、テストの詳細が確認できます。
- 実行結果3

今回は、スクリーンショットを保存していないのでScreenshotsを開いてもスクリーンショットは参照できません。
Performanceタブをクリックすると、CPU,Memory,Threadsの値を時系列に確認できます。

Filesタブをクリックすると、各テストでのログをダウンロードすることができます。

試しに、LoadingActivityTestFail の Logcat をダウンロードして見てみます。
(略)
01-17 03:08:25.365 8960 8973 I TestRunner: failed: testFail(jp.tokushima.tatsuhama.devicefarmsample.LoginActivityTestFail)
01-17 03:08:25.365 8960 8973 I TestRunner: ----- begin exception -----
01-17 03:08:25.365 8960 8973 I TestRunner:
01-17 03:08:25.365 8960 8973 I TestRunner: junit.framework.AssertionFailedError: checkSearchText(This field is required)
01-17 03:08:25.365 8960 8973 I TestRunner: at junit.framework.Assert.fail(Assert.java:50)
01-17 03:08:25.365 8960 8973 I TestRunner: at junit.framework.Assert.assertTrue(Assert.java:20)
01-17 03:08:25.365 8960 8973 I TestRunner: at jp.tokushima.tatsuhama.devicefarmsample.UITestBase.checkSearchText(UITestBase.java:41)
01-17 03:08:25.365 8960 8973 I TestRunner: at jp.tokushima.tatsuhama.devicefarmsample.LoginActivityTestFail.testFail(LoginActivityTestFail.java:16)
01-17 03:08:25.365 8960 8973 I TestRunner: at java.lang.reflect.Method.invokeNative(Native Method)
01-17 03:08:25.365 8960 8973 I TestRunner: at java.lang.reflect.Method.invoke(Method.java:515)
01-17 03:08:25.365 8960 8973 I TestRunner: at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
01-17 03:08:25.365 8960 8973 I TestRunner: at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
01-17 03:08:25.365 8960 8973 I TestRunner: at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:192)
01-17 03:08:25.365 8960 8973 I TestRunner: at junit.framework.TestCase.runBare(TestCase.java:134)
(略)
LoginActivityTestFail.java:16 で失敗したことがわかりますね。
まとめ
Robotium で書いた Android アプリのテストコードは、本体とテストの apk を AWS Device Farm に渡してあげるだけで簡単に実行できる。
次やりたいこと
※次の記事の予告とは限りません
- Jenkins からビルドして自動実行
- スクリーンショットの保存と取得
- Appium や Espresso など、他の記述方法からの実行
- iOS アプリのテスト実行