Android工作室为AndroidTestCase说“空测试套件”

时间:2013-12-17 14:15:32

标签: 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.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);
    }
}

11 个答案:

答案 0 :(得分:16)

由于没有其他人提及它:AndroidTestCase子类中的方法需要为public,名称以&#34开头;测试"!

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

答案 1 :(得分:12)

从Android Studio运行测试时出现此错误。原来我把我的测试用例放在了错误的文件夹中。运行Gradle / Android Studio时,所有Android测试都应位于src/instrumentTest/java

文件夹中

编辑:在Gradle插件版本0.9或更高版本中,文件夹的正确名称为androidTest。 (http://tools.android.com/tech-docs/new-build-system/migrating_to_09

答案 2 :(得分:9)

我知道这个问题已经过时了,自从提出这个问题以来,开发工具已经发生了重大变化。

但是,我有一个类似的问题(在AndroidStudio 2.1.1中),结果发现它只是错误消息,这是非常误导。对我来说它说:

Test running started
Test running failed: Instrumentation run failed due to 'java.lang.IllegalStateException'
Empty test suite.

(注意:与原始问题的区别在于IllegalStateException与RuntimeException)

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

即。 "空测试套件"可以表示它实际上说的内容(你没有声明任何测试方法,例如因为你忘了使用@Test注释它们),但它也可能意味着某些东西(比如应用程序中抛出的运行时异常)初始化代码)阻止测试运行器到达任何测试方法(这似乎是你的情况)。

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

答案 3 :(得分:7)

我收到此错误,因为我的一个测试方法在方法签名后没有包含“throws exception”。可能会帮助某人

答案 4 :(得分:6)

我遇到了同样的问题。我的testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 中有defaultConfig {...}。我刚刚删除了该行,现在它正常工作(IDE正在构建时选择正确的运行时配置)。

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

答案 5 :(得分:5)

我的问题是我有android studio生成的默认构造函数,看起来像这样

public class SomeTest extends ActivityUnitTestCase<ActivityYouWantToTest>{
    public SomeTest(Class<NewsActivity> activityClass) {
        super(activityClass);
    }
}

我必须将其改为此以解决问题

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

答案 6 :(得分:3)

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

AndroidTestCase不要求您覆盖默认构造函数,因为它没有提供Activity特定的Context,而是为您提供一般的构造函数,因此您仍然可以调用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,因为我们需要访问应用程序的资源。

答案 7 :(得分:1)

本指南可能有所帮助 - http://www.slideshare.net/tobiaspreuss/how-to-setup-unit-testing-in-android-studio

在最新的gradle(0.9+)上,测试应该在 androidTest 目录下

同样在你的gradle.build中:

dependencies {
     androidTestCompile 'junit:junit:4.+'
}

还会在 defaultConfig {

下添加
testPackageName "test.java.foo"
testInstrumentationRunner "android.test.InstrumentationTestRunner"

}

答案 8 :(得分:1)

您是否在gradleConfig中配置了testRunner? 我们使用不同的TestRunner进行不同的测试(以加快速度。我的配置看起来像这样

android {    
// Some stuff      
  defaultConfig {
        // Some other stuff

        //junit test
        testInstrumentationRunner "de.qabel.qabelbox.QblJUnitRunner"
        //ui tests
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"   
    }  
}

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

答案 9 :(得分:0)

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

package nilzor.myapp.tests;

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

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

答案 10 :(得分:0)

我的测试用例中已经有一个默认构造函数,但它仍然给我错误“空测试套件”并且卡在“实例化测试......”。

尝试创建新工作区,重置Android Studio,但这不起作用。

最后,关闭Android SDK和模拟器。

  1. 转到你的android-sdks / platform-tools。

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

    一个。 rm -rf ~/Library/Application Support/AndroidStudio

    rm -rf ~/Library/Caches/AndroidStudio

    ℃。 rm -rf ~/Library/Application Support/AndroidStudio

    d。 rm -rf ~/Library/Preferences/AndroidStudio

  3. 执行命令

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