Android Studio Arctic Fox中单元测试无法工作

63
我最近安装了Android Studio Arctic Fox v2020.3.1 Beta 2以使用Jetpack Compose在我们的项目中,因为在AS 4.2.1上无法使用Compose,由于在Arctic Fox上修复的奇怪构建错误
问题在于,加载项目后,更新一些SDK/库后,我能够轻松构建和运行,但是,当我尝试运行单元测试时,我发现IDE不再识别所有测试类。经过调查,我发现较新版本的AS将不再识别JUnit配置
如下所示的屏幕截图中,无法像通常那样运行这些测试:

enter image description here

enter image description here

这个是来自于运行/调试配置,其中JUnit测试位于未知类别下:

enter image description here

最后,我创建了一个gradle配置进行测试,但左侧仅显示以下内容:

未收到测试事件

右侧会抛出一个错误:

执行任务'features:signup:testDevDebugUnitTest'失败。 给定包括项的测试未找到:com.projectsaturn.android.features:signup.SignupViewModelTest

我想知道是否有人遇到过这个问题并且能够解决?
感谢您的任何帮助!
更新01:
所以我决定回退一切,从头开始。这次我只更新了几个东西:
Gradle:com.android.tools.build:gradle:7.0.0-beta02
Kotlin: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测试(如下图)?

enter image description here


2
我按照你在顶部提供的Android Studio文档中的指示进行了操作(针对“Android Studio现在使用Gradle测试运行程序”),看起来对我来说效果很好。我使用的是AS Arctic Fox beta05和jUnit 5.7.2。 - adek111
4
北极狐已发布,我昨天更新了,但仍面临相同的“未收到任何事件”的问题。你有任何有效解决方法吗? - ansh sachdeva
2
随着Arctic Fox版本的发布,我得到了不同的结果,有时测试用例通过,有时会出现“未收到事件”的消息。而且带覆盖率的测试也无法正常工作。 - Karan Sharma
1
这里也有同样的问题,测试使用gradle runner运行,但是@BeforeEach完全被忽略了。 - steliosf
1
遇到了同样的问题。下面的答案并不能解决我这边的“未收到测试事件”的问题。 - Zerosero
显示剩余3条评论
18个回答

28
如果您正在使用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'

9
请使用import org.junit.jupiter.api.Test代替import org.junit.Test来替换您测试文件中的导入。 - Dr4ke the b4dass
2
完成上述答案需要使用Jupiter注释@ Test。如果您不这样做,您将得到一个空的测试运行程序(它找不到您的测试),并且它会显示“没有可用的任务”。 - Lance Kind
1
问题已经被我解决了,谢谢! - Minas Mina
我还需要添加依赖项 testImplementation "org.junit.vintage:junit-vintage-engine:5.7.1" 才能使其正常工作。 - Nicolas
4
无法运行,且没有真正的解释 :( - marchinram
显示剩余4条评论

5

这可能不是所有人的解决方案,但我们的项目有许多单元测试由于Android Studio Arctic Fox的Gradle测试运行程序而出现故障。如果您更新到最新的Gradle插件,则右键单击测试类将提示新的Gradle "Create test"选项。Create Gradle test option.

我们尚未更新插件,因此我们的解决方案是为Unit测试创建自己的Gradle Run Configuration。

可以通过以下步骤完成:

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

不确定为什么这个答案被踩,但我相信根据问题中链接的AS新版本文章,这是正确的方法。 - Dmytro Karataiev

4

我尝试了一些已发布的解决方案,但是没有一个能够为我解决问题。

对我起作用的解决方案是使用Java 8(版本1.8)而不是Android Studio附带的Java(11.0.10),适用于Arctic fox

步骤

  • 文件 -> 设置 -> 构建 -> gradle -> gradle JDK
  • 选择下载JDK
  • 选择版本1.8
  • 点击下载
  • 下载完成后,单击应用并再次运行测试

[更新] 如果您的目标是Android 12 则需要AGP 7.0+,该版本需要Java 11。否则,以上解决方案将适用。


1
无法应用插件'com.android.internal.application'。
Android Gradle插件需要Java 11来运行。您当前正在使用Java 1.8。
- tonisives
2
如果你的目标是 Android 12,那么你是正确的,这需要 AGP 7.0+,而 AGP 7.0+ 需要 Java 11。否则,以上解决方案将适用。 - Mahmoud Mabrok

3

按照Android文档提供的方式设置您的测试环境,构建仪器化测试,这样就可以正常工作了。

别忘记将AndroidJUnitRunner添加为默认选项。

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

2
对我而言,将Android Studio升级到刚发布的Arctic Fox 2020.3.1 Patch 2是正确的解决方案。
在过去的几天里,我一直在努力修复之前版本的Android Studio(甚至降到了4.0)中所有的JUnit测试失败问题。这些旧版本的Android Studio都无法正常运行我的JUnit测试。我也尝试了目前为止发布的所有答案:但它们都对我无效。今天,在不更改任何源代码的情况下,只需将Android Studio升级到Arctic Fox 2020.3.1 Patch 2,我的所有JUnit测试都成功通过了。我分享这个消息是为了帮助那些仍然面临此问题的人。我已在我的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
@ Filipe Oliveira:很高兴这个答案有所帮助。然而,我注意到即使将我的Android Studio升级到Arctic Fox 2020.3.1 Patch 2,我的Ubuntu Linux机器上的单元测试仍然失败。也许Linux需要一个更新版本的Android Studio。 - jonathanzh

2

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

要更改Gradle JDK,请打开Settings > Build, Execution, Deployment > Build Tools > Gradle > Gradle JDK

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


2

我尝试了一些建议,包括上面列出的那些,但单元测试仍然无法运行。

我偶然发现了来自官方网站的这篇文章,并意识到似乎开发人员(至少是运行测试的人)还必须从金丝雀或Dev频道下载Android studio Bumblebee,正如文章中所暗示的那样。

在Android studio Arctic fox(可在稳定通道中使用)中没有选项可以使用Gradle运行Android仪器化测试。

因此,在AS Arctic Fox中运行测试的步骤如下:

  1. Canary Channel下载、提取和运行Android Studio Bumblebee(您可以按照这里的说明将其与稳定的Arctic Fox版本一起安装)
  2. 在AS Bumblebee中,选择File > Settings > Build, Execution, Deployment > Testing(或Android Studio > Preferences > Build, Execution, Deployment > Testing,适用于Mac用户)

3.选中“使用Gradle运行Android仪器化测试”复选框并单击“应用”然后单击“确定”

运行测试并在Android studio BumbleBee中查看其运行情况。

返回到Android studio Arctic fox,在此处运行测试,并查看其运行情况!


2

1

要在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);
   }
}

当我尝试这样做时,我得到了一个“未解决的引用:junit”的错误提示,并被告知将“JUnit4”添加到类路径中。 - Bink

1

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