本部分介绍如何使用 AndroidX Test 的元素来进一步优化应用的测试。
#1. 使用 Truth 创建更容易读懂的断言
Guava 团队提供了一个名为 Truth 的流利断言库。在构建测试的验证步骤(或 then 步骤)时,您可以使用此库来代替基于 JUnit 或 Hamcrest 的断言。
通常,您可以使用 Truth 来表达某个对象具有特定属性,使用的短语包含您要测试的条件,例如:
assertThat(object).hasFlags(FLAGS)
assertThat(object).doesNotHaveFlags(FLAGS)
assertThat(intent).hasData(URI)
assertThat(extras).string(string_key).equals(EXPECTED)
AndroidX Test 支持 Android 的其他几个主题,以使基于 Truth 的断言更易于构建:
- BundleSubject
- IntentSubject
- MotionEventSubject
- NotificationActionSubject
- NotificationSubject
- PendingIntentSubject
- PointerCoordsSubject
- PointerPropertiesSubject
AndroidX Test API 可帮助您执行与移动应用测试相关的常见任务,下面几部分将对此进行介绍。
#2. 编写界面测试
Espresso 可让您以编程方式且以线程安全的方式找到应用中的界面元素并与之互动。要了解详情,请参阅 Espresso 指南。
#3. 运行界面测试
AndroidJUnitRunner 类定义了一个基于插桩的 JUnit 测试运行程序,可让您在 Android 设备上运行 JUnit 3 或 JUnit 4 型测试类。该测试运行程序可帮助您将测试软件包和被测应用加载到设备或模拟器上、运行测试并报告结果。
如需进一步提高这些测试的可靠性,请使用 Android Test Orchestrator,它在自己的 Instrumentation 沙盒中运行每个界面测试。这种架构减少了测试之间的共享状态,并在每个测试的基础上隔离了应用崩溃。如需详细了解 Android Test Orchestrator 在测试应用时提供的优势,请参阅 Android Test Orchestrator 指南。
#4. 与可见元素进行互动
通过 UI Automator API,您可以与设备上的可见元素进行互动,而不管获得焦点的是哪个 Activity 或 Fragment。
注意:我们建议只有在您的应用必须与系统界面或其他应用进行交互以完成关键用例时,才使用 UI Automator 测试您的应用。由于 UI Automator 与特定的系统界面进行互动,因此您必须在每次平台版本升级后以及在每次发布新版本的 Google Play 服务后重新运行并修复 UI Automator 测试。
作为使用 UI Automator 的替代方法,我们建议您添加封闭测试或将大型测试分成一套中小型测试。特别是,一次重点测试一段应用间通信,如向其他应用发送信息和响应 intent 结果。Espresso-Intents 工具可以帮助您编写这些较小的测试。
#5. 添加无障碍功能检查以验证普遍易用性
应用的界面应允许所有用户(包括具有无障碍功能需求的用户)与设备进行互动,并在应用中更轻松地完成任务。
为了帮助验证应用的无障碍功能,Android 测试库提供了几项内置功能,下面几部分将对此进行介绍。要详细了解如何验证应用对不同类型用户的易用性,请参阅关于测试应用的无障碍功能的指南。
# Robolectric
您可以通过在测试套件开头添加 @AccessibilityChecks 注释来启用无障碍功能检查,如以下代码段所示:
import org.robolectric.annotation.AccessibilityChecks
@AccessibilityChecks
class MyTestSuite {
// Your tests here.
}
# Espresso
您可以通过在测试套件的 setUp()
方法中调用 AccessibilityChecks.enable() 来启用无障碍功能检查,如以下代码段所示。
import androidx.test.espresso.accessibility.AccessibilityChecks
@Before
fun setUp() {
AccessibilityChecks.enable()
}
如需详细了解如何解读这些无障碍功能检查的结果,请参阅 Espresso 无障碍功能检查指南。
#6. 推动 Activity 和 Fragment 生命周期
您可以使用 ActivityScenario
和 FragmentScenario
类来测试应用的 Activity 和 Fragment 如何响应系统级中断和配置更改。如需了解详情,请参阅关于如何测试 Activity 和测试 Fragment 的指南。
注意:鉴于 Fragment 在设备特有的条件下工作,因此最好在插桩测试中使用
FragmentScenario
。
#7. 管理服务生命周期
AndroidX Test 包含用于管理关键服务的生命周期的代码。如需详细了解如何定义这些规则,请参阅 JUnit4 规则指南。
#8. 评估因 SDK 版本而异的所有行为变体
如果应用的行为取决于设备的 SDK 版本,请使用 @SdkSuppress 注释,并根据应用逻辑的分叉方式传入 minSdkVersion
或 maxSdkVersion
的值:
@Test
@SdkSuppress(maxSdkVersion = 27)
fun testButtonClickOnOreoAndLower() {
// ...
}
@Test
@SdkSuppress(minSdkVersion = 28)
fun testButtonClickOnPieAndHigher() {
// ...
}