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