单元测试不适用于 Android Studio 北极狐

Posted

技术标签:

【中文标题】单元测试不适用于 Android Studio 北极狐【英文标题】:Unit tests not working on Android Studio Arctic Fox 【发布时间】: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 【参考方案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 中运行测试之外,我没有找到任何解决方法。

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

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

    添加: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 中运行测试,

    从Canary channel 下载、解压并运行 Android Studio Bumblebee(您可以按照here 的描述与稳定的北极狐版本一起安装) 在 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 运行配置。

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

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

【讨论】:

不确定这个答案是否被否决,但我相信根据问题中链接的 AS 新版本文章,这是正确的方法。

以上是关于单元测试不适用于 Android Studio 北极狐的主要内容,如果未能解决你的问题,请参考以下文章

Android studio 怎么使用单元测试(不需要device)

Android Studio 单元测试:读取数据(输入)文件

Android Studio 代码建议不适用于 Flutter

Android Studio 项目适用于 Lollipop,但不适用于 Kitkat

Kapt 不适用于 Android Studio 3.0 中的 AutoValue

Android Studio 0.5.0 重建不适用于 Proguard