web-dev-qa-db-ja.com

AndroidのJUnit 4が機能しないのはなぜですか?

Androidのドキュメントにあるように、「AndroidテストAPIはJUnit4ではなくJUnit3コードスタイルをサポートしていることに注意してください。」( テスト基本 )AndroidではJUnit4をそのまま使用できないことは明らかです。

しかし、なぜそうなのでしょうか?テストはDVM内で実行されるためでしょうか(AndroidランタイムはJUnit 3のみをサポートしています)?JVMでは、JVM自体で、使用するJUnitランタイムを選択できます。これはDVM内では不可能ですか?

33
Matthew

2015/10更新

Android Testing Support Library の一部であるAndroidJUnitRunnerを介して可能になりました。つまり、Gradleベースのプロジェクトで次のことを行う必要があります。

  1. 依存関係を追加します。

    _dependencies {
        compile 'com.Android.support:support-annotations:22.2.0'
        androidTestCompile 'com.Android.support.test:runner:0.4.1'
    }
    _
  2. TestInstrumentationRunnerを指定します。

    _Android {
        defaultConfig {
            testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
        }
    }
    _
  3. テストクラスに@RunWith(AndroidJUnit4.class)アノテーションを付けます。

  4. 通常のJUnit4スタイルでテストを記述します。

Espressoセットアップ手順 も参照してください。プレーンなJUnit4テストにはEspresso自体は必要ないことに注意してください。

なぜそれが必要なのか

このトピックに関してインターネットで見つけることができる情報はほとんどありません。私が見つけた最高のものは InstrumentationTestRunner の情報でした。

JUnit4テストが他のAndroidコードと同じように、Javaデバイスで実行されるのを妨げるものは何もありません。ただし、Androidテストフレームワークはいくつかの追加作業を行います。

  1. ADBを介してテスト結果を開発マシンに送り返します。
  2. インストルメンテーションを行います(これが正確に何を伴うのかはわかりません)。

上記は、JUnit3専用のいくつかの拡張機能によって実行されます。

このJUnit3固有のコードは、コアAndroidシステムの一部を形成するInstrumentationTestRunnerの一部のようです。ただし、AndroidJUnitRunnerで明らかなように、JUnit4をサポートするカスタムテストランナーを使用することは可能です。または他のフレームワーク。

40
Ralf

説明はこちら:

http://d.hatena.ne.jp/esmasui/20120910/1347299594

問題は InstrumentationTestRunner の実装から発生することがわかりました。

著者の解決策は AndroidJUnit4 プロジェクトです。

2
usethe4ce