web-dev-qa-db-ja.com

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

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

メインモジュールのパッケージ名は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 test blog に従って試しました。テストランナーにテストを見つけて実行させることができません。私は何が間違っていますか?

私がまだ自信がないと思う質問のいくつかは次のとおりです。

  1. ユニットテストメソッドの上に注釈が必要ですか?
  2. メソッドの前に「test」を付ける必要がありますか、それともJUnitテスト専用ですか?
  3. nilzor.myapp.testsのサブパッケージにテストを含めることはできますか?

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

98
Nilzor

たとえば、テストクラスのデフォルトコンストラクターを提供する必要があります。

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は、「test」プレフィックスがない場合に「method never used」警告を出し、テスト実行中にそのメソッドをスキップします。

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

70
lmac

これが「突然」または「5分前に動作していた」場合、私のソリューションは実行/デバッグ構成に進み、「Androidテスト」の下にある構成をすべて削除することでした。テスト対象のクラスをリファクタリングすると(たとえば、新しいパッケージに移動するなど)、これらの構成が破損することがあります。

enter image description here

54
tir38

上記のどれも私のためにそれを修正しませんでした。助けたのは 指示に従って

テスト構成を作成する

Android St​​udioで:

  • 開く実行メニュー->構成の編集
  • 新しいAndroidテスト構成を追加します
  • モジュールを選択してください
  • 特定のインスツルメンテーションランナーを追加します。
  Android.support.test.runner.AndroidJUnitRunner

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

9
serv-inc

同様の問題がありました。なぜこれが起こっているのかはわかりませんが、Android St​​udioの[ファイル]> [キャッシュの無効化/再起動]に移動して修正できました。

5
Jeff Stapleton

Android St​​udio 2.3.1でも同じ問題がありましたが、それはASの単なるバグでした。バージョン2.2.1で同じテストを実行すると、問題なく実行されます。

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

Android St​​udioに役立つかどうかはわかりませんが、何らかのIntellij-Gradleの競合がありました。テストファイルを「右クリック」して解決し、「compile file ... Test.Java」を押して解決しました。その後、単一のテストを再度実行できました。

4
kotlinski

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

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

明らかに、テストがインスツルメントされたテストであるため、テストを実行するにはtarget deviceが必要です。何らかの理由で、Android studio このターゲットデバイスを指すように求められない場合がありますで、「Empty Test Suite」メッセージを要求するだけです。これを修正するさまざまな方法がありますが、ここにいくつかあります:

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

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

3
user2243632

gradleおよびAndroid 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

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

これはandroidTest/で発生しました

2
Mateus Gondim

Build.gradleにこれがあるため、この問題が発生しました。

testOptions {
    execution "Android_TEST_ORCHESTRATOR"
}

Android Test Orchestratorを使用していなかったとしても(誤ってチュートリアルからコピーしたに違いありません)。

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

2
Pablo

私の場合、その問題はコードの誤りが原因で発生し、実際にはアプリケーションクラスにあったため、ターゲットアクティビティが開かれず、テスト出力が出力されます

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

adb Shell am instrument -w -r -e package your.package -e debug false Android.support.test.runner.AndroidJUnitRunnerを使用して、ターミナルからテストを直接実行してみました。これにより、例外に関する詳細が表示されます。

2
Beloo

ファイルの名前を変更しただけで、問題は修正されました。

1
Lyn

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

1
Phil

私の場合、私が取り組んでいたプロジェクトにはいくつかのモジュールがありました。このエラーに対して私が見つけた解決策はどれも役に立たなかったので、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
Jorge Salas

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

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

1
shocking

私は同じ問題を抱えていました、そして、その理由は私のクラスがクラス名の最後にTestを持っていなかったからです!

1
Janin

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

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

参照: https://github.com/googlecodelabs/Android-testing/issues/27#issuecomment-21907486

1

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

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

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

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

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

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

解決策ではなく、すぐに軌道に乗せる回避策:

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

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

  3. 本体を取り外して、新しいテストコードに置き換えます。

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

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

0
xavierdominguez

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

0
Psijic

この記事は私を助けてくれました: 空のテストスイート

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

0
IgorGanapolsky

次のコードブロックがありました

@get:Rule
lateinit var activityScenario: ActivityScenario<HomeActivity>

さまざまなテストケースに基づいてアクティビティの目的でさまざまなパラメーターを渡す必要があるためです。 @get:Ruleを削除すると、テストが再び機能し始めました。

0
Vaios

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

0
Laurent

Android St​​udioが突然テストの実行/デバッグを停止することを決定したときのデバッグ手順を次に示します(そして、男の子はこれを恥ずかしく頻繁に行います!!):

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

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

0
gorbysbm

これが発生している生のJavaプロジェクトがありました。単にJava + JUnit4。 .idea /または.imlファイルに何かが含まれていることは間違いありません。私は私のものを廃棄し、再インポートし、最後にテストを再度実行しました。

0
cdaringe

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

Android Developer documentation を読んだ後、次の行を含むgradle configが問題の原因であることがすぐにわかりました。

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
Will P

私は何もせず、半日苦労して問題はなくなり、プロジェクトを何度も開いたり閉じたりして、各クラスのテストを手動で実行しました。

0
Gary Davies

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

0
okwap

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

0
ka3ak

誤って非モッククラス変数を注釈@Mockでマークしたときに、このようなことが起こりました。注釈を削除し、テストが正常に実行されました。これは、Android St​​udioのJunit 4.5で発生しました

0
Mihir