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 に従って試しました。テストランナーにテストを見つけて実行させることができません。私は何が間違っていますか?
私がまだ自信がないと思う質問のいくつかは次のとおりです。
nilzor.myapp.tests
のサブパッケージにテストを含めることはできますか?しかし、この投稿の主な質問はです。なぜテストランナーは私のテストを検出しないのですか?
たとえば、テストクラスのデフォルトコンストラクターを提供する必要があります。
package nilzor.myapp.tests;
public class NilzorSomeTest extends ActivityUnitTestCase<ActivityYouWantToTest>{
public NilzorSomeTest(){
super(ActivityYouWantToTest.class);
}
@SmallTest
public void testBlah(){
assertEquals(1,1);
}
}
他の質問について:
いいえ。私のテストはまだ注釈なしで実行されますが、それらを使用することをお勧めします。実行するテストのサイズを指定できます。 Androidの@ SmallTest、@ MediumTest、および@LargeTestアノテーションの目的は何ですか? を参照してください。
はい、「テスト」プレフィックスが必要です。 InteliJは、「test」プレフィックスがない場合に「method never used」警告を出し、テスト実行中にそのメソッドをスキップします。
はい。テストをサブパッケージに整理しましたが、うまく機能しているようです。
上記のどれも私のためにそれを修正しませんでした。助けたのは 指示に従って :
テスト構成を作成する
Android Studioで:
- 開く実行メニュー->構成の編集
- 新しいAndroidテスト構成を追加します
- モジュールを選択してください
- 特定のインスツルメンテーションランナーを追加します。
Android.support.test.runner.AndroidJUnitRunner新しく作成された構成を実行します。
同様の問題がありました。なぜこれが起こっているのかはわかりませんが、Android Studioの[ファイル]> [キャッシュの無効化/再起動]に移動して修正できました。
Android Studio 2.3.1でも同じ問題がありましたが、それはASの単なるバグでした。バージョン2.2.1で同じテストを実行すると、問題なく実行されます。
CannaryチャンネルでAndroid Studioのみを実行している場合は、安定版もインストールすることをお勧めします。 http://tools.Android.com/tips/using-multiple-Android-studio-versions
Android Studioに役立つかどうかはわかりませんが、何らかのIntellij-Gradleの競合がありました。テストファイルを「右クリック」して解決し、「compile file ... Test.Java」を押して解決しました。その後、単一のテストを再度実行できました。
Intellij 15では、次の方法でこの問題を解決しました。
明らかに、テストがインスツルメントされたテストであるため、テストを実行するにはtarget deviceが必要です。何らかの理由で、Android studio このターゲットデバイスを指すように求められない場合がありますで、「Empty Test Suite」メッセージを要求するだけです。これを修正するさまざまな方法がありますが、ここにいくつかあります:
メインアプリを実行してターゲットデバイスを選択するか、
実行(実行/実行... /構成の編集)構成に移動し、展開ターゲットオプションを変更します
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" />
私の場合、以前の答えはどれもうまくいきませんでした。解決策は、単純にテストクラスを別のパッケージに移動するでした。
これはandroidTest/
で発生しました
Build.gradleにこれがあるため、この問題が発生しました。
testOptions {
execution "Android_TEST_ORCHESTRATOR"
}
Android Test Orchestratorを使用していなかったとしても(誤ってチュートリアルからコピーしたに違いありません)。
コメントアウトすることで解決しました。
私の場合、その問題はコードの誤りが原因で発生し、実際にはアプリケーションクラスにあったため、ターゲットアクティビティが開かれず、テスト出力が出力されます
空のテストスイートエラー
adb Shell am instrument -w -r -e package your.package -e debug false Android.support.test.runner.AndroidJUnitRunner
を使用して、ターミナルからテストを直接実行してみました。これにより、例外に関する詳細が表示されます。
ファイルの名前を変更しただけで、問題は修正されました。
他のソリューションはどれもうまくいきませんでしたが、既存のアプリまたはテストスイートをアンインストールしてからテストを実行するだけで、これを機能させることができました。
私の場合、私が取り組んでいたプロジェクトにはいくつかのモジュールがありました。このエラーに対して私が見つけた解決策はどれも役に立たなかったので、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'
}
私の問題は、テストケースの@BeforeClass
メソッドで例外がスローされたことにより発生しました。テストが失敗する原因は何もありませんでした-logcatの出力を調べるだけで見つかりました。
例外を修正し、突然テストが実行されました!
私は同じ問題を抱えていました、そして、その理由は私のクラスがクラス名の最後にTestを持っていなかったからです!
今日問題に直面した後-インストルメント済みAndroidテストを空のスイートエラーで実行できない-この問題に関するgitの問題を発見し、Stephan Linznerのおかげでテストを実行できました。
tl; drテストを実行するには、クラスではなくテストパッケージを右クリックする必要があります。
参照: https://github.com/googlecodelabs/Android-testing/issues/27#issuecomment-21907486
私の場合、androidTest/Java/<package.name>/MyTestingClass
にインスツルメントされたテストがありましたが、現在のビルドバリアントを「プリプロダクション」に設定していました。そして、ポイントがあります! Android Studioドキュメント で指定されているとおり:
デフォルトでは、すべてのテストはデバッグビルドタイプに対して実行されます。
メッセージClass not found. Empty test suite.
は、これを行うまで表示され続けました。
次の行をmybuild.gradleに追加します。
Android{
[...]
testBuildType "preproduction"
}
その後、テストを再度実行しましたが、今回は完璧に実行されます!!!
解決策ではなく、すぐに軌道に乗せる回避策:
まず、動作するテストを見つけます。 「空のテストスイート」エラーが発生した新しいテストを作成していました。私は他のテストを実行しましたが、それらはいつものように機能していました。
動作するテストファイルをコピーします。それを実行して、このコピーが元のように機能することを確認します。
本体を取り外して、新しいテストコードに置き換えます。
これでテストが機能するはずです。
私たちは原因を見つけようとして約2時間を費やしましたが、役に立ちませんでした。
Androidスタジオでspockフレームワークを使用して、gradleのバージョンを2.2.2から3.2.1に変更しましたが、すべてうまくいきます。
この記事は私を助けてくれました: 空のテストスイート
基本的には、パッケージを作成する必要がありました-instrumentTest/Java-srcディレクトリの下に、すべてのテストをそこに配置します。その後、これらのテストを個別に実行できます。
次のコードブロックがありました
@get:Rule
lateinit var activityScenario: ActivityScenario<HomeActivity>
さまざまなテストケースに基づいてアクティビティの目的でさまざまなパラメーターを渡す必要があるためです。 @get:Rule
を削除すると、テストが再び機能し始めました。
@BeforeClassメソッドでdbに挿入していました。オブジェクト/データベースのマッピングに問題があることに気付きました。このデータマッピングの問題が、この問題の原因でした。
Android Studioが突然テストの実行/デバッグを停止することを決定したときのデバッグ手順を次に示します(そして、男の子はこれを恥ずかしく頻繁に行います!!):
私はそれらに遭遇したときにさらに修正を追加します!
これが発生している生のJavaプロジェクトがありました。単にJava + JUnit4。 .idea /または.imlファイルに何かが含まれていることは間違いありません。私は私のものを廃棄し、再インポートし、最後にテストを再度実行しました。
Android Studio 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 ...エントリを削除すると、単体テストを実行できました。
私は何もせず、半日苦労して問題はなくなり、プロジェクトを何度も開いたり閉じたりして、各クラスのテストを手動で実行しました。
テストクラスはコンパイルから除外される場合があります。 setting-compiler-excludeで修正してください。
受け入れられた答えは私の問題を解決しませんでした。そこで、デフォルトでAndroid Studioで作成され、問題なく実行されるExampleInstrumentedTest
をコピーすることにし、コピープロセス中に名前を変更し(コピー後のリファクタリング->名前変更なし!)、コンテンツを貼り付けましたそれに私のユニットテストの。その後、エラーは消えました。
誤って非モッククラス変数を注釈@Mock
でマークしたときに、このようなことが起こりました。注釈を削除し、テストが正常に実行されました。これは、Android StudioのJunit 4.5で発生しました