原文地址:https://developer.android.com/training/testing/fundamentals.html

用户在不同的级别上与你的应用产生交互。从按下按钮到将信息下载到他们的设备上,因此,你应该在迭代开发应用程序时测试各种用例和交互。

使用迭代开发工作流

当你的应用程序进行扩展时,你可能会发现需要从服务器获取数据,与设备的传感器进行交互,可以还需要访问本地存储,或呈现复杂的用户界面。应用程序的多样性需要一个全面的测试策略。

在迭代开发一个新的特性时,首先需要编写一个新的测试,或者在现有单元测试中添加新的测试例和断言。测试一开始是失败的,因为这个新特性还没有实现。

在设计新功能时,考虑单元测试的设计很重要。对于每个功能单元编写一个相应的单元测试。你的单元测试应该尽可多的涵盖到所有可能与单元的交互,包括标准的交互、无效的输入、以及资源不可用的情况。

图:测试驱动开发:两个周期与迭代过程。

完整的工作流,如上图,包含一系列嵌套的循环迭代。其中长、慢、UI驱动的集成测试,你可以用更短、更快的单元测试驱动开发周期来完成。这一系列循环一直持续到你的应用程序满足每个用例为止。

测试金字塔

图:测试金字塔,显示应该在应用程序的测试套件中包含的三个测试类别。

测试金字塔,如上图所示,说明你的应用程序应该如何包括三种类型的测试:小测试、中测试和大测试。

  • 小测试是你可以在与生产系统隔离的情况下运行的单元测试。它们通常会mock所有主要组件,并在PC上快速运行。

  • 中测试是介于小测试和大测试之间的集成测试。它们集成了几个组件,并在Android模拟器或真实设备上运行。

  • 大测试是通过完成UI工作流来运行的集成和UI测试。它们确保关键的终端用户任务在Android模拟器或真实设备上正常工作。

注:这里测试金字塔的定义是Google针对Android应用的测试划分。不同类型的应用,通过测试金字塔模型进行划层级的划分,以及每层的定义会有所不同。

尽管小测试的速度很快,而且重点突出,可以让您快速处理失败,但它们是低保真和独立的,让你很难相信通过测试的应用是可以正常运行的,所以需要通过大测试进行补足。

由于每个测试类别的不同特性,你的测试工作应该包含测试金字塔的每一层测试。尽管每个类别的测试比例可能因应用程序的使用情况而有所不同,但我们通常建议以下分类:70%的小测试、20%的中等测试和10%的大测试。

小测试

在添加和更改应用程序的功能时,通过创建和编写单元测试来确保这些功能按照预期的来运行。虽然可以在Android模拟器或真实设备中运行单元测试,但是在开发环境中运行单元测试通常会更快、更容易,根据需要添加Stub或mock方法实现与Android系统进行交互。

Robolectric

如果你的应用程序的测试环境要求单元测试与Android框架进行更广泛的交互,那么你可以使用Robolectric。此工具执行测试友好、基于Java 逻辑Stub来模拟Android框架,由社区来维护这些Stub。

Robolectric测试几乎完全符合Android设备上运行测试的完全保真度,但仍比设备测试运行得更快。它还支持Android平台的以下几个方面:

  • Android 4.1(API等级16)及更高版本
  • Android Gradle插件2.4及更高版本
  • 组件生命周期
  • 事件循环
  • 所有资源

Robolectric有自己的一套测试API,并引入了一些新概念。有关将Robolectric的API与应用程序的测试相结合的更多信息,请参见该工具的 用户指南

Mock对象

你可以通过修改Android.jar版本来运行单元测试,从而来监控应用与之交互的Android框架元素。这个JAR文件不包含任何代码,所以你的应用程序调用Android框架默认会抛出异常。 要测试与Android系统交互的代码元素,请使用像Mockito这样的框架来配置模拟对象。

检测单元测试

你也可以在Andorid模拟器或真实设备上运行检测单元测试,而不涉及任何stub或mock框架。因为这种测试形式的执行时间明显比本地单元测试慢,所以最好仅在需要评估应用程序对当前设备硬件的行为时才依赖此方法。

中测试

在开发环境中测试了应用程序的每个单元之后,应验证在模拟器或设备上运行时组件的行为是否正确。 中等测试允许您完成这部分的开发过程。 如果某些应用程序的组件依赖于物理硬件,则这些测试对于创建和运行尤其重要。

中等测试你的应用程序如何协调多个单元,但它们不测试完整的应用程序。中等测试的用例包括服务测试、集成测试以及mock外部依赖性行为的UI测试。

通常情况下,最好在Android模拟器或Firebase测试实验室等基于云服务上测试应用程序,而不是在真实设备上测试应用程序,因为你可以更轻松,快速地测试多种屏幕大小和硬件配置组合。

大测试

尽管测试应用程序中的每一层的功能是非常重要的,但是测试涉及整个堆栈的常见工作流和用例(从UI到业务逻辑到数据层)同样重要。

如果您的应用程序足够小,则可能只需要一套大型测试来评估你的应用程序。 否则,你应该根据团队所有权,垂直功能或用户目标来划分你的大型测试套件。

对于你所编写的每一个大型的基于工作流程的测试,你还应该编写中测试来检查工作流中包含的每个UI组件的功能。通过这种方式,即使在最初的几个步骤中,相应的大型测试也会失败了,你的测试套件仍然可以在关键用户操作的每一步中继续识别潜在的问题。

AndroidJUnitRunner类定义了一个基于JUnit框架的测试运行器,它允许你在Android设备上运行JUnit 3或JUnit 4样式的测试类。便于将测试包和应用程序加载到真实设备或Android模拟器上,运行测试并报告结果。

AndroidJUnitRunner类支持来自Android测试支持库的以下工具和框架:

JUnit4 Rules

测试说明语言包括用于管理的关键应用程序组件的生命周期涉及你的测试代码,如Activitie 和Service。学习如何定义这些规则,看到 JUnit4规则指南

Espresso

Espresso同步异步任务,同时自动执行以下应用内交互:

在View对象上执行操作。

  • 完成跨越应用程序进程边界的工作流程。仅在Android 8.0(API级别26)及更高版本上可用。
  • 评估具有辅助功能需求的用户如何使用你的应用。
  • 查找并激活RecyclerView和AdapterView对象中的项目。
  • 验证传出意图的状态。
  • 在WebView对象中验证DOM的结构。
  • 跟踪你的应用程序中长时间运行的后台操作。

要详细了解这些互动以及如何在应用程序的测试中使用它们,请参阅 Espresso指南

UI Automator

我们建议仅当你的应用程序必须与系统进行交互的操作时,才使用UI Automator来测试你的应用程序。 由于UI Automator与系统应用程序UI交互,因此你需要在每次系统更新后重新运行并修复UI Automator测试。 此类更新包括Android平台版本升级和Google Play服务的新版本。
作为使用UI Automator的替代方案,我们建议添加封闭测试或将大型测试分为一系列小型和中型测试。特别是,一次侧重于测试一个应用程序间通信,例如将信息发送到其他应用程序,并对意图结果进行响应。Espresso-Intents工具可以帮助您编写这些较小的测试。

UI Automator框架在你的应用程序的系统应用程序内执行交互,例如检查当前显示UI的层次结构、截取屏幕截图以及分析设备的当前状态。有关UI Automator如何检查正在测试的应用程序的更多详细信息,请参阅 UI Automator指南

Android Test Orchestrator

Android Test Orchestrator在其自己的Instrumentation沙箱中运行每个UI测试,通过减少测试之间的共享状态并在每个测试的基础上隔离应用程序崩溃来提高测试套件的可靠性。

Android测试(二):Android测试基础的更多相关文章

  1. AngularJS测试二 jasmine测试路由 控制器 过滤器 事件 服务

    测试应用 1.测试路由 我们需要检测路由是否在运作,是否找到了,或者是404了.我们要确认路由事件触发了,预期的模板是否真的加载了.既然路由会改变页面的地址(URL)和页面内容,我们需要检测路由是否被 ...

  2. 【转】学习使用Jmeter做压力测试(二)--压力测试的实施

    JMeter测试步骤: 1.建立测试计划 2.添加线程组 3.添加HTTP请求 4.增加监听器 5.执行测试计划 6.根据JMeter提供的报告分析结果 一.目标 测试访问目标服务器网站首页的每秒查询 ...

  3. Android入门(二):Android工程目录结构

    首先我们来看看Android工程的目录结构,如下图: 下面我们来看看每个文件夹都是用来做什么的? 1.src:这个不用多说,它就是保存Java源文件的目录: 2.gen:该文件夹用来保存自动生成的R. ...

  4. Android APP压力测试(二)之Monkey信息自动收集脚本

      Android APP压力测试(二) 之Monkey信息自动收集脚本 前言: 上一篇Monkey介绍基本搬抄官方介绍,主要是为了自己查阅方便.本文重点介绍我在进行Monkey时如何自动收集相关信息 ...

  5. 3. 移动安全渗透测试-(Android基础漏洞)

    3.1 数据存储漏洞 用户经常会把敏感数据交给app,比如:用户名and密码认证令牌联系人记录通信记录历史使用记录..... 只要愿意,app可以收集这些用户的隐私和个人信息明文存储或明文传输,通常保 ...

  6. Android Testing学习01 介绍 测试测什么 测试的类型

    Android Testing学习01 介绍 测试测什么 测试的类型 Android 测试 测什么 1.Activity的生命周期事件 应该测试Activity的生命周期事件处理. 如果你的Activ ...

  7. 《大话移动APP测试:Android与iOS应用测试指南》

    <大话移动app测试:android与ios应用测试指南> 基本信息 作者: 陈晔 出版社:清华大学出版社 ISBN:9787302368793 上架时间:2014-7-7 出版日期:20 ...

  8. Android开发2——创建测试项目

    一.创建普通Android项目   二.在AndroidManifest.xml添加两个配置 <?xml version="1.0" encoding="utf-8 ...

  9. Android蓝牙连接自动测试工具

    蓝牙连接自动测试工具 1.需求产生 开发不按着需求走都是耍流氓且浪费时间.此工具的需求产生是研发人员在开发产品时涉及到蓝牙驱动和安卓蓝牙两个东西.但是呢,蓝牙不太稳定,那么工作来了.就需要研发人员一边 ...

  10. I.MX6 Android CAN 命令行测试

    /********************************************************************* * I.MX6 Android CAN 命令行测试 * 说 ...

随机推荐

  1. POJ1201 Intervals(差分约束)

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 28416   Accepted: 10966 Description You ...

  2. Android为TV端助力 handler传递消息机制

    当工作线程给主线程发送消息时,因为主线程是有looper的,所以不需要初始化looper,注意给谁发消息就关联谁的handler,此时用的就是主线程的handler handler会把消息发送到Mes ...

  3. OkHttp的封装和使用详解

    Github地址 compile 'cn.yuan.yu:library:1.0.2' 第一步:初始化我们的工具类 public class MyApplication extends Applica ...

  4. .net webapi 后台导出excel 申请付款单实例

    [HttpGet, AllowAnonymous] public void ExportSettlementPrint(string code) { FinSettlementModel settle ...

  5. JS的判断字符/元素是否存在数组列表

    python有in操作, 可以很方便的用于判断元素是否存在指定列表. JS的in操作是对象, 用于判断指定的属性在指定对象中是否存在. propNameOrNumber in objectName i ...

  6. 【PHPStorm使用手册】php interpreter is not configured

    php interpreter is not configured 未配置php解析器 第一步: 引入下载好的php.exe 打开窗口 file -> settings -> Langua ...

  7. 分组统计SQL

    Itpub上遇到一个求助写SQL的帖子,感觉很有意思,于是写出来看看,要求如下: 有个计划表1, 记录物料的年度计划量 有个实际使用情况表2,记录实际使用情况. 最后要出个统计表,把计划和实际的数据结 ...

  8. c/c++ 标准顺序容器 容器的访问,删除 操作

    c/c++ 标准顺序容器 容器的访问,删除 操作 pop_front:vector,string不支持 pop_back:forward_list不支持 知识点 1,front, back, at 成 ...

  9. ugui SetParent在安卓上一个诡异bug

    问题描述 我的环境:Unity3D 5.3.7 出问题机型:安卓模拟器.部分低配安卓机型(比如:红米2A) 以下代码是设置某个节点的父节点,在PC.Editor.大部分手机上都是正常的,但问题机型上, ...

  10. 介绍一个比较了各种浏览器对于HTML5 等标准支持程度的网站

    可以选择浏览器种类,版本,比较的功能 网站地址:https://caniuse.com/#comparison