单元测试不适用于 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:
所以我决定回滚一切,从头开始。这次我只更新了一些东西:
Gradle:com.android.tools.build:gradle:7.0.0-beta02
科特林:org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.32
Crashlytics:com.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
完成后点击apply
和run
再次测试
[更新] 如果您的目标是 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 > Build, Execution, Deployment > Build Tools > Gradle > 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