読者です 読者をやめる 読者になる 読者になる

ひだまりソケットは壊れない

ソフトウェア開発に関する話を書きます。 最近は主に Android アプリ、Windows アプリ (UWP アプリ)、Java 関係です。

まじめなことを書くつもりでやっています。 適当なことは 「一角獣は夜に啼く」 に書いています。

Android の Instrumented Test で指定のサイズのテストだけ実行する (@SmallTest とか @LargeTest とか)

Android アプリ ライブラリ

Android Testing Support Library (ATSL) の話。 バージョン 0.5 時点での情報です。

ライブラリの準備方法などはドキュメントを読んでください。

テストサイズを表すアノテーション

android.support.test.filters というパッケージがあって、この中にはテストをフィルタするのに使用できるアノテーションが入っています。 その中に、テストのサイズを表すためのアノテーションが 3 つ入っています。

これらはテストクラス自体に付けることもできますし、メソッド単体に付けることもできます。 実装を見たところ、メソッドとクラスの両方にアノテーションが付けられている場合はメソッドアノテーションが優先されるようです。

ちなみに、Android Testing Support Library じゃなくて android.test.suitebuilder.annotation パッケージの方にも同名のアノテーションがありますが、そっちは deprecated ぽいし AndroidJUnitRunner と組み合わせて使うことはできないぽいので注意しましょう。

AndroidJUnitRunner とテストサイズによるフィルタリング

AndroidJUnitRunner でテストを実行する場合、テストサイズによるフィルタリングが可能です。 下記 Javadoc にいろいろ書かれています。

adb でテスト実行する場合

上のドキュメントでは、adb コマンドでテストを実行する際にどういうオプションを渡せばいいかが主に書かれています。 例えば、small サイズのテストのみを実行する場合は、以下のようになります。

adb shell am instrument -w -e size small your.test.target/android.support.test.runner.AndroidJUnitRunner

Gradle の connectedAndroidTest タスクで実行する場合

AndroidManifest.xml で指定する (ただし現在はバグで動かない)

上のドキュメントには All arguments can also be specified in the in the AndroidManifest via a meta-data tag ということが書かれています。 すなわち、テスト用のアプリパッケージの AndroidManifest.xml ファイル (app/src/androidTest/AndroidManifest.xml ファイル) に以下のような記述をすると、small サイズのテストのみが実行されるはず、ということです。

    <instrumentation
        android:name="android.support.test.runner.AndroidJUnitRunner"
        android:targetPackage="...">
        <meta-data android:name="size"
                   android:value="small"/>
    </instrumentation>

ただし現在はバグで動きません。 (指定が無視されます。) バグ報告を上げたので、対応状況は下記ページをご覧ください。

バグがなければ、上のような記述をしておけば ./gradlew :app:connectedAndroidTest という感じで Gradle タスクでテストを実行したときにテストサイズのフィルタリングが効きます。

Gradle のビルドスクリプトで指定する

AndroidManifest.xml に書かずに Gradle のビルドスクリプトにオプションを指定することができます。 上の方法の代わりにこの方法を使うことで、上のバグを回避できます。 sumio さんに教えて頂きました。


android {
    defaultConfig {
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        testInstrumentationRunnerArguments size: 'small'
    }
}

上のような感じで書きます。

Android Studio 上でテストを実行する場合

Android Studio 上でテストを実行する場合は、build.gradle での記述が有効にならないので、configurations を弄る必要があります。 下図のような感じで、Extra options に 「-e size small」 と入力すれば良いです。

f:id:nobuoka:20160527031054p:plain

おわり

@SmallTest アノテーションとか @LargeTest アノテーションとかがあって、テスト実行時にそれらのフィルタリングができるという情報を過去に見たのですが、いざやってみるとあまり情報がなくてうまくいかなかったのでまとめてみました。

コミットごとのテストは @SmallTest だけにして、ある程度開発が終わってレビューに出す前の段階になったら @MediumTest@LargeTest のテストも行うようにする、とかにしたらテストにかかる時間が短くなっていいかもしれませんね。

関連ページ