Androidテストランナーが「空のテストスイート」を報告するのはなぜですか?


98

IntelliJ / Androidが「空のテストスイート」を報告している理由を理解しようとして、壁に頭をぶつけています。2つのIntelliJモジュールを含む小さなプロジェクト(Eclipseの「プロジェクト」)があります。ユニットテストモジュールには独自のAndroidManifest.xmlがあり、これを下部に貼り付けました。ActivityUnitTestCaseテストはContext-objectに依存するため、私はを実行しようとしています。

メインモジュールのパッケージ名はnilzor.myappです。テストモジュールのパッケージ名はnilzor.myapp.tests

テストランナーがtestBlah()-methodをテストとして検出しないのはなぜですか?

<?xml version="1.0" encoding="utf-8"?>
<!-- package name must be unique so suffix with "tests" so package loader doesn't ignore us -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="nilzor.myapp.tests"
          android:versionCode="1"
          android:versionName="1.0">
    <!-- We add an application tag here just so that we can indicate that
         this package needs to link against the android.test library,
         which is needed when building test cases. -->
    <application>
        <uses-library android:name="android.test.runner"/>
    </application>
    <!--
    This declares that this application uses the instrumentation test runner targeting
    the package of nilzor.myapp.  To run the tests use the command:
    "adb shell am instrument -w nilzor.myapp.tests/android.test.InstrumentationTestRunner"
    -->
    <instrumentation android:name="android.test.InstrumentationTestRunner"
                     android:targetPackage="nilzor.myapp"
                     android:label="Tests for nilzor.myapp"/>
</manifest>

そして、これが私のテストクラスです:;

package nilzor.myapp.tests;

public class NilzorSomeTest<T extends Activity> extends ActivityUnitTestCase<T>{
    public NilzorSomeTest(Class<T> activityClass){
        super(activityClass);
    }

    @SmallTest
    public void testBlah(){
        assertEquals(1,1);
    }
}

私は、Eclipse向けであるにもかかわらず、テストの基礎アクティビティテストドキュメントを読み、このHello worldテストブログを試してみました。テストランナーにテストを見つけて実行させることができません。何が悪いのですか?

私がまだ確信が持てない質問のいくつかは次のとおりです。

  1. 単体テストメソッドの上にアノテーションが必要ですか?
  2. メソッドの前に「test」を付ける必要がありますか、それともJUnitテストだけですか?
  3. のサブパッケージでテストできますnilzor.myapp.testsか?

しかし、この投稿の主な質問は、なぜテストランナーが私のテストを検出しないのかということです。


ポイント3については、Android Studioを使用しているcmd+shift+t場合、現在編集しているクラスと一致する正しいパッケージの場所にテストクラスを自動的に作成するショートカットをお勧めします。
デビッドアーガイルタッカー2017

他の誰かが私と同じくらい不在の状態で採掘されている場合に備えて。@Testマーカーをテストの上に置くことを忘れないでください。
マットD

回答:


70

テストクラスのデフォルトコンストラクターを提供する必要があります。次に例を示します。

package nilzor.myapp.tests;

public class NilzorSomeTest extends ActivityUnitTestCase<ActivityYouWantToTest>{
    public NilzorSomeTest(){
        super(ActivityYouWantToTest.class);
    }

    @SmallTest
    public void testBlah(){
        assertEquals(1,1);
    }
}

他の質問について:

  1. いいえ。私のテストはまだ注釈なしで実行されていますが、それらを使用することは良い習慣だと思います。実行するテストのサイズを指定できます。Androidでの@ SmallTest、@ MediumTest、および@LargeTestアノテーションの目的は何ですか?を参照してください詳細については。

  2. はい、「テスト」接頭辞が必要です。InteliJは、「テスト」接頭辞がない場合に「メソッドが使用されなかった」という警告を表示し、テスト実行中にそのメソッドをスキップします。

  3. はい。テストをサブパッケージに編成しましたが、うまく機能しているようです。


5
あなたがActivityTestRuleを使用する場合、これは必要ありません
Yair Kukielka

デフォルトのコンストラクタを追加することでうまくいきました。
DraganMarjanović18年

54

これが「突然」または「5分前に機能していた」場合、私の解決策は実行/デバッグ構成に移動し、「Androidテスト」で構成を削除することでした。テスト中のクラスをリファクタリングすると(たとえば、新しいパッケージに移動することにより)、これらの構成が破損することがあります。

ここに画像の説明を入力してください


これでうまくいきました。空のテストスイートエラーが発生しました。構成が最初に作成された後にPowerMockitoを追加したことが原因である可能性があります。
Ajith Memana

以前、ビルド構成が適切に機能するテストを実行すると、この問題や他の問題が頻繁に発生します。私はこのアプローチをとることによってそれらを修正することができました。
stevehs17 2016年

3
構成を削除した後、プロジェクトエクスプローラー(Androidビュー)でテストパッケージを右クリックして選択しますCreate 'Tests in XXX...-再び機能しました
TmTron

9

上記のどれも私のためにそれを修正しませんでした。助けになったのは、指示従うことでした:

テスト構成を作成する

Android Studioの場合:

  • 実行メニューを開く-> 設定の編集
  • 新しいAndroidテスト 構成を追加する
  • モジュールを選択
  • 特定のインストルメンテーションランナーを追加します。

  android.support.test.runner.AndroidJUnitRunner

新しく作成した構成を実行します。


6

同様の問題がありました。これが発生している理由はわかりませんが、Android Studioの[ファイル]> [キャッシュの無効化/再起動]に移動することで修正できました。


これにより、テストクラスの名前をリファクタリングした後、OPと同じエラーが発生したときに修正されました。
マルコ

4

それがAndroid Studioに役立つかどうかはわかりませんが、何らかのIntellij-Gradle競合がありました。テストファイルを「右クリック」して解決し、「コンパイルファイル... Test.java」を押します。その後、もう一度単一のテストを実行できます。


2
* Test.javaのこの「コンパイルファイル」はどこにありますか?Android Studioのバージョンは何ですか?
Mark Lapasa、2016

上で言ったように、Android Studioは使用しません。Intellij 15を使用しています。 右クリックドロップダウンの画像<-ここに画像を貼り付けました。
kotlinski 2016年

4

Android Studio 2.3.1でも同じ問題が発生しましたが、それはASのバグにすぎませんでした。バージョン2.2.1で同じテストを実行すると正常に動作します。

CannaryチャネルでAndroid Studioのみを実行している場合は、安定版もインストールすることをお勧めします。http://tools.android.com/tips/using-multiple-android-studio-versions


私にとっても同じですが、stable 3.1.2は機能しますが、3.2 canary 15は機能しません。
arekolek

3

私はgradleAndroid Studioがアップグレードされるまで問題なく動作するテストを行いました。

テストにデフォルトのコンストラクターを追加することとは別に、テストスイートを機能させるために、次のことを行う必要がある場合があります。

以下の下でsrc/作成しますandroidTest/java/<your-package-name>/test。に注意してくださいandroidTest。を含む他のものinstrumentTestは機能しません。

これを追加 build.gradle

sourceSets {
    testLocal {
        java.srcDir file('src/androidTest/java')
        resources.srcDir file('src/androidTest/resources')
    }
}



android{
    sourceSets {
       instrumentTest.setRoot('src/androidTest/')
    }
}

dependencies{
     testLocalCompile 'junit:junit:4.11'
}

task localTest(type: Test, dependsOn: assemble) {
    testClassesDir = sourceSets.testLocal.output.classesDir

    android.sourceSets.main.java.srcDirs.each { dir ->
        def buildDir = dir.getAbsolutePath().split('/')
        buildDir = (buildDir[0..(buildDir.length - 4)] + ['build', 'classes', 'debug']).join('/')

        sourceSets.testLocal.compileClasspath += files(buildDir)
        sourceSets.testLocal.runtimeClasspath += files(buildDir)
    }

    classpath = sourceSets.testLocal.runtimeClasspath
}

check.dependsOn localTest

これを AndroidManifest.xml

 <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:label="Tests for my packaged app"
        android:targetPackage="<my-package-name>.test" />

3

Intellij 15の場合、私はこの問題を次の方法で解決しました。

  1. 「プロジェクト構造」設定を開く
  2. 「モジュール」(左側)をクリックする
  3. 「ソース」タブ
    a。ソースディレクトリ(通常はsrc)を右クリックし、[ソース]をクリックします。
    b。テストディレクトリを右クリックし、[テスト]をクリックします
    。アウトディレクトリを右クリックし、[除外]をクリックします。
  4. [パス]タブに移動します
    「Use module compile output path」ラジオボタンをクリックします
    b。「出力パス」の出力パスディレクトリを選択します
    。「テスト出力パス」のテストパスディレクトリを選択します
  5. OKをクリック

3

明らかに、テストを実行するためには、インストゥルメント化されたテストであるため、ターゲットデバイスが必要です。いくつかの理由により、Android Studio はこのターゲットデバイスをポイントするように要求せず、「Empty Test Suite」メッセージを表示するだけです。これを修正するにはいくつかの方法があります。ここにいくつかあります:

  • メインアプリを実行し、ターゲットデバイスを選択するか、

  • 実行(実行/実行... /構成の編集)構成に移動し、展開ターゲットオプションを変更します。


彼らがあなたの解決策を試した場合に誰かを助けるためだけに。私の場合、最初にデバイス/エミュレーターで実際のアプリを実行する必要があり、その後、AndroidTestはテストを実行するデバイスを確認できました。その後、すべてが機能しました。答えにプラスワン。
A_P 2017年

2

私の場合、これまでの答えはどれもうまくいきませんでした。解決策は、単にテストクラスを別のパッケージに移動することでした。

これは下で起こった androidTest/


2

私の場合、コードの間違いが原因で問題が発生しましたが、実際にはアプリケーションクラスにあるため、ターゲットアクティビティが開かれず、テスト出力が印刷されませんでした

空のテストスイートエラー

端末から直接テストを実行してみましたadb shell am instrument -w -r -e package your.package -e debug false android.support.test.runner.AndroidJUnitRunner。これにより、例外の詳細が表示されます。


2

私のbuild.gradleにこれがあるため、この問題がありました。

testOptions {
    execution "ANDROID_TEST_ORCHESTRATOR"
}

私はAndroid Test Orchestratorを使用していませんでした(チュートリアルから誤ってコピーしたはずです)。

コメントアウトすることで解決しました。


1

他の解決策はどれもうまくいきませんでしたが、既存のアプリまたはテストスイートをアンインストールしてからテストを実行するだけで、これを機能させることができました。


それは私を助けました。テストを実行する前にデータベースレベルで変更を加えたため、インストルメント化されたテストのクラスは機能しませんでした。Android Studioがこのような無関係なメッセージを表示するのは奇妙です。
PetroCliff 2017

1

私の場合、私が取り組んでいたプロジェクトにはいくつかのモジュールがありました。このエラーに対して見つけた解決策のどれも私を助けませんでした、そしてそれから私がbuild.gradleファイルの両方にテストの依存関係を追加すると、テストが魔法のように機能し始めることに気付きました。テストがモジュールの1つだけに存在するかどうかは関係ありません。両方のGradleファイルに依存関係とtestInstrumentationRunner値を含める必要があります。

したがって、私のように、他のどの回答も役に立たなかった場合は、各モジュールのbuild.gradleファイルに次の行を追加してみてください。

android {    
    ....
    defaultConfig {
        ...
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }  
}

そしてさらに追加:

dependencies {
    ...
    // Test
    androidTestCompile 'com.android.support:support-annotations:23.4.0'
    androidTestCompile 'com.android.support.test:runner:0.5'
    androidTestCompile 'com.android.support.test:rules:0.5'

}

1

ファイルの名前を変更し、問題を修正しました。


1

同じ問題があり、その理由は私のテストクラスのクラス名の最後にTestがなかったためです。


1

私の問題は、例外がスローされたことが原因でした @BeforeClass、テストケースのメソッドででした。なんらかの理由でテストが失敗することはありませんでした。logcatの出力を調べただけで見つかりました。

例外を修正したところ、突然テストが実行されました!


わたしも。BeforeClassの例外が実行パネルに適切に表示されないようです
David Refaeli

1

今日の問題に直面した後-空のスイートエラーでインストルメント化されたAndroidテストを実行できない-この問題に関するgitの問題を発見し、Stephan Linznerのおかげでテストを実行できました。

tl; dr テストを実行するには、クラスではなくテストパッケージを右クリックする必要があります。

リファレンス:https : //github.com/googlecodelabs/android-testing/issues/27#issuecomment-219074863


0

この記事が役に立ちました:空のテストスイート

基本的に、私は自分のsrcディレクトリの下にパッケージ(instrumentTest / java)を作成し、そこにすべてのテストを配置する必要がありました。その後、これらのテストを個別に実行できます。


0

これが発生している未加工のJavaプロジェクトがありました。単にJava + JUnit4。それは間違いなくあなたの.idea /または.imlファイルの中に存在します。私は私を廃棄し、再輸入し、最終的にテストが再び実行されました。


0

テストクラスはコンパイルから除外される場合があります。setting-compiler-excludeで修正してください。


0

Android Studioが突然テストの実行/デバッグを停止することを決定したときに私が実行するデバッグ手順は次のとおりです(そして、少年はこれが恥ずかしいほど頻繁に発生します!!):

  • ビルド:→プロジェクトを再ビルド
  • デバイスの再起動:デバイス/エミュレーターを再起動して、再試行します
  • デバイスの切り替え:通常の電話とエミュレーターの両方を取り外し、どちらかを取り外して、デバイスの1つだけで実行してみます。
  • Android Studio:ファイル->キャッシュを無効にして再起動
  • アクティビティモニター/タスクマネージャー:プロセスを名前で並べ替え、大量のRAMを使用している名前のないプロセスがあるかどうかを確認します。これは、強制終了する必要があるAndroidスタジオの「ゴースト」プロセスです
  • git revert:最新のコードを隠して/元に戻してみてください。Android Studio / gradleが見逃すコンパイルエラーが時々あり、コンパイルできないコードを実行しようとします。
  • Android Studioをアンインストールしてから再インストールします。

私はそれらに遭遇したときにさらに修正を追加します!


0

私は何もせず、問題が半日の痛みの後に消え、私は何度もプロジェクトを開いたり閉じたりし、各クラスのテストを手動で実行しました。


0

Spockフレームワークを備えたAndroidスタジオで、gradleのバージョンを2.2.2から3.2.1に変更しましたが、すべてうまくいきます。


0

受け入れられた答えは私の問題を解決しませんでした。したがってExampleInstrumentedTest、Android Studioでデフォルトで作成され、問題なく実行されるコピーを決定し、コピープロセス中に名前を変更し(リファクタリング->コピー後に名前を変更しない!)、ユニットテストの内容をそれに貼り付けました。その後、エラーは消えました。


0

Android Studio 3.0プロジェクトでローカルユニットテストを実行しようとすると、「空のテストスイート」エラーが発生しました。

Android Developerのドキュメントを読んだ後、すぐに問題が次の行を含むgradle設定に起因していることに気付きました。

testImplementation 'com.android.support.test:runner:0.5'
testImplementation 'com.android.support.test:rules:0.5'

AndroidJUnitRunnerクラスは、Androidデバイスで JUnit 3またはJUnit 4スタイルのテストクラスを実行できるJUnitテストランナーです

私のテストはローカルであり、どのデバイスでも実行する必要がないため、上記のcom.android.support.test ...エントリを削除すると、ユニットテストを実行できるようになりました。


0

@BeforeClassメソッドでdbにいくつかの挿入を行っていました。オブジェクト/データベースのマッピングに問題があることに気付きました。このデータマッピングの問題がこの問題の原因でした。


0

私の場合、インストゥルメンテーションテストをで行いましたandroidTest/java/<package.name>/MyTestingClassが、現在のビルドバリアントを「本番前」に設定していました。そしてポイントがあります!Android Studioのドキュメントで指定されているとおり:

デフォルトでは、すべてのテストはデバッグビルドタイプに対して実行されます。

このメッセージClass not found. Empty test suite.は、私がこれを行うまで表示され続けました。

  1. 次の行をbuild.gradleに追加します。

    android{
        [...]
        testBuildType "preproduction"
    }
  2. 同期グラドル。
  3. このGradleの同期が考慮されていないため、以前のテスト構成を削除します。

次に、テストを再度実行しましたが、今回は完璧に実行されます!!!


0

非モッククラス変数にアノテーションを誤ってマークしたときに、これが発生しました。アノテーションが@Mock 削除され、テストが正常に実行されました。これはAndroid StudioのJunit 4.5で起こりました


0

解決策ではありませんが、すぐに軌道に戻すための回避策:

  1. まず、機能するテストを見つけます。「空のテストスイート」エラーが発生する新しいテストを作成していました。私は他のテストを実行し、彼らはいつものように働いていました。

  2. 機能するテストファイルをコピーします。それを実行して、このコピーが元のように機能することを確認します。

  3. 本文を削除し、新しいテストコードに置き換えます。

これでテストが機能するはずです。

私たちは原因を見つけるために約2時間を費やしましたが、役に立ちませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.