ようやく 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 アプリのテスト実行