【问题标题】:Espresso Unit Tests fail on AWS Device Farm but Run locallyEspresso 单元测试在 AWS Device Farm 上失败,但在本地运行
【发布时间】:2019-11-18 13:03:51
【问题描述】:

我有一个Espresso 单元测试,它在我的机器上本地运行良好。该测试使用ActivityTestRule,并通过Koin 模拟和提供了一堆依赖项。依赖注入在@Before 方法中完成。

测试成功通过,在我的本地设备和模拟器上没有任何问题。 AWS Device Farm 上的相同测试失败。它试图初始化我的FirebaseMessagingService,这甚至不是测试的一部分。我正在尝试在那里创建手动运行。我已验证我正在上传正确的原始 debug APK 和 androidTest APK。我还尝试在 Device Farm 上使用Test Filter 来运行特定的测试类。它执行 @Before 和 @After 但在原始测试期间失败,因为它无法在该 Firebase 服务中找到某些依赖项,这很奇怪,因为该类在测试中没有作用。

【问题讨论】:

    标签: android continuous-integration android-espresso android-testing aws-device-farm


    【解决方案1】:

    Firebase SDK 通过内容提供程序自动初始化(黑客)。 Firebase SDK 需要安装 google play 服务,这些服务在 android 的 amazons fork 上是缺失的。您的代码应该准备好处理缺失的播放服务(通常),尤其是当您计划在亚马逊设备上运行时。

    例如,按照教程https://firebase.google.com/docs/cloud-messaging/android/client#prevent-auto-init 中的Prevent auto initialization 步骤进行操作

    <meta-data
        android:name="firebase_messaging_auto_init_enabled"
        android:value="false" />
    <meta-data
        android:name="firebase_analytics_collection_enabled"
        android:value="false" /> 
    

    稍后从代码重新初始化 FCM:

    FirebaseMessaging.getInstance().isAutoInitEnabled = true
    

    【讨论】:

    • 这段代码不是在亚马逊设备上运行,而是在谷歌像素等普通安卓设备上运行。我正在尝试运行单元测试,它甚至不应该启动我可能负责初始化这些 Firebase 内容的常规应用程序类。
    • JVM 单元测试不在安卓设备上运行,而是在您的主机上运行。我认为您正在混合这 2 个。如果它是 android 测试 -> 在 android 设备上运行,则始终从清单创建应用程序。如果是 jvm 单元测试 -> 在主机上运行,​​则不会通过测试构造函数初始化任何内容。
    • 是的,术语有点混乱。我不是在做 JVM 单元测试,而是用 espresso 进行 UI 单元测试。您可以对 UI 进行两种测试,集成和单元测试。在单元测试(UI)中,我们隔离了屏幕和模拟网络以及任何其他依赖项。对于我们的 UI 测试,我们编写了一个自定义运行器,它为我们创建了 Application。
    • 我明白了,没有看到全貌我只能建议在FirebaseInitProvider.onCreate 上放置断点并调试它是否在您的测试运行期间执行。如果不是,那么 firebase 初始化确实不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多