Android Studio は簡単にテストができるように設計されています。 数回のクリックだけで、ローカルJVM上で実行するJUnitテストや端末上で実行するインストルメンテッドテストを設定できます。 もちろん、ローカルユニットテストでテストAndroid APIを呼び出すためのMockito や、 インストルメンテッドテストでユーザー操作を実行するEspresso や UI Automatorようなテストフレームワークを組み込んで、テスト機能を拡張することもできます。 Espresso Test Recorderを使って、自動的にEspressoテストを生成することができます。
このページでは、新しいテストをアプリに追加して、それをAndroid Studioから実行する方法についての基本的な方法を説明します。
テストの記述に関するより詳細な手順については、テストを開始するを参照してください。
テストコードの保存場所は、あなたが記述しているテストのタイプによって異なります。 Android Studio では、以下のような二種類のテスト用にソースコードディレクトリ(ソースセット)を用意しています。:
module-name/src/test/java/
に保存されます。
これは、あなたの開発機のローカルJava仮想マシン(JVM)上で実行されるテストです。 テストがAndroidフレームワークへの依存関係を持たない場合や Android フレームワークの依存関係をモックによって擬似的に再現できる場合は、 これらのテストを使って実行時間を最小限にできます。
実行時、これらのテストは、全てのfinal
修飾子が削除された修正版のandroid.jar
に対して実行されます。
これにより、Mockitoのような有名なモックライブラリを使用することができます。
module-name/src/androidTest/java/
に保存されます。
これはハードウェア端末やエミュレーター上で実行されるテストです。
これらのテストはInstrumentation
にアクセスし、
テストしているアプリのContext
のような情報へあなたがアクセスできるようにし、
テストコードからテスト中のアプリを制御できるようにします。
統合テストや機能UIテストを記述してユーザーの操作を自動化する場合や、モックオブジェクトでは再現できないAndroid依存関係をテストが持っている場合は、
これらのテストを使用してください。
インストルメンテッドテストはAPK内(アプリのAPKとは別の)内に組み込まれるので、
それぞれ独自のAndroidManifest.xml
ファイルを持つ必要があります。
しかし、Gradleはこのファイルをビルド中に自動的に生成するので、プロジェクトのソースセット内でこのファイルを目にすることはありません。
`minSdkVersion`に異なる値を設定したり、テスト用に実行リスナーを登録したり、必要であればあなたが自分でマニフェストファイルを追加することができます。
アプリをビルドする時、Gradleは複数のマニフェストファイルを一つに結合します。
The Gradle ビルドは、プロジェクトのアプリのソースセットと同じ方法で これらテストソースセットを解釈します。 これにより、ビルドバリアントに基づいてテストを作成することができます。
新規プロジェクトを作成したりアプリモジュールを追加したりした時、Android Studioは上記のテストソースセットを作成し、各テストにサンプルテストファイルを用意します。 図1で示すように、これらは Project ウィンドウで見ることができます。
図 1. プロジェクトの(1) インストルメンテッドテストと (2) ローカル JVM テストは、それぞれ Projectビュー(左側) や Android ビュー (右側)二表示されます。
ローカルユニットテストやインストルメンテッドテストを作成するには、以下の手順に沿って特定のクラスやメソッド用の新しいテストを作成します。:
それ以外の方法として、以下のように汎用Javaファイルを適切なテストソースセット内に作成することができます:
また、アプリモジュールのbuild.gradle
ファイルでテストライブラリの依存関係を設定してください:
dependencies {
// Required for local unit tests (JUnit 4 framework)
testCompile 'junit:junit:4.12'
// Required for instrumented tests
androidTestCompile 'com.android.support:support-annotations:24.0.0'
androidTestCompile 'com.android.support.test:runner:0.5'
}
その他の必要に応じて使用するライブラリの依存関係と、テストを記述する方法の詳細については ローカルユニットテストを作成する と インストルメンテッドユニットテストを作成するを参照してください。
プロジェクトに一意のソースセットを持つビルドバリアントが含まれている場合、 対応するインストルメンテッドテストのソースセットが必要なことがあります。 Creating instrumented tests in source sets that correspond to your build variants helps keep your test code organized and allows you to run only the tests that apply to a given build variant.
ビルドバリアントのソースセットを追加するには、以下の手順に沿って作業します:
これで、上記の手順に沿って新しいテストを追加することで、この新しいソースセットにテストを追加できます。 Choose Destination Directory ダイアログが表示されたら、 新しいバリアント用のテストソースセットを選びます。
src/androidTest/
ソースセット内にあるインストルメンテッドテストは、全てのビルドバリアントで共有されます。
アプリの"MyFlavor" バリアント用のテストAPKをビルドする時、
Gradle はsrc/androidTest/
ソースセットと src/androidTestMyFlavor/
ソースセットの両方を組み合わせます。
例えば、以下の表では対応するアプリコードソースセットの対応するソースセット内で、インストルメンテーションテストファイルがどのように配置されるかを示しています。
アプリクラスへのパス | 対応するインストルメンテーションテストクラスへのパス |
---|---|
src/main/java/Foo.java
|
src/androidTest/java/AndroidFooTest.java
|
src/myFlavor/java/Foo.java
|
src/androidTestMyFlavor/java/AndroidFooTest.java
|
アプリソースセットの時と同じ様に、Gradle ビルドは異なるテストソースセットのファイルを結合したり上書きしたりします。
この場合、 "androidTestMyFlavor"ソースセット内のAndroidFooTest.java
ファイルは"androidTest"ソースセット内のファイルを上書きします。
ソースセットがどのように結合されるかの詳細については、ビルド構成を設定するを参照してください。
アプリとテストのソースセットでビルドバリアントを使うべきもう一つの理由は、 モック依存関係を使って外部からの影響を受けないテストを作成するためです。 つまり、擬似依存関係の実装(通常はあまり当てにならない、ネットワークリクエストやデバイスセンサーデータのような)を含んだアプリのプロダクトフレーバーを作成して、対応するモックテストソースセットを追加することができます。 詳細については、外部からの影響を受けないテストのためにプロダクトフレーバーを使用するに関するブログの投稿を参照してください。
GradleがテストAPKをビルドする時、Gradleは自動的にAndroidManifest.xml
ファイルを生成して、それを <instrumentation>
ノードで設定します。
Gradle があなたに代わってこのノードを設定する理由の一つは、targetPackage
プロパティがテスト対象のアプリの正しいパッケージ名を適切に設定するからです。
テストソース内でもう一つマニフェストファイルを作成するか、以下のコード例で示すようにモジュールレベルbuild.gradle
ファイルを設定することで、
このノードの他の設定のいくつかを変更できます。
android { ... // Each product flavor you configure can override properties in the // defaultConfig {} block. To learn more, go to Configure Product Flavors. defaultConfig { ... // Specifies the application ID for the test APK. testApplicationId "com.test.foo" // Specifies the fully-qualified class name of the test instrumentation runner. testInstrumentationRunner "android.test.InstrumentationTestRunner" // If set to 'true', enables the instrumentation class to start and stop profiling. // If set to false (default), profiling occurs the entire time the instrumentation // class is running. testHandleProfiling true // If set to 'true', indicates that the Android system should run the instrumentation // class as a functional test. The default value is 'false' testFunctionalTest true } } ...
既定では全てのテストはデバッグビルドタイプで実行されます。
モジュールレベルbuild.gradle
ファイルのtestBuildType
プロパティを使用することで、
これを別のビルドタイプに変更することができます。
例えば、テストを"staging" ビルドタイプで実行したい場合は、以下のコードで示すようにファイルを編集してください。
android {
...
testBuildType "staging"
}
Gradle用Androidプラグイン を使用すると、
特定のオプションをユニットテストの全部または一部に対して設定することができます。
モジュールレベル build.gradle
ファイルで
testOptions
{}
ブロックを使って、 Gradle が全てのテストをどのように実行するかを変更できるオプションを設定します。
android { ... // Encapsulates options for running tests. testOptions { // Changes the directory where Gradle saves test reports. By default, Gradle saves test reports // in thepath_to_your_project/module_name/build/outputs/reports/
directory. // '$rootDir' sets the path relative to the root directory of the current project. reportDir "$rootDir/test-reports" // Changes the directory where Gradle saves test results. By default, Gradle saves test results // in thepath_to_your_project/module_name/build/outputs/test-results/
directory. // '$rootDir' sets the path relative to the root directory of the current project. resultsDir "$rootDir/test-results" } }
ユニットテストのみのオプションを設定するには、testOptions {}
内のunitTests
{}
ブロックを設定します。
android { ... testOptions { ... // Encapsulates options for unit tests. unitTests { // By default, unit tests throw an exception any time the code you are testing tries to access // Android platform APIs (unless you mock Android dependencies yourself or with a testing // framework like Mockito). However, you can enable the following property so that the test // returns either null or zero when accessing platform APIs, rather than throwing an exception. returnDefaultValues true // Encapsulates options for controlling how Gradle executes unit tests. For a list // of all the options you can specify, read Gradle's reference documentation. all { // Sets JVM argument(s) for the test JVM(s). jvmArgs '-XX:MaxPermSize=256m' // You can also check the task name to apply options to only the tests you specify. if (it.name == 'testDebug') { systemProperty 'debug', 'true' } if (it.name == 'connectedDebugAndroidTest') { ... } } } } }
テストを実行するには、以下の手順を実行します:
既定では、Android Studioの既定の実行設定を使ってテストは実行されます。 インストルメンテーションランナーやデプロイメントオプションのようないくつかの実行設定を変更したい場合は、 Run/Debug Configurations ダイアログ(Run > Edit Configurationsをクリックすると表示されます。)で実行設定を編集することができます。
テストカバレッジツールをローカルユニットテストで使用して、ユニットテストでカバーしているアプリコードの割合と範囲を追跡することができます。 アプリを構成する要素、クラス、メソッド、コード行を適切にテストできているかどうかを判別するには、テストカバレッジツールを使用します。
ユニットテストを実行するにはいくつかの方法があり、それらの方法についてはIntelliJの カバレッジを実行する ページで説明されています。 以下の手順は、エディターからユニットテストをインラインで実行する方法を示しています。:
カバレッジツールウィンドウが表示されます。
図 2 は、計算機のユニットテストで加算、減算、乗算、除算をテストする場合のカバレッジツールウィンドウを示しています。
図 2. アプリケーションのコードカバレッジの割合を見てください。
ローカルユニットテストの詳細については、ローカルユニットテストを作成するを参照してください。
JUnit テストやインストルメンテッドテストを実行した時、その結果はRun ウィンドウに表示されます。 緑色のバーは、全てのテストが成功したことを意味し、赤色のバーは少なくとも一つのテストが失敗したことを意味します。 図1は、テストの実行が成功したことを示しています。
図 1. Run ウィンドウにテスト結果が表示されます。
Run ウィンドウでは左側のツリービューにテストが表示され、右側の出力パネルに現在のテスト一式の結果とメッセージが表示されます。 以下のように、ツールバーとコンテクストメニューとステータスアイコンを使ってテスト結果を管理します。:
Run ウィンドウ、そのツールバー、コンテキストメニューの詳細については、 IntelliJ のページテストランナータブを参照してください。
テストの実行にかかった時間を確認するには、以下を行います:
テストの右側に、ミリ秒単位の経過時間が表示されます。
ユニットテストにて二つの文字列オブジェクトを比較する際の assertEquals()
で失敗した場合、
以下のようにして、二つの文字列オブジェクト間の違いを確認して失敗の原因を調べることができます。:
以下のようにして、テスト結果を XML や HTML の形式でエクスポートすることができます。:
エクスポートされたテスト結果は指定してフォルダーに保存されます。
以下のようにして、エクスポートしたテスト結果をインポートすることができます:
インポートされたテスト結果は Run ウィンドウに表示されます。