测试不同的屏幕尺寸和窗口大小

测试是应用开发流程中不可或缺的一环。您通常需要在模拟器或设备上运行应用,以手动验证您的代码能否按预期运行。不过,手动测试非常耗时,容易出错,并且对于在各种尺寸的屏幕和设备上运行的应用来说,通常难以管理。手动测试的问题通常是由于使用单一设备进行开发造成的。因此,错误在不同类型的设备上可能会被忽略。

如需确定不同窗口和屏幕尺寸上的回归问题,请实现自动化测试,以验证应用的行为和外观在不同外形规格上是否一致。自动化测试可尽早发现问题,从而降低出现问题影响用户体验的风险。

要测试的内容

在开发针对不同屏幕尺寸和窗口大小的界面时,请特别注意以下两个方面:

  1. 组件和布局的视觉属性在不同尺寸的窗口中有何不同
  2. 状态在发生配置更改后如何保留

视觉属性

无论您是否针对不同的窗口大小自定义界面,都应验证界面能否正确显示。考虑较小、中等和扩展的宽度和高度。如需了解推荐的断点,请参阅窗口大小类别

图 1. Now In Android 中不同窗口大小的“为您推荐”屏幕

此外,当某个组件的大小受拉伸时,应用可能无法在设计系统中按预期渲染某些组件。

如果您的应用针对不同窗口大小采用自适应布局,那么您应设置自动化测试来防止出现回归。例如,修复手机上的外边距可能会导致平板电脑上的布局不一致。创建界面测试来验证布局和组件的行为,或构建屏幕截图测试来直观地验证布局。

状态恢复

与手机上的应用相比,在平板电脑等设备上运行的应用会更频繁地旋转和调整大小。此外,可折叠设备还引入了新的显示功能(如折叠和展开),这些功能可以触发配置更改。当这些配置发生更改时,您的应用需要能够恢复状态。然后,您还需要编写用于确认应用能否正确恢复状态的测试。

图 2. 可折叠设备折叠、平展、平展旋转到横向和半开(桌面模式)。

首先,测试应用在发生配置更改时不会崩溃。请确保应用中的每个界面都可以处理旋转、大小调整或折叠的任意组合。由于配置变更会默认重新创建 activity,因此会由于假设 activity 持久性而发生一些崩溃。

您可以通过多种方式测试配置变更,但在大多数情况下,可以通过以下两种方式进行测试:

  • 在 Compose 中,使用 StateRestorationTester 可以高效地模拟配置更改,而无需重启 activity。如需了解详情,请参阅以下部分。
  • 在任何界面测试(例如 Espresso 或 Compose)中,都可以通过调用 Activity.recreate() 来模拟配置更改。

您通常不必使用不同的设备来测试状态恢复,以响应配置变更。这是因为所有重新创建 activity 的配置变更都会产生类似的影响。不过,某些配置变更可能会在特定设备上触发不同的状态恢复机制。

例如,如果用户在打开的可折叠设备上查看“列表-详情”界面,并且他们折叠设备以切换到前显示屏,该界面通常会切换到详情页面。自动化测试应涵盖界面状态(包括导航状态)的恢复过程。

如需测试设备从一个显示屏到另一个显示屏或进入多窗口模式的设备上发生的配置更改,您有以下几种选择:

  • 在测试期间使用任何设备调整屏幕大小。在大多数情况下,这会触发您需要验证的所有状态恢复机制。但是,此测试不适用于检测可折叠设备中特定折叠状态的逻辑,因为折叠状态更改不会触发配置更改。
  • 使用支持您要测试的功能的设备或模拟器,触发相关配置更改。例如,您可以使用 Espresso 设备来控制可折叠设备或平板电脑,使其从折叠状态切换到横向展开状态。有关示例,请参阅用于测试不同屏幕尺寸的库和工具Espresso 设备部分。
图 3. 设备折叠和展开。

针对不同屏幕尺寸和窗口大小的测试类型

针对每个用例使用适当类型的测试,以验证测试在不同外形规格的设备上是否正常运行:

  • 界面行为测试会启动应用界面的某些部分,例如 activity 的显示。这些测试会验证某些元素是否存在或是否具有特定属性。这些测试可以选择执行模拟的用户操作。对于视图,请使用 Espresso。Jetpack Compose 有自己的测试 API。界面行为测试可以是插桩测试本地测试。插桩测试在设备或模拟器上运行,而本地界面测试在 JVM 上的 Robolectric 上运行。

    使用界面行为测试来验证应用的导航实现是否正确。这些测试用于执行点击和滑动等操作。界面行为测试还会检查某些元素或属性是否存在。如需了解详情,请参阅自动化界面测试

  • 屏幕截图测试会截取界面或组件的屏幕截图,并将该图片与之前批准的屏幕截图进行比较。这种方法可以非常有效地防止性能下降,因为一张屏幕截图就可以覆盖大量元素及其视觉属性。您可以在 JVM 或设备上运行屏幕截图测试。有多个屏幕截图测试框架可供使用。

最后,您可能需要进行单元测试,以便测试因设备类型或窗口大小而表现出不同行为的逻辑单元的功能,但单元测试在这方面并不常见。

后续步骤

如需详细了解如何实现本文档中包含的检查,请参阅库和工具