为什么进行Android测试?
Android是世界上最大的操作系统。应用程序必须与大量的设备和Android版本兼容。

在设计和实现上投入多少时间并不重要,错误是不可避免的,错误也会出现。

在本教程中,将了解-
- 为什么进行Android测试?
- Android测试策略
- 单元测试
-
集成测试
- 系统测试
- 自动Android测试
- Android测试框架
- Robolectric测试框架
- Android测试的思考
- Android测试的最佳实践
Android测试策略
正确的Android测试策略应该包括以下内容
- 单元测试
- 集成测试
- 操作测试
- 系统测试

单元测试
单元测试包括由一个或多个程序组成的集合,这些程序旨在验证源代码的原子单元,如方法或类。
Android平台预集成了Junit 3.0框架。它是用于自动化单元测试的开源框架。Android测试框架是开发人员编写有效单元测试程序的有力工具。

Android与JUnit框架的集成
对单元测试的补充是用户界面(UI)测试。这些UI测试确保应用程序返回正确的UI输出,以响应设备上的用户操作序列。

应用程序上的常见用户UI操作
在设备上执行UI测试的常见方式是Android Instrumentation。但这有性能问题,在Android上进行UI测试的最佳工具之一是Robotium。
集成测试
在集成测试中,对所有单元测试模块进行组合和验证。在Android中,集成测试通常涉及检查与Android组件的集成,如服务测试、活动测试、内容提供商测试等

Android集成测试类型
目前已经有很多测试框架用于对Android进行集成测试,如Troyd、Robolectric、Robotium等。
可操作的测试
- 操作也称为功能测试或接受测试。它们是高级测试,旨在检查应用程序的完整性和正确性。
- 在Android中,FitNesse是一个开源框架,可以方便地对目标应用进行操作测试。
系统测试
在系统测试中,对系统进行整体测试,检查组件、软件和硬件之间的交互情况。
在Android中,系统测试通常包括
- GUI测试
- 可用性测试
- 性能测试
- 压力测试
在上面的列表中,性能测试得到了更多的关注。可以使用Traceview等工具对Android进行性能测试,该工具可以帮助调试应用程序并评测其性能。
Android自动化测试
由于Android是碎片化的,在众多设备上进行测试是必要的。自动化Android测试有助于降低成本
自动化Android测试的优势
- 减少执行测试用例的时间
- 提高开发过程的生产力
- 及早发现缺陷,节省软件维护成本
- 快速找到并修复实现中的错误
- 确保软件质量
我们将研究以下两个框架
- Android测试框架
- Robolectric测试框架
Android测试框架
Android测试框架是Android应用测试的标准框架之一。它是一个功能强大且易于使用的测试框架,与Android SDK工具很好地集成在一起。

Android测试框架架构
- 应用程序包是需要测试的目标应用程序
-
InstrumentationTestRunner是在目标应用程序上执行测试用例的测试用例运行器。它包括: 2A) 测试工具:用于构建测试的SDK工具。它们集成在Eclipse IDE中或作为命令行运行。 2b) MonkeyRunner:提供API的工具,用于编写在Android代码之外控制Android设备或仿真器的程序。
-
测试包被组织到测试项目中。如果被测应用的包名为“com.mydomain.myapp”,则测试包应为“com.mydomain.myapp.test”。测试包包含2个对象,如上所示: 3a)测试用例类:包括要在目标应用程序上执行的测试方法。 3b)模拟对象:包括将用作测试用例的样本输入的模拟数据。
Android测试用例类

AndroidTestCase类图
- TestCase包括运行JUnit测试的JUnit方法
- TestSuite用于运行一组测试用例
- InstrumentationTestSuite是一个TestSuite,它在运行InstrumentationTestCase之前将Instrumentation注入到InstrumentationTestCase中。
- InstrumentationTestRunner是在目标应用程序上执行测试用例的测试用例运行器。
- AndroidTestCase扩展了JUnit TestCase。它包含用于访问活动上下文等资源的方法。
- ApplicationTestCase验证受控环境中的应用程序类。
- InstrumentationTestCase验证目标应用程序的特定功能或行为,例如验证应用程序的UI输出。
- ActivityTestCase是支持测试Application活动的基类。
- ProviderTestCase是用于测试单个ContentProvider的类。
- ServiceTestCase用于测试环境中的服务类。它还支持服务的生命周期。
- SingeLauchActivityTestCase用于通过InstrumentationTestCase测试单个活动。
-
ActivityUnitTestCase
用于测试单个孤立的Activity。 -
ActivityInstrumentationTestCase2
扩展了JUnit TestCase类。使用此类,可以访问应用程序的GUI组件,并将UI事件(击键或触摸事件)发送到UI。
下面是ActivityInstrumentationTestCase的示例。验证计算器应用程序的UI操作,检查UI输出的正确性。

ActivityInstrumentationTestCase2测试示例
Robolectric测试框架
使用Android测试框架通过设备或仿真器进行测试很困难。要解决这个问题,还有另一个选择-Robolectric测试框架。
Robolectric框架允许直接在JVM上运行Android测试,而不需要设备或仿真器。

Robolectric的先进特性
Robolectric测试用例类

ROBOLECRICE的操作
- 如上所示,Robolectric可以执行以下操作:
- 注册并创建阴影类
- 拦截Android类的加载
- 使用JavaAssist重写Android类的方法体
- 将阴影对象绑定到Android类
- 这允许在没有Android环境的情况下执行测试中的代码。
其他测试框架
除了上面提到的测试框架外,还有许多其他测试框架,例如:
- Android Junit Report,一个用于Android的自定义工具测试运行器,它生成XML报告以便与其他工具集成。
- 快递服务
- Appium应用程序
Android测试的迷思
许多企业开发基于常见误解的Android测试策略。本节研究Android测试的几个流行的神话和现实。
误区1:所有安卓设备都是一样的在仿真器上进行测试就足够了
让我们从一个简单的例子开始。应用程序在仿真器上可以很好地工作,但在某些实际设备上,它在执行过程中会崩溃。

在真实设备上执行期间应用程序崩溃
仿真器不足以进行移动测试。必须在真实设备上测试应用程序。
误区2:在一些常见设备上进行测试就足够了
- 在不同的设备上,应用程序看起来不同,因为不同的设备具有不同的硬件、屏幕大小、内存等。必须在不同的设备、操作系统版本、运营商网络和位置上测试应用程序。
误区3:发布前的试探性测试就足够了
- 通常在所有的测试中,我们设计测试用例,然后执行它们。但是在探索性测试中,测试设计和执行都将一起完成。
- 在探索性测试中,没有计划,没有准备,测试人员会做他想做的测试。有些功能会重复测试,而有些功能则不会全部测试。
误区4:如果应用程序中有一些错误,用户会理解的
- 如果应用程序无法运行并有错误,用户可以卸载应用程序
- 质量问题是应用商店评论不佳的第一个原因。这会影响声誉,会失去客户的信任。
因此,有一个合适的Android测试策略是至关重要的
Android测试的最佳实践
- 应用程序开发人员应该在编写代码的同时创建测试用例
- 所有测试用例都应该与源代码一起存储在版本控制中
- 使用持续集成,并在每次更改代码时运行测试
- 避免使用模拟器和根设备