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

时间:2013-01-17 14:50:19

标签: android intellij-idea

我正在试图找出IntelliJ / Android报告“空测试套件”的原因。我有一个带有两个IntelliJ模块的小项目(Eclipse中的“Projects”)。 Unit测试模块有自己的AndroidManifest.xml,我在底部粘贴了它。我正在尝试运行ActivityUnitTestCase,因为测试将取决于Context - 对象。

主模块的包名称为nilzor.myapp。测试模块的pacakge名称为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
  4. 的子包中进行测试吗?

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

31 个答案:

答案 0 :(得分:71)

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

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

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

答案 1 :(得分:54)

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

enter image description here

答案 2 :(得分:9)

以上都没有为我修好。有帮助的是following the instructions

  

创建测试配置

     

在Android Studio中:

     
  • 打开运行菜单 - &gt; 编辑   配置
  • 添加新的 Android测试   配置
  • 选择模块
  • 添加特定模块   仪表运行员:
     

  android.support.test.runner.AndroidJUnitRunner

     

运行新创建的配置。

答案 3 :(得分:5)

我有类似的问题。不确定为什么会这样,但我能够通过以下方式解决这个问题:&#34; File&#34; &GT; &#34;使高速缓存无效/重新启动&#34;在Android Studio中。

答案 4 :(得分:4)

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

答案 5 :(得分:4)

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

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

答案 6 :(得分: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" />

答案 7 :(得分:3)

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

  1. 打开“项目结构”设置
  2. 点击“模块”(左侧)
  3. '来源'标签
    一个。右键单击源目录(通常是src),单击“Source” 湾右键单击您的测试目录,单击“测试”
    C。右键单击您的out目录,单击“Excluded”
  4. 转到“路径”标签页 一个。 点击“使用模块编译输出路径”单选按钮
    湾选择“输出路径”的输出路径目录 C。选择 “测试输出路径”
  5. 的测试路径目录
  6. 点击确定

答案 8 :(得分:3)

显然,您需要一个目标设备来运行您的测试,因为它们是仪表测试。出于某些原因,Android studio 有时不会要求您指向此目标设备,只是提示“空测试套件”消息。 有不同的方法来解决这个问题,这里有几个:

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

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

答案 9 :(得分:2)

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

  

清空测试套件错误

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

答案 10 :(得分:2)

我有这个问题,因为我在build.gradle中有这个:

testOptions {
    execution "ANDROID_TEST_ORCHESTRATOR"
}

即使我没有使用Android Test Orchestrator(必须错误地复制教程)。

评论说它解决了我。

答案 11 :(得分:1)

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

答案 12 :(得分:1)

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

答案 13 :(得分:1)

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

这发生在androidTest/

答案 14 :(得分:1)

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

我修复了异常,突然我的测试正在运行!

答案 15 :(得分:1)

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

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

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

答案 16 :(得分: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'

}

答案 17 :(得分:1)

其他解决方案都没有为我工作,但我只需卸载现有的应用程序或测试套件,然后运行测试就可以实现这一点。

答案 18 :(得分:0)

当我用注解 public class MyData { public int id { get; set; } public MySqlDateTime currentDateTime { get; set; } // Other fields public MyData() { // Empty constructor } } 错误地标记了一个非模拟类变量时,我发生了这种情况 删除了注释,测试成功运行。 这是在Android Studio上的Junit 4.5中发生的

答案 19 :(得分:0)

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

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

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

  3. 取下机身,并用新的测试代码替换。

测试现在应该可以工作。

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

答案 20 :(得分:0)

我有以下代码块

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

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

答案 21 :(得分:0)

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

答案 22 :(得分:0)

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

答案 23 :(得分:0)

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

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

答案 24 :(得分:0)

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

答案 25 :(得分:0)

就我而言,我在androidTest/java/<package.name>/MyTestingClass进行了仪器化测试,但我已将当前的构建版本设置为&#34; preproduction&#34;。这就是重点!正如Android Studio documentation中所述:

  

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

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

  1. 将此行添加到 build.gradle

    android{
        [...]
        testBuildType "preproduction"
    }
    
  2. 同步gradle。
  3. 删除我以前的测试配置,因为他们不考虑此Gradle同步。
  4. 然后我再次执行测试,这次他们运行得非常完美!

答案 26 :(得分:0)

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

答案 27 :(得分:0)

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

  • 构建:→重建项目
  • 重新启动设备:重新启动设备/模拟器,然后重试
  • 设备切换:如果您同时使用常规手机和模拟器拔下一个并尝试仅使用其中一个设备运行
  • Android Studio:文件 - &gt;使缓存无效并重新启动
  • 活动监视器/任务管理器:按名称对进程进行排序,看看是否有一个无名进程占用了大量的ram,这是一个&#34; ghost&#34;来自Android工作室必须被杀死的过程
  • git revert:尝试存储/恢复您的最新代码。有时会出现Android Studio / gradle未命中的编译错误,它只会尝试运行无法编译的代码。
  • 卸载然后重新安装Android Studio。

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

答案 28 :(得分:0)

测试类可能会从编译中排除。将其修复为setting-compiler-exclude。

答案 29 :(得分:0)

我有一个原始Java项目,正在发生这种情况。简单的Java + JUnit4。它绝对存在于.idea /或.iml文件中。我报废了,重新导入,最后再次测试了。

答案 30 :(得分:0)

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

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