【问题标题】:Android Studio "No tests were found"Android Studio“未找到测试”
【发布时间】:2014-03-22 18:53:33
【问题描述】:

有没有人能够让测试在 Android Studio 中运行(从 GUI 而不是终端),我一直无法从 GUI 运行测试。

每次我尝试通过 GUI 运行测试时,都会收到以下消息:

我可以使用以下命令从终端运行测试:

./gradlew connectedAndroidTest

我在 Mac OSX

上使用 Gradle 1.11 和插件 0.9.0 运行 Android Studio 0.5.2

我的项目结构如下;

MyProject/
   src/
      androidTest/
         java/
             com.myproject.app.test/
                … (tests source code) …
      main/
         java/
             com.myproject.app/
                … (source code) …
         res/
                … (resources code) …
   build.gradle

我的 build.gradle 文件类似于以下内容:

…
android {
    compileSdkVersion 19
    buildToolsVersion "19.0.1"

    defaultConfig {
        versionCode 12
        versionName "2.0"
        minSdkVersion 9
        targetSdkVersion 19       
    testPackageName "com.test.foo"
        testInstrumentationRunner "android.test.InstrumentationTestRunner"
    }
}
…

如果有人有任何建议,我将非常乐意在这里提出。

【问题讨论】:

  • 你能发布你的一个测试文件的内容吗?
  • 测试文件的内容不是问题,是.idea文件夹中的misc.xml文件有问题。但是测试文件只是简单的 TestCase 文件,所以我看不出它们有什么问题。
  • @iamshanedoyle 你把 /androidTest 目录放在 /src 下。但它应该和/src在同一级别,而不是在它之下。查看你的 build.gradle,它应该有:androidTest.setRoot('androidTest')。

标签: android android-studio testing gradle


【解决方案1】:

今天我在一些 Espresso 测试中遇到了同样的问题,这让我抓狂,因为一切看起来都很正常。最后我发现问题是因为用@BeforeClass 注释的方法抛出了异常。如果该方法出现问题,异常的堆栈跟踪不会显示在运行选项卡日志窗口中,而是显示在日志窗口Android Monitor 选项卡

如果您想重现问题,只需将其添加到您的测试类中:

@BeforeClass
public static void setupClass() {
    throw new RuntimeException("Sorry dude, you won't find any test!");
}

【讨论】:

  • 对我来说这是无法创建匕首图的问题。异常显示在 Android Monitor 选项卡的 Log 窗口中,而不是在 Run 选项卡中!
【解决方案2】:

当您的运行配置类型不正确时,可能会发生这种情况。

在我看来,在运行 Espresso 测试(以前是单元测试)时会出错。出于某种原因,它在运行此测试时仍然使用 Android JUnit 测试配置。手动创建一个 Android Instrumented Test 可以解决这个问题。

【讨论】:

  • 我在 AS 3.0 中遇到了类似的问题,但它只能间歇性地重现。我手动创建了一个 Android Instrumented Test,它运行了一段时间,然后有一次测试失败,从那以后它根本不会检测到仪器测试。说“没有找到测试”。
  • 您好,我也有同样的问题。我在我的模块中同时使用 java 和 Kotlin。我手动创建了 Junit 测试,但也许我做错了。你能写出你是如何手动创建测试的吗?
【解决方案3】:

为了子孙后代,这是对我有用的解决方案 -

如果 AS 出于某种原因认为您将要运行的测试是一个单元而不是仪器测试,则会发生您看到的错误。通常,只需单击包而不是实际的类,此错误就会消失。

发现于https://github.com/googlecodelabs/android-testing/issues/27#issuecomment-219074863

我刚刚通过右键单击包名称并选择“在 {packageName} 中运行'测试'”来运行测试,它运行正常。

【讨论】:

    【解决方案4】:

    好的,我找到了问题的原因。

    在我项目的 .idea 文件夹中的 misc.xml 文件中,ProjectRootManager 组件的属性值无效,如下所示:

    <component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="1.6 (3)" project-jdk-type="JavaSDK">
        <output url="file://$PROJECT_DIR$/build/classes" />
    </component>
    

    所以将project-jdk-name 属性值更改为“1.6”,为我解决了这个问题。下面是我更新值后的样子。

    <component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="1.6" project-jdk-type="JavaSDK">
        <output url="file://$PROJECT_DIR$/build/classes" />
    </component>
    

    希望这可以帮助任何人。

    【讨论】:

    • 我将project-jdk-name 属性设置为字符串JDK 将其更改为1.8。像魅力一样工作!
    • 将我的 1.8 (2) 更改为 1.8 但没有帮助。
    【解决方案5】:

    要使用 kotlin 在 android 移动设备上运行仪器测试用例,请添加以下内容 将东西放入您的应用 build.gradle:

     defaultConfig {
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        }
             
    

    添加这些权限:

        dependencies {
            testImplementation 'junit:junit:4.12'
            testImplementation 'androidx.test.ext:junit:1.1.1'
            androidTestUtil 'androidx.test:orchestrator:1.2.0'
            androidTestImplementation 'androidx.test:runner:1.2.0'
            androidTestImplementation 'androidx.test:rules:1.2.0'
        }
            
    

    我用的是以下gradle版本:

    distributionUrl=https://services.gradle.org/distributions/gradle-5.4.1-all.zip

     buildscript {
            
                ext.kotlin_version = '1.3.71' 
              
                repositories {
                    flatDir { dirs './lib' }
                    google()
                    mavenCentral()
                    jcenter()
                    maven { url 'https://plugins.gradle.org/m2/' }
                }
            
                dependencies {
                    classpath 'com.android.tools.build:gradle:3.4.2'     
                    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
                }
            }
            
    

    然后在src->androidTest->java->com.example.demo->创建类DemoTest.kt。 如果您需要上下文,请通过InstrumentationRegistry.getInstrumentation().targetContext获取它

    如果您的测试用例需要任何权限,请添加以下规则:

    @Rule
    @JvmField
    var permissionRule: GrantPermissionRule = GrantPermissionRule.grant(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN)
                
    

    您可以在里面进行所有设置:

     @Before
     fun setup() {
        // Do initial setup here
     }
    

    然后像这样编写测试用例:

    @Test
    fun testFunctionality() {
        // write your code here         
    }
    

    【讨论】:

    • 我唯一需要更改的是defaultConfig,因为我在创建项目后将项目设置更改为使用androidx
    【解决方案6】:

    以上方法都不适合我(缓存无效...)。

    有效的是:

    • 点击主工具栏中的配置列表下拉菜单。
    • 在其中单击“编辑配置...”。
    • 删除我的测试条目。
    • 回到源头,点击|>|我想运行的测试按钮。

    然后莫名其妙地起作用了。

    【讨论】:

    • 也对我有用,这可能是因为我将测试从 test 移至 androidTest
    【解决方案7】:

    对我来说这是愚蠢的事情。只需从 Release 构建变体切换到 Debug 即可解决问题。

    【讨论】:

      【解决方案8】:

      正如azizbekianAndroid 10 API 29 documentation 中提到的here,当应用程序首次在模拟器上运行以API29 为目标的测试时,可能会发生此问题。

      模拟器可能正在等待用户在屏幕上输入:

      选择允许 TestServices 访问的内容

      这里的文档中有更多关于此的信息,但似乎某些版本的 android-test 依赖项存在一个已知问题,可能会导致出现此提示。

      https://developer.android.com/about/versions/10/privacy/changes?hl=en#user-permission-legacy-apps

      因此,请务必检查模拟器上的屏幕。就我而言,问题是我的模拟器正在等待确认 TestServices 组件被授予存储权限,根据链接的 SO 问题和 Android 文档中的屏幕截图。

      【讨论】:

      • 谢谢——您的回答让我走上了正轨。如that GitHub issue for android-test 中所述,旧的(AndroidX 之前的)android-test 运行器将无法在具有 Android 10 API 29 的模拟器上运行。解决方法是在 Android 9 API 28 上使用模拟器。
      【解决方案9】:

      只需从我的模拟器中擦除数据,我的问题就解决了。在日志中,我可以看到没有足够的空间。 这对我来说不是任何配置问题,因为我在运行测试之前运行的测试给出了空套件错误,并且两个测试都在项目中的同一位置。

      【讨论】:

        【解决方案10】:

        在我的情况下,问题出在模拟器上,当我用真机测试时,错误消失了。

        【讨论】:

          【解决方案11】:

          如果我解决了这个问题,我会更新这个,但是构建我的项目

          debugImplementation 'androidx.fragment:fragment-testing:$fragment_version'
          

          导致我的所有测试都报告了这一点

          没有找到测试

          包括所有未导入包的测试。与此同时,从你的 gradle 中删除它,然后调用“Clean Project”,然后调用“Invalidate Caches / Restart”解决了这个问题。

          编辑:

          你的 gradle 还必须包含

          debugImplementation "androidx.test:core:$core_version"
          

          【讨论】:

            【解决方案12】:

            就我而言,我没有将测试类声明为公开的。

            【讨论】:

              【解决方案13】:

              在我的情况下,a 使用了错误的测试依赖项。我的 build.gradle 中有以下内容

              testImplementation 'io.kotlintest.kotlintest-runner-junit5:3.4.2'
              

              如您所见,这是针对 JUnit5 的。我把它改成了下面的

              testImplementation 'io.kotlintest.kotlintest-runner-junit4:3.4.2'
              

              然后开始,错误。

              【讨论】:

                【解决方案14】:

                我的情况发生了什么。

                仅供参考我们有两种类型的单元测试

                1. 本地单元测试(android studio 项目的 test/java 文件夹)
                2. 仪器单元测试(android 工作室项目的 androidTest/java 文件夹)

                我错误地在本地单元测试中创建了 Instrumentation 测试,然后我直接将该测试从本地单元复制到 Instrumentation 测试。它开始说“未找到测试”

                解决方案:刚刚为 Instrumentation 测试创建了一个新的测试类。

                始终尝试在特定的测试文件夹中创建一个新的测试类并开始在其中编写测试。

                【讨论】:

                  【解决方案15】:

                  转到:

                  文件 => 使缓存无效/重新启动... => 无效并重新启动

                  这对我有用。

                  【讨论】:

                    【解决方案16】:

                    还有一件事要检查我在旧分支上时是否愚蠢地错​​过了:

                    确保您尝试运行的测试没有@Ignore 注释:)

                    【讨论】:

                      【解决方案17】:

                      在我的例子中,USING KOTLIN,它没有抛出任何东西。 如果我在终端中运行它试图执行的命令:

                      $ adb shell am instrument -w -r -e debug false -e class xx.xxxxxxx.xx.xx.xxx.xxx.HomeActivityTests xx.xxxxxxx.xx.xx.debug.test/android.support.test。 runner.AndroidJUnitRunner

                      会报错:

                      引起:org.mockito.exceptions.base.MockitoException:

                      无法模拟/监视类 xx.xxxxxxx.xx.xx.xxx.xxx.xxx.ProductUseCase

                      Mockito 无法模拟/窥探,因为: - 最后一堂课 在 xx.xxxxxxx.xx.xx.rules.useCases.ProductUseCaseRule.(ProductUseCaseRule.kt:36) 在 xx.xxxxxxx.xx.xx.xxx.xxx.HomeActivityTests.(HomeActivityTests.kt:25) ... 20 更多

                      失败!!!

                      这表明我没有 open 我的班级,因为这是在使用 Kotlin 进行测试时必须

                      【讨论】:

                      • 你是怎么开课的?
                      • Mockito 是必须的,具体一点。
                      【解决方案18】:

                      @Test注解应该从import org.junit.jupiter.api.Test;注解

                      【讨论】:

                        【解决方案19】:

                        这是一个非常简单的问题,只需按 Alt + Shift + F10 并以这种方式运行 :) PS:如果不起作用,请尝试 Shift + F10

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 2013-06-07
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2014-03-05
                          • 1970-01-01
                          相关资源
                          最近更新 更多