安卓工作室说;“空测试套件”;对于AndroidTestCase

安卓工作室说;“空测试套件”;对于AndroidTestCase,android,junit,gradle,android-studio,Android,Junit,Gradle,Android Studio,我创建了一个扩展AndroidTestCase的示例测试用例。当我运行测试用例时, 它错在说 Running tests Test running startedTest running failed: Instrumentation run failed due to 'java.lang.RuntimeException' Empty test suite. 测试用例 import android.test.AndroidTestCase; import android.test.sui

我创建了一个扩展AndroidTestCase的示例测试用例。当我运行测试用例时, 它错在说

Running tests
Test running startedTest running failed: 
Instrumentation run failed due to 'java.lang.RuntimeException'
Empty test suite.
测试用例

import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;

import static org.junit.Assert.assertEquals;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import java.lang.Exception;
import java.lang.Override;

public class DateFormatTest extends AndroidTestCase{

    @Override
    protected void setUp() throws Exception {
        super.setUp();
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
    }

    public DateFormatTest(){
        super(DateFormatTest.class);
    }


    @SmallTest
    public void testMultiply() {

        assertEquals("10 x 5 must be 50", 50, 10*5);
    }
}

我刚刚开始学习测试Android应用程序,我一直在努力解决同样的问题。您需要为测试类提供默认构造函数,例如:

package nilzor.myapp.tests;

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

    @SmallTest
    public void testBlah(){
        assertEquals(1,1);
    }
}
包nilzor.myapp.tests;
公共类NilzorSomeTest扩展了ActivityUnitTestCase{
公共氮量计(){
超级(ActivityYouWantToTest.class);
}
@小测验
公共void testBlah(){
资产质量(1,1);
}
}

我们使用
AndroidTestCase
类来定义我们正在测试特定于Android的组件。
AndroidTestCase
的主要好处是,它使我们能够访问应用程序的资源,如字符串和布局等

AndroidTestCase
不要求覆盖默认构造函数,因为它不提供特定的
活动
作为
上下文
,而是提供了一个通用的,因此您仍然可以调用
getContext()

在您的示例中,您没有使用任何Android组件,因此,以下内容对您来说是有意义的:

import android.test.suitebuilder.annotation.SmallTest;

import junit.framework.TestCase;

public class DateFormatTest2 extends TestCase {

    @SmallTest
    public void testMultiply() {

        assertEquals("10 x 5 must be 50", 50, 10 * 5);
    }
}
注意使用
TestCase
而不是
AndroidTestCase

要使
AndroidTestCase
适用,需要一个需要资源的测试:

import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;

public class DateFormatTest extends AndroidTestCase {

    @SmallTest
    public void testAppTitle() {
        assertEquals("MyApp", getContext().getResources().getString(R.string.app_name));
    }
}

这里我们使用了
AndroidTestCase
,因为我们需要访问应用程序的资源。

我在Android Studio运行测试时遇到了这个错误。结果我把我的测试用例放错了文件夹。运行Gradle/Android Studio时,所有Android测试都应位于文件夹
src/instrumentTest/java


编辑:在Gradle插件版本0.9或更高版本中,文件夹的正确名称是
androidTest
。()

我的问题是,我有由android studio生成的默认构造函数,如下所示

public class SomeTest extends ActivityUnitTestCase<ActivityYouWantToTest>{
    public SomeTest(Class<NewsActivity> activityClass) {
        super(activityClass);
    }
}
android {    
// Some stuff      
  defaultConfig {
        // Some other stuff

        //junit test
        testInstrumentationRunner "de.qabel.qabelbox.QblJUnitRunner"
        //ui tests
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"   
    }  
}
public类SomeTest扩展了ActivityUnitTestCase{
公共SomeTest(类activityClass){
超级(活动类);
}
}
我不得不把它改成这个来解决这个问题

public class SomeTest extends ActivityUnitTestCase<ActivityYouWantToTest>{
        public SomeTest() {
            super(ActivityYouWantToTest.class);
        }
    }
public类SomeTest扩展了ActivityUnitTestCase{
公共测试(){
超级(ActivityYouWantToTest.class);
}
}
本指南可能会有所帮助-

在最新等级(0.9+)上,测试应在androidTestdir下进行

同样在gradle.build中:

dependencies {
     androidTestCompile 'junit:junit:4.+'
}
还可以将这些添加到defaultConfig{

testPackageName "test.java.foo"
testInstrumentationRunner "android.test.InstrumentationTestRunner"

}

我的测试用例中已经有了一个默认构造函数,但它仍然给了我错误“空测试套件”,并被困在“实例化测试…”上

尝试创建新的工作区,重置Android Studio,但没有成功

最后,关闭Android SDK和emulator

  • 转到您的android SDK/平台工具

  • 使用以下命令清除所有Android临时文件:

    a<代码>rm-rf~/库/应用程序支持/AndroidStudio

    b<代码>rm-rf~/Library/Caches/AndroidStudio

    c<代码>rm-rf~/库/应用程序支持/AndroidStudio

    d<代码>rm-rf~/Library/Preferences/AndroidStudio

  • 运行:

    ./adb kill-server
    ./adb start-server
    
  • 启动Android并运行测试用例


  • 我得到这个错误是因为我的一个测试方法在方法签名后没有包含“抛出异常”。可能会帮助某人,因为没有人提到它:
    AndroidTestCase
    子类中的方法必须是
    public
    ,并且名称以“test”开头


    OP和答案都是正确的,但我错过了,得到了完全相同的错误。

    您是否在gradleConfig中配置了testRunner? 我们为不同的测试使用不同的TestRunner(以加快速度)

    public class SomeTest extends ActivityUnitTestCase<ActivityYouWantToTest>{
        public SomeTest(Class<NewsActivity> activityClass) {
            super(activityClass);
        }
    }
    
    android {    
    // Some stuff      
      defaultConfig {
            // Some other stuff
    
            //junit test
            testInstrumentationRunner "de.qabel.qabelbox.QblJUnitRunner"
            //ui tests
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"   
        }  
    }
    

    如果我禁用其中一行,相应的测试也会报告“空测试套件”。

    我也遇到了同样的问题。我使用的是
    TestInstrumentRunner“android.support.test.runner.AndroidJUnitRunner”
    
    在我的
    defaultConfig{…}
    中。我刚刚删除了这一行,现在它工作正常(IDE在构建时选择了正确的运行程序配置)


    我希望这会对某些人有所帮助。

    我知道这个问题很老了,自从提出这个问题以来,开发工具已经发生了很大的变化

    然而,我也有一个类似的问题(在AndroidStudio 2.1.1中),结果证明,这只是一条错误消息,具有误导性。对我来说,它说:

    Test running started
    Test running failed: Instrumentation run failed due to 'java.lang.IllegalStateException'
    Empty test suite.
    
    (注意:与原始问题的区别在于IllegalStateException与RuntimeException)

    事实证明,这个
    IllegalStateException
    实际上是在应用程序上下文的初始化中抛出的,这可以通过检查logcat输出看到。因此,没有运行任何测试方法,Android Studio编写了这个有点误导性的“空测试套件”错误

    也就是说,“空测试套件”可能意味着它实际所说的内容(您没有声明任何测试方法,例如,因为您忘记用
    @test
    对它们进行注释),但也可能意味着某些东西(如应用程序初始化代码中引发的运行时异常)阻止测试运行程序访问任何测试方法(这似乎是你的情况)


    检查adb logcat并搜索
    RuntimeException
    s。这可能会找到问题的根本原因。

    我的测试用例中已经有了默认构造函数。是的,我也已经有了默认构造函数,并且这个错误不断发生。在哪里指定这是Android测试的强制文件结构?它是这实际上不是强制性的,它只是默认的文件夹结构。您可以在Android工具网站上阅读更多关于它的信息:。当我在上面写下答案时,我无法让测试在外部运行