Skip to main content

Android 集成测试

为什么要进行集成测试?

单元测试 很好,并且应该是您编写测试时的主要选择。然而,集成测试确保应用程序在真实 Android 环境中的行为得到验证。集成测试通过模拟器在真实的 Android 操作系统上运行,使用最终用户将使用的相同 JVM。

在真实 JVM 上测试

在开发过程中,您可能只在最新的 Android 操作系统版本或您本地安装的 JVM 上进行测试,可能是 JDK 21。然而,请记住以下几点:

  • Android API 21 仅部分支持 Java 8 语言特性
  • Android 使用一个专用的 运行时,与您开发环境中使用的运行时不同(通常用于执行单元测试)。

具体示例

考虑 Jackson 库。从版本 2.14 开始,它要求至少 Android 版本为 26。遗憾的是,这个错误仅在运行时出现,这意味着捕获它的唯一方法是通过仪器测试或用户报告的崩溃。您可以在这个 PR 中看到这个问题的具体示例。

有 UI 还是没有 UI?

集成测试不总是涉及显示 UI。它们也用于测试 前台服务,在这些情况下,不显示 UI。在这些情况下,我们只验证数据和与系统的交互。

使用相应的 Home Assistant Core 版本进行测试

note

这些测试目前正在开发中

我们的目标是针对最新版本的 Home Assistant Core 运行集成测试。这确保当前代码与核心版本无缝协作。

在没有 Home Assistant Core 的情况下进行测试

我们的测试大多数不应依赖 Home Assistant Core,以避免引入额外的错误源。这些测试设计用于验证用户交互期间屏幕的行为。为此,我们使用 Espresso 框架。

在这种情况下,与核心的交互可以使用 mockk 的模拟进行替换,甚至更好,使用假对象来控制行为。

Android 模拟器的脆弱性

Android 模拟器 notoriously unreliable。偶尔,平台可能因未知原因而失败。唯一的解决方案是重新启动作业。请注意,只有维护者可以重新运行作业。

在 Android 5 (API 21) 上进行测试

如果您的测试需要 WebView,您可能需要遵循这些 Lollipop 模拟器的提示