Android 应用测试教程与自动化框架

为何要进行 Android 测试?

Android 是世界上最大的操作系统。同时,Android 存在碎片化问题,有大量的设备和 Android 版本,您的应用必须与之兼容。

Android Testing

无论您在设计和实现上投入多少时间,错误都是不可避免的,bug 也会出现。

Android Testing

Android 测试策略

正确的 Android 测试策略应包括以下内容

  1. 单元测试
  2. 集成测试
  3. 操作测试
  4. 系统测试

Android Testing Strategy

单元测试

单元测试包含一组或多组程序,旨在验证源代码的原子单元,例如方法或类。

Android 平台预集成了 Junit 3.0 框架。它是一个用于自动化单元测试的开源框架。Android 测试框架是开发人员编写有效单元测试程序的强大工具。

Integration of Android and JUnit Framework
Android 与 JUnit 框架的集成

除了单元测试之外,还有用户界面 (UI) 测试。这些测试与目标应用程序的 UI 组件相关。UI 测试确保您的应用程序在响应设备上用户操作序列时返回正确的 UI 输出。

Common User UI Actions on Application
应用程序上的常见用户 UI 操作

在设备上执行 UI 测试的常见方法是 Android Instrumentation。但这存在性能问题。在 Android 上进行 UI 测试的最佳工具之一是 Robotium

集成测试

集成测试中,所有经过单元测试的模块都将组合并验证。在 Android 中,集成测试通常涉及检查与 Android 组件的集成,例如服务测试、活动测试、内容提供程序测试等。

Integration Tests
Android 上的集成测试类型

有许多测试框架用于对 Android 进行集成测试,例如 Troyd、Robolectric、Robotium。

操作测试

  • 操作测试也称为功能测试或验收测试。它们是高级测试,旨在检查应用程序的完整性和正确性。
  • 在 Android 中,FitNesse 是一个开源框架,可以轻松对目标应用程序进行操作测试。

系统测试

系统测试中,系统作为一个整体进行测试,并检查组件、软件和硬件之间的交互。

在 Android 中,系统测试通常包括

  • GUI 测试
  • 可用性测试
  • 性能测试
  • 压力测试

在以上列表中,性能测试受到更多关注。您可以使用 Traceview 等工具在 Android 上进行性能测试。此工具可以帮助您调试应用程序并分析其性能。

自动化 ANDROID 测试

由于 Android 存在碎片化,因此在众多设备上进行测试是必要的。但这也会让您花费金钱。自动化 Android 测试可以帮助降低成本

自动化 Android 测试的优点

  • 减少执行测试用例的时间
  • 提高开发过程的生产力
  • 早期发现 bug,节省软件维护成本
  • 快速发现并修复实现中的 bug
  • 确保软件质量

我们将研究以下 2 个框架

  • Android 测试框架
  • Robolectric 测试框架

Android 测试框架

Android 应用程序的标准测试框架之一是 Android 测试框架。它是一个功能强大且易于使用的测试框架,与 Android SDK 工具很好地集成。

Android Testing Framework
Android 测试框架架构
  1. 应用程序包是您需要测试的目标应用程序
  2. InstrumentationTestRunner 是在目标应用程序上执行测试用例的测试用例运行器。它包括

2a) 测试工具:用于构建测试的 SDK 工具。它们集成在 Eclipse IDE 中或作为命令行运行。

2b) MonkeyRunner:一个提供 API 的工具,用于编写程序,这些程序可以控制 Android 设备或模拟器,而无需 Android 代码。

  1. 测试包被组织成测试项目。此包遵循命名约定。如果被测应用程序的包名为“com.mydomain.myapp”,则测试包应为“com.mydomain.myapp.test”。测试包包括以下 2 个对象

3a) 测试用例类:包含在目标应用程序上执行的测试方法。

3b) 模拟对象:包含将用作测试用例样本输入的模拟数据。

Android 测试用例类

Android Test Case Classes
AndroidTestCase 类图
  1. TestCase 包含用于运行 JUnit 测试的 JUnit 方法
  2. TestSuite 用于运行一组测试用例
  3. InstrumentationTestSuite 是一个 TestSuite,它在运行 InstrumentationTestCase 之前将 Instrumentation 注入其中。
  4. InstrumentationTestRunner 是在目标应用程序上执行测试用例的测试用例运行器。
  5. AndroidTestCase 扩展了 JUnit TestCase。它包含用于访问 Activity Context 等资源的方法。
  6. ApplicationTestCase 在受控环境中验证 Application 类。
  7. InstrumentationTestCase 验证目标应用程序的特定功能或行为,例如,验证应用程序的 UI 输出。
  8. ActivityTestCase 是支持测试应用程序活动的基类。
  9. ProviderTestCase 是用于测试单个 ContentProvider 的类。
  10. ServiceTestCase 用于在测试环境中测试 Service 类。它还支持 Service 的生命周期。
  11. SingeLauchActivityTestCase 用于使用 InstrumentationTestCase 测试单个 Activity。
  12. ActivityUnitTestCase <Activity> 用于测试单个隔离活动。
  13. ActivityInstrumentationTestCase2<Activity> 扩展了 JUnit TestCase 类。它通过 instrumentation 将您连接到目标应用程序。使用此类,您可以访问应用程序的 GUI 组件并将 UI 事件(击键或触摸事件)发送到 UI。

下面是 ActivityInstrumentationTestCase 的一个示例。它验证计算器应用程序的 UI 操作,检查 UI 输出的正确性。

ActivityInstrumentationTestCase2 Testing
ActivityInstrumentationTestCase2 测试示例

Robolectric 测试框架

使用 Android 测试框架与设备或模拟器进行测试很困难。构建和运行测试很慢,并且需要大量的开发工作。为了解决这个问题,还有另一个选择——Robolectric 测试框架。

Robolectric 框架允许您直接在 JVM 上运行 Android 测试,无需设备或模拟器。

Advance Features of Robolectric
Robolectric 的高级功能

Robolectric 测试用例类

Operation of Robolectric
Robolectric 的操作
  • 如上所示,Robolectric 可以执行以下操作
  • 注册并创建 Shadow 类
  • 拦截 Android 类的加载
  • 使用 javaassist 覆盖 Android 类的方法体
  • 将 Shadow 对象绑定到 Android 类
  • 这使得被测代码可以在没有 Android 环境的情况下执行。

其他测试框架

除了上面提到的测试框架,还有许多其他测试框架,例如

Android 测试的误区

许多企业开发基于常见误解的 Android 测试策略。本节探讨了一些流行的 Android 测试误区和现实。

误区 #1:所有 Android 设备都一样……在模拟器上测试就足够了

让我们从一个简单的例子开始。一个应用程序在模拟器上运行完美,但在某些真实设备上,它在执行过程中崩溃

Application Crashes during Execution on Real Device
应用程序在真实设备上执行期间崩溃

模拟器不足以进行移动测试。您必须在真实设备上测试您的应用程序。

误区 #2:在一些常用设备上测试就足够了

  • 在不同的设备上,您的应用程序看起来不同,因为不同的设备具有不同的硬件、屏幕尺寸、内存等。您必须在不同的设备、操作系统版本、运营商网络和位置上测试您的应用程序。

误区 #3:发布前进行探索性测试就足够了

  • 通常在所有测试中,我们设计测试用例然后执行它们。但在探索性测试中,测试设计和执行将同时完成。
  • 在探索性测试中,没有计划也没有准备,然后测试人员会做他想做的测试。某些功能会重复测试,而某些功能根本不会被测试。

误区 #4:如果应用程序有一些 bug,用户会理解的

  • 如果应用程序无法正常工作并且有 bug,用户会卸载您的应用程序
  • 质量问题是 Google Play 差评的首要原因。它会影响您的声誉,您会失去客户的信任。

因此,制定适当的 Android 测试策略至关重要

Android 测试的最佳实践

  • 应用程序开发人员应在编写代码的同时创建测试用例
  • 所有测试用例应与源代码一起存储在版本控制中
  • 使用持续集成并在代码更改时运行测试
  • 避免使用模拟器和已 root 的设备