98

我在这里撞墙,试图弄清楚为什么 IntelliJ/Android 报告“空测试套件”。我有一个带有两个 IntelliJ 模块的小项目(Eclipse 中的“项目”)。单元测试模块有自己的AndroidManifest.xml,我已经粘贴在底部了。我正在尝试运行ActivityUnitTestCase,因为测试将取决于Context-object。

主模块的包名是nilzor.myapp. 测试模块的包名是nilzor.myapp.tests

为什么测试运行器不检测testBlah()- 方法作为测试?

<?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);
    }
}

我已经阅读了测试基础知识活动测试文档,并尝试关注这个Hello world 测试博客,即使它是针对 Eclipse 的。我无法让测试运行器找到并运行我的测试。我究竟做错了什么?

我仍然不确定的一些问题是:

  1. 我需要在单元测试方法上方添加注释吗?
  2. 我是否需要在该方法前面加上“test”,还是仅用于 JUnit 测试?
  3. 我可以在 的子包中进行测试nilzor.myapp.tests吗?

但是这篇文章的主要问题是为什么测试运行者没有检测到我的测试

4

31 回答 31

70

You need to provide default constructor for your test class, for example:

package nilzor.myapp.tests;

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

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

about your other questions:

  1. No. My tests still run without any annotations, but I guess it's a good practice to have them. It allows you to specify size of tests to run. See What is the purpose of @SmallTest, @MediumTest, and @LargeTest annotations in Android? for more detail.

  2. Yes, you need "test" prefix. InteliJ gives "method never used" warning when there's no "test" prefix, and skips that method during test run.

  3. Yes. I have my tests organized into subpackages and it seems to be working well.

于 2013-01-20T12:42:21.317 回答
54

如果这种情况“突然”发生或“5 分钟前还在工作”,我的解决方案是进入运行/调试配置并删除“Android 测试”下的所有配置。有时,如果我重构被测类(例如通过移动到新包),这些配置会损坏。

在此处输入图像描述

于 2016-07-04T18:00:04.943 回答
9

以上都没有为我解决。有什么帮助是按照说明进行操作

创建测试配置

在 Android Studio 中:

  • 打开运行菜单->编辑配置
  • 添加新的Android 测试 配置
  • 选择一个模块
  • 添加特定的仪表运行器:

  android.support.test.runner.AndroidJUnitRunner

运行新创建的配置。

于 2016-08-09T18:55:51.273 回答
7

我有一个类似的问题。不知道为什么会发生这种情况,但我能够通过转到 Android Studio 中的“文件”>“无效缓存/重新启动”来修复它。

于 2016-09-19T16:54:08.447 回答
4

我在 Android Studio 2.3.1 上遇到了同样的问题,原来这只是 AS 的一个错误。在 2.2.1 版本上运行相同的测试效果很好。

如果你只在 Cannary 频道上运行 Android Studio,我建议你也安装一个稳定版本。http://tools.android.com/tips/using-multiple-android-studio-versions

于 2017-01-08T01:32:20.147 回答
4

我不知道它是否对 Android Studio 有帮助,但我遇到了某种 Intellij-Gradle 冲突。通过“右键单击”测试文件并点击“编译文件 ...Test.java”来解决它。之后我可以再次运行单个测试。

于 2016-02-14T12:53:10.313 回答
3

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" />
于 2014-05-23T12:49:34.793 回答
3

对于 Intellij 15,我通过以下方式解决了这个问题:

  1. 打开“项目结构”设置
  2. 单击“模块”(左侧)
  3. “来源”选项卡
    a. 右键单击您的源目录(通常是 src)单击“源”。
    湾。右键单击您的测试目录,单击“测试”
    c。右键单击您的输出目录单击“排除”
  4. 转到“路径”选项
    单击“使用模块编译输出路径”单选按钮
    b。为“输出路径”选择输出路径目录
    c。为“测试输出路径”选择您的测试路径目录
  5. 点击确定
于 2016-01-17T20:23:00.467 回答
3

我遇到了这个问题,因为我的 build.gradle 中有这个:

testOptions {
    execution "ANDROID_TEST_ORCHESTRATOR"
}

即使我没有使用 Android Test Orchestrator(一定是错误地从教程中复制的)。

评论出来为我解决了这个问题。

于 2017-12-11T21:12:21.107 回答
3

显然,您需要一个目标设备来运行您的测试,因为它们是仪器化测试。由于某些原因,Android Studio有时不会要求您指向此目标设备,而只是提示“Empty Test Suite”消息。有不同的方法来解决这个问题,这里有一些:

  • 运行您的主应用程序并选择目标设备或

  • 转到运行(运行/运行.../编辑配置)配置并修改部署目标选项

于 2017-04-19T08:22:02.713 回答
2

就我而言,以前的答案都没有奏效。解决方案是简单地将测试类移动到另一个包中。

这发生在androidTest/

于 2016-12-24T19:03:47.913 回答
2

在我的情况下,问题是由于我的代码中的错误引起的,实际上是在应用程序类中,所以没有打开目标活动并且测试输出打印

空测试套件错误

我试过直接从终端运行测试adb shell am instrument -w -r -e package your.package -e debug false android.support.test.runner.AndroidJUnitRunner。有了它,它会为您打印更多关于异常的信息。

于 2017-06-14T11:25:11.340 回答
1

@BeforeClass我的问题是由我的测试用例的方法中引发的异常引起的。它是如何导致测试失败的——我只是通过检查 logcat 输出才发现它。

我修复了异常,突然我的测试开始运行了!

于 2018-02-01T01:49:49.420 回答
1

我有同样的问题,原因是我的测试类在类名末尾没有 Test !

于 2017-11-15T22:59:32.913 回答
1

今天遇到问题后 - 无法运行带有空套件错误的仪器化 android 测试 - 我发现了一个关于这个问题的 git 问题,感谢 Stephan Linzner,我可以运行测试。

tl; dr您必须右键单击测试包而不是类才能使测试运行。

参考:https ://github.com/googlecodelabs/android-testing/issues/27#issuecomment-219074863

于 2018-02-07T20:51:31.297 回答
1

就我而言,我正在从事的项目有几个模块。我为这个错误找到的解决方案都没有帮助我,然后不知何故,我意识到如果我在 build.gradle 文件的两个文件中都添加了测试依赖项,测试就会神奇地开始工作。如果您的测试只存在于其中一个模块中,这并不重要,两个 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'

}
于 2016-08-03T04:56:58.707 回答
1

我只是重命名了文件并解决了问题。

于 2017-04-01T01:47:55.853 回答
1

其他解决方案都不适合我,但我只需卸载现有的应用程序或测试套件,然后运行测试就可以让它工作。

于 2016-02-10T17:26:48.980 回答
0

这篇文章帮助了我:空测试套件

基本上我必须在我的 src 目录下创建一个包——instrumentTest/java,并将所有测试放在那里。然后我可以单独执行这些测试。

于 2014-04-09T17:23:54.333 回答
0

当我错误地将注释标记为非模拟类变量时,我发生了这种情况@Mock 删除注释并且测试成功运行。这发生在 Android Studio 上的 Junit 4.5

于 2018-07-24T02:16:28.843 回答
0

以下是我在 Android Studio 突然决定停止运行/调试测试时所经历的调试步骤(男孩这种情况经常令人尴尬地发生!):

  • 构建:→ 重建项目
  • 重新启动设备:重新启动您的设备/模拟器,然后重试
  • 设备切换:如果您同时拥有普通手机和模拟器,请拔下其中一个并尝试仅使用其中一个设备运行它
  • Android Studio: File--> Invalidate caches and restart
  • 活动监视器/任务管理器:按名称对进程进行排序,看看是否有一个无名进程正在消耗大量内存,这是一个来自 Android 工作室的“幽灵”进程,必须被杀死
  • git revert:尝试存储/恢复您的最新代码。有时会出现 Android Studio / gradle 遗漏的编译错误,它只会尝试运行不可编译的代码。
  • 卸载然后重新安装 Android Studio。

当我遇到它们时,我会添加更多修复!

于 2016-09-24T05:04:58.147 回答
0

我有以下代码块

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

因为我需要根据不同的测试用例在活动意图中传递不同的参数。当我删除@get:Rule测试开始再次工作。

于 2019-04-11T09:05:50.850 回答
0

测试类可能会从编译中排除。在设置-编译器-排除中修复它。

于 2016-06-29T06:19:47.703 回答
0

不是解决方案,而是一种解决方法,可以让您快速回到正轨:

  1. 首先,找到一个有效的测试。我正在编写一个新测试,其中出现“空测试套件”错误。我进行了其他测试,它们照常工作。

  2. 复制有效的测试文件。运行它以确保此副本与原始副本一样工作。

  3. 删除正文并用新的测试代码替换它。

测试现在应该可以工作了。

我们花了大约两个小时试图找到原因,但无济于事。

于 2018-11-07T19:21:36.617 回答
0

我什么也没做,经过半天的痛苦之后问题就消失了,我多次打开和关闭项目,手动运行每个班级测试,也许这解决了我的问题。

于 2016-10-20T08:12:47.277 回答
0

就我而言,我在 中进行了仪器测试androidTest/java/<package.name>/MyTestingClass,但我已将当前的构建变体设置为“预生产”。这就是重点!如Android Studio 文档中所述:

默认情况下,所有测试都针对调试构建类型运行。

该消息Class not found. Empty test suite.一直出现,直到我这样做:

  1. 将此行添加到我的build.gradle

    android{
        [...]
        testBuildType "preproduction"
    }
    
  2. 同步梯度。
  3. 删除我之前的测试配置,因为他们没有考虑到这个 Gradle 同步。

然后我再次执行了测试,这次它们运行得非常完美!!!

于 2016-11-24T17:55:59.140 回答
0

接受的答案并没有解决我的问题。所以我决定复制ExampleInstrumentedTest默认在Android Studio中创建并运行没有任何问题,在复制过程中重命名它(复制后没有Refactor->Rename!)并将我的单元测试的内容粘贴到其中。之后错误消失了。

于 2017-07-18T14:37:14.120 回答
0

在带有 spock 框架的 Android 工作室中,我将 gradle 的版本从 2.2.2 更改为 3.2.1,一切顺利。

于 2016-12-09T08:43:28.923 回答
0

我有一个发生这种情况的原始 Java 项目。只需 Java + JUnit4。它肯定存在于您的 .idea/ 或 .iml 文件中。我报废了我的,重新导入,最后测试再次运行。

于 2016-04-20T05:12:11.633 回答
0

我在 @BeforeClass 方法中的数据库中做了一些插入。我意识到我遇到了对象/数据库映射问题。这个数据映射问题是我这个问题的原因。

于 2017-12-07T16:18:07.107 回答
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 类是一个 JUnit 测试运行器,可让您在Android 设备上运行 JUnit 3 或 JUnit 4 样式的测试类。

由于我的测试是本地的,因此不需要在任何设备上运行,删除上面的 com.android.support.test... 条目使我能够执行单元测试。

于 2017-11-03T11:00:13.810 回答