【问题标题】:Unit tests not working on Android Studio Arctic Fox单元测试不适用于 Android Studio 北极狐
【发布时间】:2021-08-15 04:54:18
【问题描述】:

我最近安装了 Android Studio Arctic Fox v2020.3.1 Beta 2,以便能够在我们的项目中使用 Jetpack Compose,因为我无法在 AS 4.2.1 上这样做,因为 Compose 正在抛出strange build error that got fixed on Arctic Fox

所以这就是问题所在,在加载项目后,更新一些 SDK/库我能够构建和运行没有问题,但是,当我去运行单元测试时,我注意到所有测试类不再被IDE。经过一番调查,我发现newer versions of AS will no longer recognize JUnit configurations

正如您在下面的屏幕截图中看到的那样,无法像往常一样运行这些测试:

这个来自Run/Debug Configurations,其中JUnit 测试属于未知类别:

最后,我确实创建了一个 gradle 配置来测试,但它只是在左侧说:

未收到测试事件

并在右侧抛出错误:

任务“features:signup:testDevDebugUnitTest”执行失败。 没有找到给定的测试包括:com.projectsaturn.android.features:signup.SignupViewModelTest

我想知道是否有人遇到过这个问题并能够解决?

感谢任何帮助!

更新 01:

所以我决定回滚一切,从头开始。这次我只更新了一些东西:

  • Gradlecom.android.tools.build:gradle:7.0.0-beta02
  • 科特林org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.32
  • Crashlyticscom.google.firebase:firebase-crashlytics-gradle:2.6.1
  • 测试(核心、运行器和规则)androidx.test:core/runner/rules:1.3.0

现在的问题是,当我通过 Gradle 运行它时,所有单元测试都失败了。我怀疑它在运行实际测试函数之前没有运行 @Before 注释函数。或者我没有正确设置 Gradle 测试(截图如下)?

【问题讨论】:

  • 我执行了您在顶部链接的 Android Studio 文档中的说明(对于“Android Studio 现在使用 Gradle 测试运行程序”),它看起来对我来说效果很好。使用 AS 北极狐 beta05 和 jUnit 5.7.2。
  • 北极狐发布了,我昨天更新了,面临同样的未收到事件的问题。有什么对你有用的吗?
  • 随着北极狐的发布,得到不同的结果,有时测试用例通过,有时我得到“没有收到任何事件”。信息。而且覆盖率测试也不起作用
  • 同样的问题,使用 gradle runner 运行测试,但 @BeforeEach 被完全忽略。
  • 遇到同样的问题。下面的答案不能解决我的Test events were not received

标签: android android-studio unit-testing gradle junit


【解决方案1】:

你可以试试:

File -> Settings -> Experimental -> Uncheck "Do not build Gradle task list during Gradle sync"

之后:

File -> Sync Project with Gradle Files

【讨论】:

    【解决方案2】:

    按照 Android 文档 Build instrumented tests 中的说明设置您的测试环境,并且可以正常工作。

    不要忘记将 AndroidJUnitRunner 添加为默认值。

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

    【讨论】:

      【解决方案3】:

      在 MacOS Monterey 12.1 上全新安装北极狐 2020.3.1 补丁 4 后,我还拥有了

      未收到测试事件

      使用“基本活动”创建新项目后,我无法运行随项目自动创建的提供的单元测试。

      对我来说,解决方案是接受 Android Studio 的所有许可。我关注了这个帖子:Automatically accept all SDK licences

      转到/Library/Android/sdk/cmdline-tools/latest/bin 并运行:

      ./sdkmanager --licenses
      

      理论上,我希望弹出窗口要求我接受许可,但我在第一次启动 Android Studio 时没有看到任何内容。

      【讨论】:

        【解决方案4】:

        我安装了 AS BumbleBee(根据此线程中的建议),添加了 JUnit 库,

        testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2'
        

        并删除了 junit:4.x

        我设置了一个 Gradle 运行配置,但只是添加了 Gradle 侧边栏菜单中列出的 Gradle 任务,testDebugUnitTest,no :app: 或 :verification: 等。我从下拉菜单中选择了新的运行配置并添加了设置:

        当我从 Run Configuration 下拉菜单中选择 Run all tests 时,Gradle 任务窗口将在 IDE 底部打开,我的所有测试都已运行,并且我最终得到“18 个测试中的 18 个已运行”。我仍然无法像以前那样从编辑器运行单个测试,但至少这总比没有好,我的 CI 服务器能够从命令行执行测试而不会再次失败:

        ./gradlew :app:testDebugUnitTest --tests "com.*"
        

        【讨论】:

          【解决方案5】:

          尝试 android studio canary 构建。我正在使用 bumblebee,所有测试功能的工作方式都与以前相同。 https://developer.android.com/studio/preview

          【讨论】:

            【解决方案6】:

            按照这些步骤,对我有用。您需要为每个课程或测试创建单独的任务。除了在 Android Studio artifox 中运行测试之外,我没有找到任何解决方法。

            1. 将此添加到您的模块,即应用程序或其他模块

              测试选项 { 单元测试.all { 使用JUnitPlatform() } }

            2. 添加:data:cleanTestDebugUnitTest :data:testDebugUnitTest--tests "com.*"

            【讨论】:

              【解决方案7】:

              要在 Android Studio Arctic Fox 中使用 JUnit 5,请修改您的 app/build.gradle,如下所示:

              android {
              
              // .... other stuff
              
              testOptions {
                  execution 'ANDROIDX_TEST_ORCHESTRATOR'
              
                  unitTests.all {
                      useJUnitPlatform() // <--- this is the important part
                  }
              }
              

              }

              然后像这样将版本添加到junit:

              testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2'
              

              在依赖块内。

              然后从依赖项中删除其他版本的 junit(例如 junit 4)。 然后确保您在测试中引用了正确的版本。这里是 @Test 注释和 assertEquals 的示例:

              //import static org.junit.Assert.assertEquals;
              import static org.junit.jupiter.api.Assertions.*;
              import org.junit.jupiter.api.Test;
              //import org.junit.Test;
              
              class UtilsTest5 {
                 @Test
                 public void add() {       
                    assertEquals(10, 10);
                 }
              }
              

              【讨论】:

                【解决方案8】:

                对我来说,将 Android Studio 升级到 Arctic Fox 2020.3.1 Patch 2(刚刚发布)是正确的解决方案。

                在过去的几天里,我还在努力修复所有 JUnit 测试失败,将 Android Studio 的早期版本降至 4.0。这些旧的 Android Studio 版本都不适用于我的 JUnit 测试。我还尝试了迄今为止发布的所有答案:它们都不适合我。今天,我的所有 JUnit 测试都成功了,只需将我的 Android Studio 升级到 Arctic Fox 2020.3.1 Patch 2,而无需对我的源代码进行任何更改。我分享这个消息是为了帮助一些仍然面临这个问题的人。我已经在我的 MacBook 上测试了该修复程序。

                更新:

                在 Linux 上,将 Robolectric 版本从 4.3.1 升级到 4.5.1 后,我的所有 JUnit 测试现在都通过了:

                dependencies {
                    // >= 4.4.1 (but < 4.6) is needed on Linux starting Android Studio Arctic Fox:
                    testImplementation 'org.robolectric:robolectric:4.5.1'
                }
                

                【讨论】:

                • 并非所有英雄都穿着斗篷。它正在使用我正在使用的 AS 版本,但突然间,它不再工作了。我更新了 AS 并再次工作。谢谢!
                • @Filipe Oliveira:很高兴这个答案很有帮助。但是,我注意到即使在将我的 Android Studio 升级到 Arctic Fox 2020.3.1 Patch 2 后,我的 Ubuntu Linux 机器上的单元测试仍然失败。也许 Linux 需要更新版本的 Android Studio。
                【解决方案9】:

                我尝试了一些发布的解决方案,但没有人为我工作

                对我有用的解决方案是使用 java 8(version 1.8) 而不是与 Android Studio 捆绑在一起的 Java,它是 (11.0.10) for 北极狐

                步骤

                • File -> Settings -> Build -> gradle -> gradle JDK
                • 选择download JDK
                • 选择version 1.8
                • 点击download
                • 完成后点击applyrun再次测试

                [更新] 如果您的目标是 android 12 所以这需要 AGP 7.0+ 这需要 Java 11 解决方案将不适用否则上述解决方案将适合。

                【讨论】:

                • 但 Android gradle 插件需要 Java 11 > 无法应用插件“com.android.internal.application”。 > Android Gradle 插件需要 Java 11 才能运行。您当前使用的是 Java 1.8。
                • 如果您的目标是 android 12,那么您是对的,这需要 AGP 7.0+,这需要 Java 11,否则上述解决方案将适合。
                【解决方案10】:

                对我来说,Gradle 测试显示 Test events were not received,实际上代码中存在错误。

                修复方法是在测试之前构建项目并修复错误(如果有)。

                一种选择是从命令行调用 gradle 测试。这也会显示代码错误

                ./gradlew :app:cleanTestDebugUnitTest :app:testDebugUnitTest --tests "VehicleRepositoryTest.testVehicle"
                

                【讨论】:

                  【解决方案11】:

                  这里有同样的问题,我已经替换了这里描述的一些依赖项 https://developer.android.com/training/testing/junit-runner#ato-gradle 它对我有用!

                  【讨论】:

                    【解决方案12】:

                    以上所有的答案我都试过了

                    【讨论】:

                      【解决方案13】:

                      这不是一个很好的解决方案,但对我来说,它仅在我使用 JDK 1.8 作为Gradle JDK 时才有效。

                      要更改Gradle JDK,请打开Settings &gt; Build, Execution, Deployment &gt; Build Tools &gt; Gradle &gt; Gradle JDK

                      点击列表并使用Download JDK...可以下载JDK 1.8。

                      【讨论】:

                        【解决方案14】:

                        我尝试了几个建议,包括上面列出的那些,但单元测试仍然没有运行。

                        我偶然发现了this article from the official website,并意识到开发人员(至少是那些运行测试的人)似乎还必须从文章中暗示的 Canary 或 Dev 频道下载 Android Studio Bumblebee。

                        在 Android studio Arctic fox 中没有使用 GRADLE 运行 ANDROID INSTRUMENTED 测试的选项(可在稳定频道中使用)。

                        所以,要在 AS Arctic Fox 中运行测试,

                        1. Canary channel 下载、解压并运行 Android Studio Bumblebee(您可以按照here 的描述与稳定的北极狐版本一起安装)
                        2. 在 AS Bumblebee 中,选择 File > Settings > Build, Execution, Deployment > Testing(或 Android Studio > Preferences > Build, Execution, Deployment > Testing for mac 用户)

                        3.选中使用 Gradle 运行 Android 检测测试旁边的框,然后单击应用然后确定

                        运行测试并查看它在 Android Studio BumbleBee 中的运行情况。

                        回到 android studio Arctic fox,运行测试,看看它也在这里运行!

                        【讨论】:

                          【解决方案15】:

                          如果您使用的是 Android Studio Arctic Fox,则需要稍微修改一下您的 app/build.gradle。

                          添加

                          android {
                              testOptions {
                                  execution 'ANDROIDX_TEST_ORCHESTRATOR'
                          
                                  unitTests.all {
                                      useJUnitPlatform() // <--- this is the important part
                                  }
                              }
                          }
                          

                          还要确保将 junit-engine 添加到依赖项中

                          testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.7.1'
                          

                          【讨论】:

                          • 您能否详细说明您的答案?
                          • 通过 import org.junit.jupiter.api.Test 而不是 import org.junit.Test 替换您在测试文件中的导入
                          • 做上面的回答需要使用 @Test 的 Jupiter 注解。如果你不这样做,你会得到一个空的测试运行器(它不会找到你的测试),它会说“没有可用的任务”。
                          • 帮我解决了这个问题,谢谢!
                          • 不起作用也没有真正的解释:(
                          【解决方案16】:

                          在北极狐中,播放/运行按钮在Test 类中应该仍然可见。对我有用的是更改 AS 的主题(将其更改为 Atom OneDark,但它可能适用于内置主题)!

                          【讨论】:

                            【解决方案17】:

                            这可能不是适合所有人的解决方案,但我们的项目有许多单元测试由于 Android Studio Arctic Fox 的Gradle test runner 而被破坏。看来,如果你更新到最新的 Gradle 插件,右键单击一个测试类会提示一个新的 Gradle“创建测试”选项。

                            我们还没有更新插件,所以我们的解决方案是为单元测试制作我们自己的 Gradle 运行配置。

                            这可以通过以下方式完成:

                            1. 转到工具栏 > 运行 > 编辑配置
                            2. 然后在 Gradle 下创建一个新配置,其中包含您要运行的测试的任务 旧的 Android JUnit 测试是 Android Studio 在没有插件更新的情况下默认运行的。

                            【讨论】:

                            • 不确定这个答案是否被否决,但我相信根据问题中链接的 AS 新版本文章,这是正确的方法。
                            猜你喜欢
                            • 1970-01-01
                            • 2021-10-04
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2021-10-20
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多