【问题标题】:Why is the Android test runner reporting "Empty test suite"?为什么 Android 测试运行程序报告“空测试套件”?
【发布时间】:2013-01-01 03:30:47
【问题描述】:

我在这里撞墙,试图弄清楚为什么 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);
    }
}

我已阅读testing fundamentalsactivity testing document,并尝试遵循此Hello world test blog,即使它是针对 Eclipse 的。我无法让测试运行器找到并运行我的测试。我做错了什么?

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

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

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

【问题讨论】:

  • 对于第 3 点,如果您使用的是 Android Studio,我推荐使用 cmd+shift+t 快捷方式,它将在与您当前正在编辑的类匹配的正确包位置自动创建一个测试类。
  • 以防万一其他人像我一样缺席。确保您没有忘记将 @Test 标记放在测试顶部。

标签: android intellij-idea


【解决方案1】:

您需要为您的测试类提供默认构造函数,例如:

package nilzor.myapp.tests;

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

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

关于您的其他问题:

  1. 没有。我的测试仍然在没有任何注释的情况下运行,但我想拥有它们是一个好习惯。它允许您指定要运行的测试的大小。详情请参阅What is the purpose of @SmallTest, @MediumTest, and @LargeTest annotations in Android?

  2. 是的,您需要“测试”前缀。 InteliJ 在没有“test”前缀时给出“method never used”警告,并在测试运行期间跳过该方法。

  3. 是的。我将我的测试组织成子包,它似乎运行良好。

【讨论】:

  • 如果你使用 ActivityTestRule 则不需要
  • 添加默认构造函数为我完成了这项工作。
【解决方案2】:

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

【讨论】:

  • 这对我有用。我收到空测试套件错误。可能是因为我在最初创建配置后添加了 PowerMockito。
  • 我经常在运行测试时遇到这个问题和其他问题,而之前构建配置可以正常工作。我已经能够通过采用这种方法来修复它们。
  • 删除配置后,我在项目资源管理器(Android 视图)中右键单击一个测试包并选择Create 'Tests in XXX... - 然后它再次工作
【解决方案3】:

以上都没有为我解决这个问题。有帮助的是following the instructions

创建测试配置

在 Android Studio 中:

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

 android.support.test.runner.AndroidJUnitRunner

运行新创建的配置。

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 当我在重构我的测试类名称后遇到与 OP 相同的错误时,这为我修复了它。
    【解决方案5】:

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

    【讨论】:

    • *Test.java 上的“编译文件”在哪里?什么版本的 Android Studio?
    • 正如我上面所说的,我不使用 Android Studio。我正在使用 Intellij 15 proffesional。 image of right-click-dropdown
    【解决方案6】:

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

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

    【讨论】:

    • 对我来说也一样,稳定的 3.1.2 可以工作,3.2 canary 15 不行。
    【解决方案7】:

    gradle 和 android studio 升级之前,我的测试运行良好。

    除了向您的测试添加默认构造函数之外,您可能还需要执行其中一些操作才能让您的测试套件正常工作

    src/ 下创建 androidTest/java/&lt;your-package-name&gt;/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" />
    

    【讨论】:

      【解决方案8】:

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

      1. 打开“项目结构”设置
      2. 点击“模块”(左侧)
      3. “来源”选项卡
        一种。右键单击您的源目录(通常是 src)单击“源”。
        湾。右键单击您的测试目录单击“测试”
        C。右键单击您的输出目录单击“已排除”
      4. 转到“路径”选项卡
        一种。 点击“使用模块编译输出路径”单选按钮
        湾。为“输出路径”选择您的输出路径目录
        C。选择 “测试输出路径”的测试路径目录
      5. 点击确定

      【讨论】:

        【解决方案9】:

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

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

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

        【讨论】:

        • 只是为了帮助某人,如果他们尝试您的解决方案。就我而言,我必须首先在设备/模拟器上运行实际应用程序,然后我的 AndroidTest 才能看到要在其上运行测试的设备。之后一切正常。给出答案加一。
        【解决方案10】:

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

        testOptions {
            execution "ANDROID_TEST_ORCHESTRATOR"
        }
        

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

        评论出来解决了我的问题。

        【讨论】:

          【解决方案11】:

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

          这发生在androidTest/

          【讨论】:

            【解决方案12】:

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

            空测试套件错误

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

            【讨论】:

              【解决方案13】:

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

              【讨论】:

              • 这对我有帮助。我在运行测试之前对数据库级别进行了更改,因此插桩测试下的类无法工作。 Android Studio 显示这样一条不相关的消息很奇怪。
              【解决方案14】:

              就我而言,我正在从事的项目有几个模块。我为这个错误找到的解决方案都没有帮助我,然后不知何故,我意识到如果我在 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'
              
              }
              

              【讨论】:

                【解决方案15】:

                我刚刚重命名了文件并修复了问题。

                【讨论】:

                  【解决方案16】:

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

                  【讨论】:

                    【解决方案17】:

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

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

                    【讨论】:

                    • 对我来说也一样。似乎 BeforeClass 中的异常没有正确显示在运行面板中
                    【解决方案18】:

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

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

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

                    【讨论】:

                      【解决方案19】:

                      这篇文章帮助了我:Empty test suite

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

                      【讨论】:

                        【解决方案20】:

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

                        【讨论】:

                          【解决方案21】:

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

                          【讨论】:

                            【解决方案22】:

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

                            • 构建:→ 重建项目
                            • 重启设备:重启您的设备/模拟器,然后重试
                            • 设备切换:如果您同时拥有一部普通手机和一个模拟器,请拔下其中一部并尝试仅使用其中一种设备运行它
                            • Android Studio:文件-->使缓存无效并重新启动
                            • 活动监视器/任务管理器:按名称排序进程,查看是否有无名进程占用大量内存,这是 Android 工作室的“幽灵”进程,必须杀死
                            • git revert:尝试存储/恢复您的最新代码。有时Android Studio / gradle会错过编译错误,它会尝试运行无法编译的代码。
                            • 卸载然后重新安装 Android Studio。

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

                            【讨论】:

                              【解决方案23】:

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

                              【讨论】:

                                【解决方案24】:

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

                                【讨论】:

                                  【解决方案25】:

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

                                  【讨论】:

                                    【解决方案26】:

                                    尝试在我的 Android Studio 3.0 项目中运行本地单元测试时,我遇到了“空测试套件”错误。

                                    在阅读了 Android 开发者documentation 之后,我很快意识到问题是由我的 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... 条目使我能够执行单元测试。

                                    【讨论】:

                                      【解决方案27】:

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

                                      【讨论】:

                                        【解决方案28】:

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

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

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

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

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

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

                                        【讨论】:

                                          【解决方案29】:

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

                                          【讨论】:

                                            【解决方案30】:

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

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

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

                                            3. 删除正文并将其替换为新的测试代码。

                                            现在应该可以进行测试了。

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

                                            【讨论】:

                                              猜你喜欢
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 2016-12-07
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 2014-05-31
                                              相关资源
                                              最近更新 更多