如何通过 Android Studio 为动态功能模块执行 UI 测试?

How to execute UI tests for a Dynamic Feature Module via Android Studio?

我有一个常规 :app 模块和一个 DFM :feature

我将 DFM 的测试放在 androidTest 源集中 :feature

当我尝试使用 Android Studio 创建的 运行 配置启动测试时,它静静地失败并显示 Test framework quit unexpectedly

如果我使用 Android Studio 在 Run 选项卡中显示的命令通过终端启动测试,我将看到:

$ adb shell am instrument -w -m    -e debug false -e class 'com.amazing.feature.AmazingTest' com.amazing.application.test/com.amazing.feature.TestRunner
...
Unable to find instrumentation info for: ComponentInfo{com.amazing.application.test/com.amazing.feature.TestRunner}

这并不奇怪,因为 运行ner 的路径是不同的:

$ adb shell pm list instrumentation
instrumentation:com.amazing.feature.test/com.amazing.feature.TestRunner (target=com.amazing.application)

如果我在命令行上使用该工具,则测试有效。

有没有办法教 Android Studio 做到这一点?

我也遇到了这个问题,刚升级到 AGP 7 和最新的 Android Studio。在我的例子中有点不同,我检查了同一个存储库两次,所以同时在 2 个分支上工作。在我的例子中,碰巧一个分支 + android studio 实例可以工作,它 select 正确的 TestRunner,而另一个实例不工作。这让我找到了简单的解决方案:

  1. 构建 -> 清理项目
  2. 删除所有剩余的构建文件夹(对我来说只有 1 个)

然后重试,select 测试运行程序正确。 我尝试过的其他事情,我不知道他们是否有帮助,如下所示:

  • 确保我使用 Java 11(因为我使用的是 AGP 7)
    • Project Structure -> Gradle settings -> Gradle JDK 应该类似于 11
  • 禁用实验性功能 Do not build Gradle task list during Gradle sync(在 Android Studio Arctic Fox 上自动启用)

我遇到了同样的问题。原来 gradle 在 androidTest APK 的动态功能模块 AndroidManifest.xml 标签中创建了一个错误的 targetPackage。您可以通过在模块的 build.gradle defaultConfig 中设置 testApplicationId 来解决此问题。

defaultConfig {    
    testApplicationId 'com.amazing.feature.test' // Set the test package here!
    testInstrumentationRunner 'com.amazing.feature.TestRunner'
    [...]
}

More documentation on this on developer.android.com.