LoginSignup
12
12

More than 5 years have passed since last update.

Robotium で書いた Android アプリのテストを AWS Device Farm で実行する

Last updated at Posted at 2016-01-17

ようやく 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 でテストを実行する

プロジェクト作成

  1. AWS の画面で、Device Farm を開く
     
  2. Create a new project ボタンをクリック
    スクリーンショット 2016-01-17 20.02.36(2).png
     
  3. プロジェクト名を入力する
    スクリーンショット 2016-01-17 20.02.41(2).png
    何でも良いのですが、DeviceFarmSampleAndroid と入れておきました。
     
  4. 作成されたプロジェクトを開く
    スクリーンショット 2016-01-17 20.03.03(2).png
    ↑の DeviceFarmSampleAndroid をクリック
     

テストの設定と実行

  1. Create a new run
    スクリーンショット 2016-01-17 20.03.10(2).png
    左側のボタン(ドロイドくん / リンゴ)をクリック
     
  2. 本体 apk ファイルの指定
    スクリーンショット 2016-01-17 20.03.27(2).png
    ↑ Uploadボタンをクリックして、本体の apk ファイル(app/build/outputs/apk/app-debug.apk)を指定する。
     
  3. アプリケーションの情報が表示される
    スクリーンショット 2016-01-17 20.05.16(2).png
    Run name はデフォルトで入力されている。(変えたければ変更可能)
    Next step をクリック
     
  4. テストの設定
    スクリーンショット 2016-01-17 20.05.27(2).png
    色んなテスト方法が選択できます。
    Built-in: Fuzzを選択すると、モンキーテストが実行されます。テストケースがない場合は、ひとまずこれでも可能) 今回は、Robotium でテストを記述しているので、Instrumentation を選択
     
  5. テスト apk の指定
    スクリーンショット 2016-01-17 20.05.30(2).png
    ↑ Upload ボタンをクリックし、テスト apk ファイル(app/build/outputs/apk/app-debug-androidTest*.apk)を指スクリーンショット 2016-01-17 20.05.56(2).png スクリーンショット 2016-01-17 20.05.56(2).png 定する
     
  6. テストフィルタの設定
    スクリーンショット 2016-01-17 20.05.56(2).png
    クラス指定やテストレベルの指定ができそうです(試していない)
    ひとまず、デフォルトのままで Next step をクリック
     
  7. 実行デバイスの選択
    スクリーンショット 2016-01-17 20.06.03(2).png
    デフォルトで、Top Devices が選択されています。
    Create a new device pool で色んな機種を選択できそうです(試していない)
    Next step をクリック
     
  8. デバイス環境の設定
    スクリーンショット 2016-01-17 20.06.07(2).png デバイス環境(他アプリ、通信環境、場所、言語、など)を必要に応じて設定できる。
    デフォルトのままで、 Review and start run をクリック
     
  9. 実行前の確認
    スクリーンショット 2016-01-17 20.06.15(2).png いままでの設定を確認して、必要あれば修正できそう(試していない)
    Confirm and start run をクリックしてテスト実行
     
  10. テスト実行中…
    スクリーンショット 2016-01-17 20.06.28(2).png この画面では全体の進捗しか確認できないので、実行中の行をクリック
     
  11. テスト実行中…
    スクリーンショット 2016-01-17 20.06.41(2).png 実行中の端末はぐるぐる、未実行の端末は時計アイコンが表示されています。
     
  12. 実行結果1
    スクリーンショット 2016-01-17 20.11.45(2).png 必ず失敗するテスト(LoadingActivityTestFail#testFail)を用意しておいたので、期待通りですね!
     
  13. 実行結果2(↑の下部へスクロール)
    スクリーンショット 2016-01-17 20.11.47(2).png 端末毎のテスト結果が確認できます。
    端末名をクリックすると、テストの詳細が確認できます。
     
  14. 実行結果3
    スクリーンショット 2016-01-17 20.14.01(2).png 今回は、スクリーンショットを保存していないので Screenshots を開いてもスクリーンショットは参照できません。
    Performance タブをクリックすると、CPU, Memory, Threads の値を時系列に確認できます。
    スクリーンショット 2016-01-17 21.57.17(2).png
     
      Files タブをクリックすると、各テストでのログをダウンロードすることができます。
    スクリーンショット 2016-01-17 21.57.20(2).png

試しに、LoadingActivityTestFailLogcat をダウンロードして見てみます。

(略)
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 アプリのテスト実行
12
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12