Android Studio找不到TestCase类

18

我编写了一个简单的测试用例类并将其放置在Android Studio的默认测试目录“src/androidTest”中。我创建了一个名为“Android Tests”的构建配置,以查找模块中的所有测试。当我运行构建配置时,我的测试不执行,并在logcat中收到以下消息:W/TestGrouping﹕ Invalid Package: '' could not be found or has no tests。如果我指定测试包甚至特定的测试类,我会收到类似“class not found”的消息。

我的测试类如下:

public class FirstTest extends InstrumentationTestCase {

public void testSample() {
        final int expected = 1;
        final int reality = 5;
        assertEquals(expected, reality);
    }
}

我的 build.gradle 文件看起来像这样:

apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.1"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile 'com.android.support:gridlayout-v7:19.0.1'
    compile 'com.android.support:support-v4:19.0.1'
    compile 'com.android.support:appcompat-v7:19.0.1'
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

我正在运行Android Gradle插件的0.9版本。我的顶级build.gradle(与app目录同级)看起来像这样。

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.+'
    }
}

allprojects {
    repositories {
        mavenCentral()
    }
}

我的项目目录结构如下:

app src androidTest java main java res


请提供您的项目目录结构以进行测试。 - Piyush Agarwal
7个回答

26

您需要检查“运行”配置。

如果您要从androidTest文件夹运行测试,则应该选择Android仪器化测试下的配置,而不是junit。

运行(顶部工具窗口)/编辑配置...

输入显像说明


您可以右键单击测试类文件,然后选择具有 Android Instrumented Test 图标的“创建'ClassName'...”选项。 - Cloud

16

在androidTest/java目录下的包结构需要与main/java目录下的结构完全对应。

我的问题是,main下的包结构是com.mydomain.myapp.subpackage,而androidTest下的目录结构是com.mydomain.myapp.subpackage.somethingelse

一旦包结构匹配,测试就会被完美地发现和执行。


有趣。我不认为这是一个必要条件。你应该可以将代码放在"com.mydomain.myapp.subpackage"中,测试放在"com.mydomain.myapp.subpackage.test"中,但如果你这样做,需要注意受保护/包范围的作用。 - swooby
我也不会这么想。我没有在任何地方看到过这个记录,这可能只是 Android Studio 金丝雀版本中的一个错误。然而,当它开始工作时,我所做的唯一更改就是目录结构。 - joates
另外,请确保测试类的名称与您正在测试的类完全相同,+“Test”。 包括大小写。 - The Fox
直到我理解了真相,才明白这是多么痛苦,谢谢! - Ignacio Garcia

8
您不需要真正重新构建src目录的结构来创建适当的测试。
被测试的类和测试类应该在同一个包中,但是文件夹应该分开。因此,对于测试和普通源代码,我们使用不同的根目录。
问题是如何设置这些根目录。在AS 1.5(也许早期版本也可以),可以轻松完成以下步骤:
1. 创建几乎任何目录结构,在其中有被测试源代码的根目录。右键单击它,并选择“标记目录为”...“源代码根”。
2. 为测试创建另一个任意的目录结构。在其中有测试源代码的根目录。右键单击它并选择“标记目录为”...“测试源代码根”。
在这些根目录下,测试类的路径必须与被测试类从其根目录开始的路径相同,因为沿这些路径的目录名称定义了软件包,它们应该是相同的。但是您不需要担心根目录以上的结构。
使用此方法,您可以将测试添加到任何现有的源代码结构中。如果您自己创建结构,请使其更加传统。
修改。请注意,Java 9模块的文件夹结构完全不同。

我永远不会注意到那个问题,我从 STS 转到 Intellij ,习惯了约定优于配置。谢谢。 - Wudang
忘掉传统吧 :-) 现在我正在研究Java9模块化系统,那里的文件夹结构绝对是特别和不同的。 - Gangnus

6
也许我能够为某些人节省时间: 当我在Android Studio中选择了“发布”buildVariant时,遇到了与“未找到类”相同类型的错误。因此,在运行AndroidTests(Espresso)之前,请仔细检查您的构建变体并尝试将其设置为“调试”。

这是一个很好的指针,因为我没有运行它也没有调试它。 - Alberto M
1
问题已解决,谢谢! - Adam Dunmars

0
请发布您的整个build.gradle文件。
您正在使用哪个版本的'com.android.tools.build:gradle'?
在0.8中,默认测试路径为"instrumentTest/java/..."。
在0.9中,默认测试路径更改为"androidTest/java/..."。

要使用androidTest,您应该拥有:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.+'
    }
}

好的想法,如我在上面的编辑中所述,这些信息位于顶级 build.gradle 中。但仍然没有成功。 - joates

0
除了我之前的注释(请在我的建议之前检查它们),我有时会将测试文件移动到自定义目录之外(例如,在/test或androidTest下创建类似于db_test的目录),将其拖放到AndroidStudio资源管理器中的目录之外,并等待重构android studio对话框以进行移动确认。
成功运行后,我再次放回原始目录,再次运行,它就可以工作了。
在另一种情况下,我解决了自定义目录的重命名问题。
在另一种情况下,因为测试位于根目录中,我创建了自定义目录,将其移动到其中,然后成功运行。
这些方法对我有效,希望能为其他人节省时间。

0

这个问题很疯狂,就是这样。不要想太多。

我是如何解决它的(Win10):

  1. 重新启动(可能不必要)
  2. 尝试运行测试
  3. 尝试带覆盖率运行

这对我在Android Studio 3.6.3上修复了它。

这两种运行测试的方式是不同的,这种方法也可以为您解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接