サイトのトップへ戻る

Android Studio ドキュメント 日本語訳

サイト内検索

アプリをテストする

Android Studio は簡単にテストができるように設計されています。 数回のクリックだけで、ローカルJVM上で実行するJUnitテストや端末上で実行するインストルメンテッドテストを設定できます。 もちろん、ローカルユニットテストでテストAndroid APIを呼び出すためのMockito や、 インストルメンテッドテストでユーザー操作を実行するEspressoUI Automatorようなテストフレームワークを組み込んで、テスト機能を拡張することもできます。 Espresso Test Recorderを使って、自動的にEspressoテストを生成することができます。

このページでは、新しいテストをアプリに追加して、それをAndroid Studioから実行する方法についての基本的な方法を説明します。

テストの記述に関するより詳細な手順については、テストを開始するを参照してください。



テストのタイプと保存場所

テストコードの保存場所は、あなたが記述しているテストのタイプによって異なります。 Android Studio では、以下のような二種類のテスト用にソースコードディレクトリ(ソースセット)を用意しています。:

Local unit tests

module-name/src/test/java/に保存されます。

これは、あなたの開発機のローカルJava仮想マシン(JVM)上で実行されるテストです。 テストがAndroidフレームワークへの依存関係を持たない場合や Android フレームワークの依存関係をモックによって擬似的に再現できる場合は、 これらのテストを使って実行時間を最小限にできます。

実行時、これらのテストは、全てのfinal修飾子が削除された修正版のandroid.jar に対して実行されます。 これにより、Mockitoのような有名なモックライブラリを使用することができます。

Instrumented tests

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 ビュー (右側)二表示されます。



新しいテストを追加する

ローカルユニットテストやインストルメンテッドテストを作成するには、以下の手順に沿って特定のクラスやメソッド用の新しいテストを作成します。:

  1. テストしたいコードが含まれている Javaファイルを開きます。
  2. テストしたいクラスやメソッドをクリックして、Ctrl+Shift+T (⇧⌘T)を押します。
  3. 表示されたメニューで、Create New Testをクリックします。
  4. Create Test ダイアログで、任意のフィールドを編集して生成するメソッドを選び、それからOKをクリックします。
  5. Choose Destination Directory ダイアログで、作成したいテストの種類に対応したソースセット(インストルメンテッドテストの場合はandroidTest 、ローカルユニットテストの場合はtest )をクリックします。それからOKをクリックします。

それ以外の方法として、以下のように汎用Javaファイルを適切なテストソースセット内に作成することができます:

  1. 左側のProject ウィンドウで、ドロップダウンメニューをクリックしてProject ビューを選びます。
  2. 適切なモジュールフォルダーとその入れ子になった src フォルダーを展開します。 ローカルユニットテストを追加するには、 test フォルダーとその入れ子になっているjava フォルダーを展開します; インストルメンテッドテストを追加するには、 androidTestフォルダーとその入れ子になっている java フォルダーを展開します。
  3. Java パッケージディレクトリ上で右クリックして、 New > Java Classの順に選びます。
  4. ファイルに名前を付けて、OKをクリックします。

また、アプリモジュールの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.

ビルドバリアントのソースセットを追加するには、以下の手順に沿って作業します:

  1. 左側の Project ウィンドウで、ドロップダウンメニューをクリックして Project ビューを選びます。
  2. 適切なモジュールフォルダー内で、 src フォルダーを右クリックしてNew > Directoryをクリックします。
  3. ディレクトリ名には、 "androidTestVariantName"と入力します。 例えば、 "MyFlavor"という名前のビルドバリアントがある場合、そのディレクトリ名は"androidTestMyFlavor"にする必要があります。 それから OKをクリックします。
  4. 新しいディレクトリを右クリックして、New > Directoryをクリックします。
  5. ディレクトリ名には "java" と入力し、それから OKをクリックします。

これで、上記の手順に沿って新しいテストを追加することで、この新しいソースセットにテストを追加できます。 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 のテストオプションを設定する

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 the path_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 the path_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') {
          ...
        }
      }
    }
  }
}


テストを実行する

テストを実行するには、以下の手順を実行します:

  1. ツールバーにあるSync Project をクリックして、プロジェクトがGradle と同期しているようにしてください。
  2. 以下の方法のうちいずれか一つを使ってテストを実行します:
    • Project ウィンドウで、テストを右クリックしてRunをクリックします。
    • コードエディター上で、テストファイルのクラスやメソッドを右クリックしてそれからRun をクリックしてクラス内の全てのメソッドをテストします。
    • 全てのテストを実行するには、test ディレクトリを右クリックしてRun tests をクリックします。

既定では、Android Studioの既定の実行設定を使ってテストは実行されます。 インストルメンテーションランナーやデプロイメントオプションのようないくつかの実行設定を変更したい場合は、 Run/Debug Configurations ダイアログ(Run > Edit Configurationsをクリックすると表示されます。)で実行設定を編集することができます。



テストカバレッジを表示する

テストカバレッジツールをローカルユニットテストで使用して、ユニットテストでカバーしているアプリコードの割合と範囲を追跡することができます。 アプリを構成する要素、クラス、メソッド、コード行を適切にテストできているかどうかを判別するには、テストカバレッジツールを使用します。

ユニットテストを実行するにはいくつかの方法があり、それらの方法についてはIntelliJの カバレッジを実行する ページで説明されています。 以下の手順は、エディターからユニットテストをインラインで実行する方法を示しています。:

  1. 実行したユニットテストをダブルクリックします。
  2. エディター上でカバレッジを実行したい行にカーソルを置きます。
    • クラス宣言にカーソルを置いた場合、そのクラス内の全てのテストメソッドが実行されます。
    • メソッド宣言にカーソルをいた場合、そのメソッド内の全てのコードが実行されます。
    • メソッド内の特定の行にカーソルを置いた場合、その行のみが実行されます。
  3. カーソルを置いた行を右クリックします。
  4. コンテクストメニューで、Run test-name with coverageを選びます。

    カバレッジツールウィンドウが表示されます。

図 2 は、計算機のユニットテストで加算、減算、乗算、除算をテストする場合のカバレッジツールウィンドウを示しています。

図 2. アプリケーションのコードカバレッジの割合を見てください。

ローカルユニットテストの詳細については、ローカルユニットテストを作成するを参照してください。



テスト結果を表示する

JUnit テストやインストルメンテッドテストを実行した時、その結果はRun ウィンドウに表示されます。 緑色のバーは、全てのテストが成功したことを意味し、赤色のバーは少なくとも一つのテストが失敗したことを意味します。 図1は、テストの実行が成功したことを示しています。

図 1. Run ウィンドウにテスト結果が表示されます。

Run ウィンドウでは左側のツリービューにテストが表示され、右側の出力パネルに現在のテスト一式の結果とメッセージが表示されます。 以下のように、ツールバーとコンテクストメニューとステータスアイコンを使ってテスト結果を管理します。:

  1. Run ツールバーを使って、現在のテスト再実行したり、現在のテストを停止したり、失敗したテストを再実行したり(ユニットテストでのみ使用可能なので図には表示されていません)、 出力を一時停止したり、スレッドをダンプ出力したりできます。
  2. testing ツールバーを使って、テスト結果をフィルタしたり並び替えたりできます。 また、ノードを展開したり折り畳んだり、テストカバレッジを表示したり、テスト結果のインポートとエクスポートをしたりもできます。
  3. コンテキストメニューをクリックして、実行中のテストを追跡したり、 インライン統計を表示したり、スタックトレースへスクロールしたり、例外が発生したソースコードを開いたり、そのソースへ自動スクロールしたり、テストの実行が完了した時に最初に失敗したテストを選んだりできます。
  4. テストステータスアイコンは、そのテストについてエラーがあるか、無視されたか、失敗したか、進行中か、経過したか、一時停止中か、終了したか、実行されなかったかを表します。
  5. ツリービュー内の行を右クリックすると、コンテキストメニューが表示されます。このコンテキストメニューでは、デバッグモードでテストを実行したり、テストのソースコードファイルを開いたり、テスト対象のソースコード内の行へジャンプしたりできます。

Run ウィンドウ、そのツールバー、コンテキストメニューの詳細については、 IntelliJ のページテストランナータブを参照してください。



インライン統計を表示する

テストの実行にかかった時間を確認するには、以下を行います:

  1. 歯車のアイコンをクリックします。
  2. ドロップダウンリストで、Show Inline Statisticsを選びます。

    テストの右側に、ミリ秒単位の経過時間が表示されます。



文字列を比較する

ユニットテストにて二つの文字列オブジェクトを比較する際の assertEquals()で失敗した場合、 以下のようにして、二つの文字列オブジェクト間の違いを確認して失敗の原因を調べることができます。:

  1. 出力パネルで、Click to see difference リンクをクリックします。
  2. Differences ビューアで、IntelliJ のページ Differences viewer for filesで説明されているような違いがないか探します。


テスト結果をエクスポートする

以下のようにして、テスト結果を XML や HTML の形式でエクスポートすることができます。:

  1. Export Test Resultsをクリックします。
  2. Export Test Results ダイアログで、形式と出力の情報を設定して、OKをクリックします。

    エクスポートされたテスト結果は指定してフォルダーに保存されます。



テスト結果をインポートする

以下のようにして、エクスポートしたテスト結果をインポートすることができます:

  1. Import Test Resultsをクリックします。
  2. ドロップダウンメニューで、インポートしたいファイルを選びます。

    インポートされたテスト結果は Run ウィンドウに表示されます。