android - 在 Firebase 上运行 Espresso 测试时出现 NoClassDefFoundError

标签 android firebase android-espresso android-multidex firebase-test-lab

我有一套仪器测试,旨在使用 Firebase 测试实验室在 Android 4.4 到 8 的各种物理设备上运行。

我可以在任何操作系统版本以及 Firebase 测试实验室中的较新设备上本地成功运行这些测试,但是当我在 Firebase 测试实验室中运行 4.4 的设备(当前运行在 Moto X 和Galaxy S4 Mini),报告异常,即使个别测试用例都报告成功。这是我看到的异常:

java.lang.NoClassDefFoundError: org.junit.internal.TextListener FATAL EXCEPTION: Instr: android.support.test.runner.AndroidJUnitRunner Process: today.onedrop.android.debug, PID: 5579 java.lang.NoClassDefFoundError: org.junit.internal.TextListener
    at android.support.test.internal.runner.listener.InstrumentationResultPrinter.instrumentationRunFinished(InstrumentationResultPrinter.java:221)
    at android.support.test.internal.runner.TestExecutor.reportRunEnded(TestExecutor.java:92)
    at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:67)  
    at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:375)  
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1792)

我怀疑 Firebase 实际上不是一个因素,如果我在本地测试 Moto X 或 Galaxy S4 Mini,这些测试也会以同样的方式失败。不幸的是,我无法检验该理论。

在更新我的 Espresso 测试以使用 TestOrchestrator 之后,我也开始在 Android 4.4 本地 AVD 上收到 NoClassDefFoundError。虽然它与上面的不一样:

FATAL EXCEPTION: Instr: android.support.test.runner.AndroidJUnitRunner
Process: today.onedrop.android.debug, PID: 15683
java.lang.NoClassDefFoundError: org.junit.runner.Request
    at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:353)
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701)

在 Firebase 上使用 TestOrchestrator 也会产生新错误而不是旧错误。任何人都可以猜测它们是否具有相同的根本原因,但它们的相似性显然值得怀疑。

更新 #2

@MartinZeitler 关于 MultiDex 的直觉似乎是正确的。我通过将缺少的类添加到 multidex keep file 中解决了 第二个 NoClassDefFoundError 这两个问题在我的 gradle 配置中:

multiDexKeepFile file('multidex-config.txt')

multidex-config.txt:

org/junit/runner/Request.class
org/junit/internal/TextListener.class

看来 4.4 上的 multidex 需要一些帮助。或者这可能只是一个 hack,只会导致其他缺失类的随机崩溃。 无论如何,一切都恢复正常了!

最佳答案

您是否向 jUnit 添加了依赖项?即使在较旧版本的 Android 上,该库类也应该是已知的...导致假设您可能还需要在 build.gradle 中设置 multiDexEnabled true,当为 Android < API 22 构建(所有后来的 API 默认启用)。

dependencies {
    testImplementation 'junit:junit:4.12'
}

gcloud firebase test android models list 列出设备...

┌───────────────────┬──────────┬─────────────────────────────────────┬──────────┬─────────────┬────────────────┬────────────┐
│      MODEL_ID     │   MAKE   │              MODEL_NAME             │   FORM   │  RESOLUTION │ OS_VERSION_IDS │    TAGS    │
├───────────────────┼──────────┼─────────────────────────────────────┼──────────┼─────────────┼────────────────┼────────────┤
│ serranolte        │ Samsung  │ Galaxy S4 mini                      │ PHYSICAL │  960 x 540  │ 19             │            │
│ victara           │ Motorola │ Moto X                              │ PHYSICAL │ 1920 x 1080 │ 19             │            │
└───────────────────┴──────────┴─────────────────────────────────────┴──────────┴─────────────┴────────────────┴────────────┘

gcloud firebase 测试 android 模型描述 serranolte

brand: Samsung
codename: serranolte
form: PHYSICAL
supportedVersionIds:
- '19'

gcloud firebase 测试 android 模型描述 victara

brand: Motorola
codename: victara
form: PHYSICAL
supportedVersionIds:
- '19'

都是硬件设备。

关于android - 在 Firebase 上运行 Espresso 测试时出现 NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48312324/

相关文章:

android - 如何在 Android NDK 项目中使用预编译头文件?

java - 无法以编程方式清除缓存内存 Android

java - Listview 不再向其中的 spinner 注册 itemClickEvent

firebase - 使用 FirebaseAuth 实现重置密码并重定向到我自己的自定义页面以在 Flutter 中重置密码

android-actionbar - Espresso - 如何匹配 ActionBar 的可见性?

android - 为什么他们的参数是 View 类型的 onClick 方法

java - Firebase:60 秒后删除数据

android - 获取当前用户详细信息,即登录 firebase 的用户

android - Espresso 如何等待一段时间(1 小时)?

unicode - 无法在 Espresso 中输入 Unicode 字符