AndroidのTestまとめ

Table of Contents

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

Androidのテストは大きく分けて Unit testUI 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'
}