AndroidのTestまとめ


この記事をまとめるにあたって Best Practices for Testing | Android Developers を主に参考にしています。

Androidのテストは大きく分けて Unit test と UI test の2種類があり、実装方法や対象などで分けると5種類ある。

ジャンルテストの種類Androidへの依存主に利用するツール特徴
Unit Testlocal unit TestなしMockitojava VMで動作する
instrumentation TestありhamcrestAndroid上で動作する
App Component TestありServiceなどのテスト
UI Testsingle app Testありespresso
multi app Testありuiautomatorv18以上。

local unit test

android framework に依存しないテスト。java vm で実行されるため、他のAndroidOSに依存するテストに比べて高速。

android.jar は実際のコードが存在しないため、例外をスローしてしまう。そのため、以下の対応をする必要がある。

  • Mockito で代替となるモックの処理を実装する
  • テスト対象を android.jar に依存しないコードにがんばってする

Mockitoで処理する場合

  1. unitTests.returnDefaultValues = true を設定し、android.jarの中を呼んだ場合に、例外ではなくデフォルト値を返すようにする。
  2. Mockitoでモックを実装する
#build.gradle
android{
    testOptions {
        unitTests.returnDefaultValues = true
    }
}

kotlinでMockito

Mockitoがkotlinの予約語を使っているので、バッククォートが入ってちょっと書きづらい

Mockito.`when`()

nhaarman/mockito-kotlin の whenever()を使えばいい感じに出来そうだったけど、引数がnullを許容していないので使いづらい。

fun <T> whenever(methodCall: T?) = Mockito.`when`(methodCall)

こんな感じで定義し直せばそれっぽく使える。 shikajiro/mockito-kotlin にfork する予定。

instrumentation test

android framework に依存したテスト。Android のエミュレータや実機 で実行される

直ぐにテストを実行できない問題にはまる

Android Studio の右クリック > Run すると、JUnitテストとして動いてしまい、 Empty test suite. とエラーになりテストできない。 以下の雛形を元に Android Testとしてビルド設定を作り実行するとちゃんと動く。

single app for espresso

後で書く

multi app for uiautomator

後で書く

Tips

android library のテストで 64k 問題にはまる

テストと直接関係ない話だけど、テストライブラリとか追加してたらはまった。デバッグビルドの時だけ、multidexにする。

android{
     buildTypes {
        debug{
            multiDexEnabled true
        }
    }
}

dependencies {
    debugCompile 'com.android.support:multidex:1.0.1'
}