# 关于在 Android 上添加测试并满足覆盖指标的事 测试是开发过程中不可或缺的一部分。通过持续对应用运行测试,您可以在公开发布应用之前验证其正确性、功能行为和易用性。 测试还会为您提供以下优势: * **快速获得故障反馈**。 * 在开发周期中**尽早进行故障检测**。 * **更安全的代码重构**,让您可以优化代码而不必担心回归。 * **稳定的开发速度**,帮助您最大限度地减轻技术负担。 以上摘自谷歌Android对于测试的描述。在我看来,测试是在开发过程中的一种持续性行为,尽量在开发过程中完成测试是最佳的实现方式,而在事后补全测试大可不必且费时费力。 ## 基础 测试可以在开发某个功能前先编写,然后在功能实现的过程中逐渐完善。在整个迭代过程中完成单元测试并包含所有可能的互动,如标准互动、无效输入以及资源不可用的情况。 ![与由测试驱动的迭代开发关联的两个周期](https://developer.android.google.cn/images/training/testing/testing-workflow.png) 在Android的项目下,包含了两个用于放置测试的目录: * `androidTest`目录应包含在真实或虚拟设备上运行的测试。此类测试包括集成测试、端到端测试,以及仅靠 JVM 无法完成应用功能验证的其他测试。 * `test` 目录应包含在本地计算机上运行的测试,如单元测试。 测试下的最佳实践场所是在模块化项目中,在模块下应用下推荐的最佳的测试比例为: **小型测试占 70%,中型测试占 20%,大型测试占 10%**,呈金字塔型。 ![测试金字塔](https://developer.android.google.cn/images/training/testing/pyramid_2x.png) 小型测试放入 `test` 目录中,用于集中测试每个类的功能和约定; 中型测试放入各个模块的 `androidTest` 中,从模块级别验证应用的行为,用于验证一组单元的协作和交互的集成测试; 大型测试放入主App的 `androidTest` 中,或者放入负责垂直领域重要模块的 `androidTest` 中,用于验证使用多个模块和功能的端到端工作流。 ## 脚手架 了解测试的基础后,可以开始在项目中搭建测试的基础框架,具体以*单元测试*,*模块测试*和*应用测试* 小中大的顺序逐个介绍。 > **测试必备库** > [Truth](https://truth.dev/) 断言库,用来判断测试结果是否与预设结果一致. ### 单元测试 单元测试通常以可重复的方式运用尽可能小的代码单元(可能是方法、类或组件)的功能。 若测试与多个 Android 框架依赖项互动,或以复杂的方式与这些依赖项互动,可以使用 AndroidX Test 提供的 Robolectric 工件。Robolectric 在本地 JVM 或真实设备上执行真实的 Android 框架代码和原生框架代码的虚假对象。 ```gradle testImplementation 'org.robolectric:robolectric:4.5.1' ``` ## 自动化框架