为什么Android测试运行程序报告“空测试套件”?


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吗?

但是这篇文章的主要问题是为什么跑步者不能检测到我的考试


对于第3点,如果您使用的是Android Studio,我建议您使用cmd+shift+t快捷方式,该快捷方式将在与您当前正在编辑的类相匹配的正确包位置中自动创建测试类。
David Argyle Thacker

以防万一其他人像我一样缺席。确保您不要忘记将@Test标记放在测试之上。
Matt D

Answers:


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. 是的,您需要“测试”前缀。当没有“ test”前缀时,InteliJ会发出“永不使用方法”警告,并在测试运行期间跳过该方法。

  3. 是。我已将测试组织到子程序包中,并且似乎运行良好。


5
如果您使用ActivityTestRule
Yair Kukielka '16

添加默认构造函数为我完成了工作。
DraganMarjanović18年

54

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

在此处输入图片说明


这对我有用。我收到Empty测试套件错误。可能是因为最初创建配置后添加了PowerMockito。
Ajith Memana

在运行测试时,我经常遇到这样的问题以及其他问题,这些测试使构建配置可以更早地正常工作。通过采用这种方法,我已经能够修复它们。
stevehs17年

3
删除配置后,我在项目浏览器中右键单击一个测试包(Android视图),Create 'Tests in XXX...然后选择-然后再次
起作用

9

以上都不适合我。遵循说明的是有帮助

创建测试配置

在Android Studio中:

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

  android.support.test.runner.AndroidJUnitRunner

运行新创建的配置。


6

我有一个类似的问题。不知道为什么会这样,但是我能够通过以下方法来解决它:Android Studio中的“文件”>“使缓存无效/重新启动”。


重构测试类的名称后,当我遇到与OP相同的错误时,这为我修复了该错误。
Marco Marco

4

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


2
* Test.java上的“编译文件”在哪里?什么版本的Android Studio?
Mark Lapasa

正如我上面所说的,我没有使用Android Studio。我正在使用Intellij 15专业版。 右键单击下拉图像<-我在此处粘贴了图像。
kotlinski '16


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. 转到“路径”标签
    单击“使用模块编译输出路径”单选按钮
    b。为“输出路径”选择输出路径目录
    。为“测试输出路径”选择测试路径目录
  5. 点击确定

3

显然,您需要一个目标设备来运行测试,因为它们是仪器化测试。由于某些原因,Android Studio 有时不要求您指向此目标设备,而只是提示“空测试套件”消息。有多种解决方法,以下是一些解决方法:

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

  • 转到“运行”(运行/运行... /编辑配置)配置,然后修改“ 部署目标”选项


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


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

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'

}

1

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


1

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


1

我的问题是由于在 @BeforeClass测试用例方法中。它不是导致测试失败的某种方式-我只是通过检查logcat输出来发现它的。

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


我也是。似乎在运行面板中未正确显示BeforeClass中的异常
David Refaeli



0

我发生了一个原始的Java项目。只需Java + JUnit4。它肯定与您的.idea /或.iml文件中的内容一起驻留。我报废了我的,重新进口了,最后再次进行了测试。


0

测试类可以从编译中排除。在setting-compiler-exclude中修复它。


0

这是我的调试步骤,当Android Studio突然决定停止运行/调试测试时,我要通过这些调试步骤(而男孩经常会尴尬地发生这种情况!):

  • 构建:→重建项目
  • 重新启动设备:重新启动设备/仿真器,然后重试
  • 设备开关:如果您同时拥有普通电话和仿真器,请拔下电话,然后尝试仅使用其中一台设备运行它
  • Android Studio:文件->使缓存无效并重新启动
  • 活动监视器/任务管理器:按名称对进程进行排序,看看是否有一个无名进程正在消耗大量内存,这是Android Studio中的“鬼”进程,必须将其杀死
  • git revert:尝试隐藏/还原您的最新代码。有时会有Android Studio / gradle遗漏的编译错误,它只会尝试运行无法编译的代码。
  • 卸载然后重新安装Android Studio。

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


0

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


0

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


0

接受的答案不能解决我的问题。因此,我决定要复制ExampleInstrumentedTest默认情况下在Android Studio中创建并可以正常运行的文件,并在复制过程中将其重命名(复制后不进行Refactor-> Rename!),然后将单元测试的内容粘贴到其中。之后,错误消失了。


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 ...条目使我能够执行单元测试。


0

我正在@BeforeClass方法中在数据库中进行一些插入。我意识到我有一个对象/数据库映射问题。这个数据映射问题是导致我出现此问题的原因。


0

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

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

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

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

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

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


0

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


0

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

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

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

  3. 拆下阀体,并用新的测试代码替换它。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.