gpt4 book ai didi

使用 Espresso + MockK 的 Android UI 测试在模拟器上使用 SIGSEGV 崩溃,在物理设备上很好

转载 作者:行者123 更新时间:2023-12-02 11:19:48 28 4
gpt4 key购买 nike

我刚开始使用模拟K 在基于 MVP 的应用程序中模拟所有存储库/服务逻辑以进行 UI 测试。
我有一些运行登录 Activity 的 UI 测试,其中 Espresso 输入登录名和密码并使用 MockK 我可以伪造登录失败与否的各种情况。
所有服务和存储库都是标准 Kotlin 对象,所以我使用 mockkobjectevery/coEvery覆盖和处理登录请求和任务。
在我的物理设备上,测试完全没有问题,但是当我尝试在运行带有推荐图像的 Android P+ 的模拟器上运行它们时,它们会在随机时间不断崩溃。在极少数情况下,他们可以存活足够长的时间来工作。
查看日志,我得到了各种 SIGSEGV:

A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid 10425 (e.android.debug), pid 10425 (e.android.debug)


A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xc in tid 10968 (HeapTaskDaemon), pid 10957 (e.android.debug)


A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid 15050 (firebase-instal), pid 14972 (e.android.debug)


A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xd in tid 8902 (Measurement Wor), pid 8858 (e.android.debug)


A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid 22004 (Binder:21832_5), pid 21832 (e.android.debug)



但更深入地研究日志,我相信我找到了罪魁祸首:

InputDispatcher: channel '9fa7335 my.company.com.android.debug/my.company.com.ui.login.LoginActivity(server)' ~ Channel is unrecoverably broken and will be disposed!


寻找解决方案,这似乎可能是由于内存泄漏而发生的?
无论如何,我确保在 @Before 中启动正在测试的 Activity 。在我清除此类模拟并在 @After 中验证时发生所有模拟的方法方法。
显然,我相信测试确实可以正常工作,但 Espresso 或所有发生的 mock 一定有问题......
[编辑 1]
进一步查看之前的日志,这可能是内存泄漏的原因:

ActivityThread: Service com.google.android.gms.autofill.service.AutofillService has leaked IntentReceiver com.google.android.gms.autofill.smsretriever.TracingSmsBroadcastReceiver@ce00658 that was originally registered here. Are you missing a call to unregisterReceiver()?android.app.IntentReceiverLeaked: Service com.google.android.gms.autofill.service.AutofillService has leaked IntentReceiver com.google.android.gms.autofill.smsretriever.TracingSmsBroadcastReceiver@ce00658 that was originally registered here. Are you missing a call to unregisterReceiver()?


我在我的模拟器上禁用了 AutoFillService(在相关设置部分中设置为 none)。这似乎在一开始提高了我的测试成功率,但在几次运行后它们一直在崩溃。
不过,现在日志不再显示此泄漏。
[编辑 2]
显然,这个问题可能与 MockK 有关,因为我能够检索更多日志:
2020-07-24 11:57:15.955 15767-15780/com.my.company.android.debug A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid 15780 (HeapTaskDaemon), pid 15767 (e.android.debug)
2020-07-24 11:57:15.997 15962-15962/? E/crash_dump32: failed to detach from thread 15773: No such process
2020-07-24 11:57:15.997 15962-15962/? E/crash_dump32: failed to detach from thread 15778: No such process
2020-07-24 11:57:15.997 15962-15962/? E/crash_dump32: failed to detach from thread 15779: No such process
2020-07-24 11:57:15.997 15962-15962/? E/crash_dump32: failed to detach from thread 15780: No such process

// 20 more times of exact same line //

2020-07-24 11:57:16.007 15962-15962/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2020-07-24 11:57:16.007 15962-15962/? A/DEBUG: Build fingerprint: 'google/sdk_gphone_x86/generic_x86:10/QSR1.190920.001/5891938:user/release-keys'
2020-07-24 11:57:16.007 15962-15962/? A/DEBUG: Revision: '0'
2020-07-24 11:57:16.007 15962-15962/? A/DEBUG: ABI: 'x86'
2020-07-24 11:57:16.008 15962-15962/? A/DEBUG: Timestamp: 2020-07-24 09:57:16+0000
2020-07-24 11:57:16.008 15962-15962/? A/DEBUG: pid: 15767, tid: 15780, name: HeapTaskDaemon >>> com.my.company.android.debug <<<
2020-07-24 11:57:16.008 15962-15962/? A/DEBUG: uid: 10136
2020-07-24 11:57:16.008 15962-15962/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
2020-07-24 11:57:16.008 15962-15962/? A/DEBUG: Cause: null pointer dereference
2020-07-24 11:57:16.008 15962-15962/? A/DEBUG: eax 00000000 ebx ef8a6c34 ecx 00000000 edx f310b604
2020-07-24 11:57:16.008 15962-15962/? A/DEBUG: edi f3200380 esi 00000000
2020-07-24 11:57:16.008 15962-15962/? A/DEBUG: ebp e659d9a8 esp e659d940 eip ef7d89f4
2020-07-24 11:57:16.027 2044-2135/? E/InputDispatcher: channel '342ebda com.my.company.android.debug/com.my.compan.android.ui.error.LoginActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
经过进一步调查,Android Test Github repo 上有一个存在 1 年的 issue 显示了同样的问题(但 issue 现已关闭): https://github.com/android/android-test/issues/352
Mockk 的相关问题在此处打开: https://github.com/mockk/mockk/issues/466
[编辑 3]
我正在探索返回 Mockito 的替代方法有更多的历史和更积极的发展。这花了一些时间,但我没有将我的 UI 测试迁移到 Mockito 的重大问题。
结果:好吧,起初崩溃完全消失了。我可以毫不费力地进行 10、20、30 次测试。至少在手机上。
然而,在 Android TV(仍然有模拟器)上,崩溃很快再次出现。然后在移动设备上也是如此,但来自 InputDispatcher 的可怕消息的频率要低得多。 .
在设置迁移到 Mockito 时,我注意到 Mockk 在模拟 Android 测试仪器时与 Mockito 共享相同的限制和依赖项。我面临同样的问题和同样的困难。
所以这让我相信他们都不是罪魁祸首,但很可能是 Android Instrumentation API。
我还注意到手动重启模拟器大大改善了这种情况。

最佳答案

这是在我的堆栈跟踪中:

  W  Unexpected CPU variant for X86 using defaults: x86
ActivityThread W Package uses different ABI(s) than its instrumentation:
切换到 64 位模拟器解决了这个问题。

关于使用 Espresso + MockK 的 Android UI 测试在模拟器上使用 SIGSEGV 崩溃,在物理设备上很好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63059986/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com