第 1 章 智能手机测试的基本知识

第 1 章 智能手机测试的基本知识

首先要建立测试策略

中川胜树 NAKAGAWA Masaki

DeNA 股份有限公司

GitHub masaki

Twitter @ikasam_a

译 / 刘卓

特辑简介

近些年,智能手机市场迅速发展,开发智能手机的本机应用程序和 Web 应用程序的需求也随之不断增加(在下文中,二者统称为智能手机应用程序)。

在针对智能手机开发应用程序的时候,由于现在市面上有 Android、iOS 等多种操作系统,因此要为每个操作系统都开发不同的版本。此外,由于应用程序类型也分为本机应用程序和 Web 应用程序等,在开发时也要根据需求来选择开发的种类。

如果开发时针对的是多操作系统,在测试时也必须将多操作系统的问题考虑在内。更要针对不同的应用程序类型,变换相应的测试方法和框架。总之,需要考虑的事情有很多,而且很复杂。

此外,虽然有些智能手机的应用程序是在本机中单独运行的,但是在大多数的设计中本机应用都会和服务器端协作,此时当然就要考虑到服务器端的测试了,也需要考虑在这种情况下(应用程序需要客户端和服务器端协作时)系统级别的测试。

一旦应用程序、系统的结构变得更加复杂,测试的对象和数量也就随之增加了,因此测试的自动化已经成为必然的趋势。

在本特辑中,我们将围绕智能手机应用程序开发时进行的测试,解说应用程序客户端和服务器端上的自动化测试。

本特辑的组成

本特辑的组成部分如下所示。

在本章中,我们会将智能手机应用程序和测试分类,并针对应用程序的种类大体说明其测试的相关内容。

第2章将讲解本机应用程序UI(User Interface)的自动化测试方法。

第 3 章将重点说明在开发智能手机的 Web 应用程序时,使用浏览器实现的自动化测试。

第 4 章将针对智能手机 Web 应用程序开发时必不可少的 JavaScript,讲解如何实现自动化单元测试和集成测试。

第 5 章将针对与智能手机应用程序相互协作的服务器端系统,通过列举 Web API 实例来讲解自动化测试的方法。

最后的第 6 章将针对智能手机应用程序的构建和发布,通过实例讲解实现自动化的方法。

智能手机应用程序的分类

智能手机应用程序的形式多种多样,既有与设备框架紧密结合的本机应用程序,也有在 HTML5 的基础上制作的 Web 应用程序,还有两者结合使用的混合型应用程序。

下面我们来介绍它们各自的特征。

本机应用程序

本机应用程序是指从如 App Store 和 Google Play 等应用商店中下载下来,并安装在 iPhone、Android 等智能手机,或是 iPad 等平板终端上使用的应用程序。

因为本机应用程序已经提前安装在设备上了,所以可以根据设备不同的状态控制是否要发生通信等动作,它的启动等所有操作也往往比 Web 应用程序更快。另外,由于可以根据应用的需求定制 UI,所以应用程序的可操作性也提高了。

并且,它也可直接使用设备内置的相机、麦克风、传感器等固有的功能,以及电话薄等设备内置的数据,这点可以说是个很大的优势。

本机应用程序的开发

在开发本机应用程序的时候,要使用各目标设备中的操作系统所提供的框架。因此,在开发 iOS 应用时要使用 Objective-C,在开发 Android 时要使用 Java。使用设备自带的框架,就可以集成前面说到的相机、麦克风或是电话簿等设备中固有的功能或数据来进行开发。

在开发上最大的问题是需要根据目标设备中的操作系统使用不同的开发语言,整体的开发成本很高。因此,如果要开发 iOS 和 Android 都能使用的应用程序,就必须要用 Objective-C 和 Java 分别制作两个不同的应用程序。

为了解决这样的问题,出现了例如 Titanium Mobile1 这样的框架,可以用同一份代码生成多种操作系统的本机应用程序。

1https://www.appcelerator.com/platform/titanium-platform/

Web 应用程序

智能手机的 Web 应用程序与传统的 Web 应用程序基本一样,是一个运行在浏览器上的应用程序。由于使用了浏览器,就不必像本机应用程序一样安装于各种不同的终端,只要访问特定的 URL 就立即可以使用了。智能手机的 Web 应用程序与传统的 Web 应用程序之间的区别在于要针对不同的智能手机固化屏幕大小,以及需要考虑页面布局以适应小尺寸屏幕。

对于应用程序的发布,由于应用程序的代码并没有在终端上,而是在服务器上,所以更新或发布都很简单,即使没有通过应用商店的审核也可以立刻发布。另外,只要是安装了浏览器的终端都可以使用 Web 应用程序,因此也不必为了对应不同的设备而制作多个应用程序。

与本机应用程序相反,Web 应用程序由于是运行在浏览器上的,所以可能会限制使用相机等设备中的固有功能。

Web 应用程序的开发

智能手机的 Web 应用程序大多使用 HTML5、CSS3、JavaScript 开发。我想对于那些开发过传统 Web 应用程序的工程师来说,也可以在一定程度上沿用他们以往的经验和既有的代码来开发智能手机的 Web 应用程序,不会出现什么大的问题。

由于使用了如 CSS3 和 HTML5 等 Web 开发的先进技术,相比传统的 Web 应用程序,智能手机 Web 应用程序的表现力也更加丰富。另外,以 jQuery Mobile2 为代表的专门针对智能设备的程序库,也使得基于 Web 的应用程序可以具有与本机应用程序相似的操作性。

2http://jquerymobile.com/

在页面的外观和布局方面,由于智能手机与 PC 上的浏览器不同,可以通过 PC 浏览器的设置或扩展功能将浏览器的用户代理(User Agent)设置为智能手机,再通过浏览器上的 iOS 和 Android 模拟器实施测试。

在开发环境方面,可以使用与开发传统 Web 应用程序相同的环境。编码时也可以使用自己喜欢的编辑器或者 IDE(Intergrated Development Environment,集成开发环境)。如果选择 Ruby on Rails 等 Web 应用程序框架的话,还可以使用这个框架中提供的调试环境和测试环境。

混合应用程序

所谓混合应用程序,顾名思义,就是本机应用程序和 Web 应用程序的结合。应用程序本身由本机应用程序组成,不过在本机应用程序中嵌入了名为 WebView 的浏览器组件。此时使用本机应用程序查看网站时显示的页面,与 Web 应用程序的页面是一模一样的。

由于混合应用程序本身是作为本机应用程序开发的,因此不仅可以发布到应用商店中,也可以使用设备上的固有功能。另一方面,因为混合应用程序的页面和页面跳转又是一个 Web 应用程序,因此开发和修改都可以在服务器端快速地完成。

在混合应用程序中,可以充分利用本机应用程序和 Web 应用程序中的各种优势。既可以拥有本机应用程序的精准控制能力和性能方面的优势,也可以拥有 Web 应用程序的快速开发能力,从而担当起开发大部分内容的任务。总之,充分地利用不同类型的应用程序的优势十分重要。

混合应用程序的开发

当然,在开发混合应用程序时,无论是本机应用程序还是 Web 应用程序都需要开发。

Web 应用程序的部分前面已经说过,在开发时需要注意智能手机的限制。而本机应用程序的部分一定会根据目标设备的环境而不同,因此就开发前的准备工作和开发本身来说,也必须要花费一定的时间和精力。

混合应用程序开发的支持工具中有一个名为 PhoneGap3 的框架工具,使用它可以将 HTML5+CSS3+JavaScript 开发的 Web 应用程序直接转换为本机应用程序,进而成为一个混合应用程序。在此基础上,由于 PhoneGap 自身也提供了使用本机功能的程序库,因此在基于 Web 应用程序进行开发时,也可以使用设备中的固有功能。

3http://phonegap.com/

此外,Adobe PhoneGap Build4 云服务提供了将 Web 应用程序上传,就可以将其构建为本机应用程序的功能。

4https://build.phonegap.com/

应用程序测试的分类

本特辑将会提及各种测试角度,在这里我们先从这些角度出发对测试进行整理和分类。

根据开发阶段分类

根据开发的阶段或测试对象的粒度,测试可以作如下分类。

  • 单元测试

  • 集成测试

  • 验收测试

单元测试是指针对模块等最小单元进行的测试。

集成测试是指在存在多个模块或组件、应用程序或服务的情况下进行的测试。像模块集成测试与组件集成测试这样,要通过明确集成对象来显示系统的粒度 5。集成测试一般由开发小组实施。

5有时候根据测试对象的集成程度使用的名词也会不同,如果比较小的时候被称作集成测试、较大的集成度被称为系统测试。

验收测试并不是由开发小组执行的测试,而是由接受产品的公司或组织来测试。测试对象的规模与系统级别的集成测试相当,但在整个开发过程中,验收测试和集成测试实施的阶段并不同。

在本特辑中,第 2 章、第 3 章、第 5 章将专注于集成测试的介绍,而在第 4 章中,单元测试和集成测试都会重点介绍。

根据测试的执行方式分类

按照其执行的方法,测试可以作如下分类。

  • 手动测试

  • 自动测试

  • 半自动测试

自动测试是无需人工干预,通过程序自动运行的测试。与之相对,手动测试就是人通过自己的手和眼睛通一边操作应用程序,一边执行的测试。

在这里还有一个概念,那就是介于自动测试和手动测试之间的执行状态——半自动测试。具体来说,就是测试是通过程序自动执行的,而测试的结果则是手动检查的。反之,手动执行测试,自动确认结果的测试方法也归类为半自动测试。

在本特辑中,整体将以自动测试为主,当然也会接触一些半自动测试和手动测试的内容。

在下文中,我们将介绍自动测试和手动测试的特征。关于半自动测试将在第 2 章中介绍。

自动测试的特征

自动测试中,一次性编写测试代码后可以多次自动执行,因此在需要反复执行测试的时候就能够看到它的威力了。

然而,由于需要编写测试代码,会增加初期开发成本,在应对需求变更的时候也需要花费相应的成本。因此,如果只是执行一次的测试或是在需求变化频繁的阶段,自动化测试的效率很低,并不是最好的选择。尤其是在 UI 自动化测试的时候,比起非 UI 测试,编写代码的难度更大、付出的成本也更高。

如果要执行的测试依赖于和设备关联的物理条件,例如通过全球定位系统(GPS)获取的位置信息等,那么该测试的自动化可能会变得很困难甚至无法实现。有些时候也会出现很难验证测试结果有效性的情况。例如,为了自动确认页面显示和布局,需要进行屏幕截图等工作,但对于视频和动画等动态的输出结果,想要确认的话在技术上是非常困难的。

手动测试的特征

因为不需要开发测试代码,所以在手动测试中需要专注的是测试用例的设计、执行以及资源计划。如果需要重复执行测试,那么就需要耗费与执行次数成正比的时间和人力资源,因此测试执行的效率很低。

在测试执行速度和同质化方面,手动测试多依赖于测试执行者的专业知识和技能熟练程度,测试的结果容易出现偏差。

在确认测试结果的时候,页面输出的手动确认灵活性较高,可以应对所有测试用例。然而,用眼睛确认时,只能大概地确认页面的显示结果,如果要精确到每个像素的正确性就十分困难了。这个问题在确认视频和动画的测试结果时也同样存在。

根据测试的目的分类

从测试目的或质量的角度来看,测试可以作如下分类。

  • 功能测试

  • 性能测试

  • 安全性测试

功能测试是验证应用程序是否满足功能需求的测试;性能测试是检查能否实现预期性能的测试;安全性测试是为了确认安全性需求和漏洞的测试。总之,测试可以按照执行测试是为了达成什么目的来进行分类。这样的话,测试可以分成很多类,前面列出来的三种只是众多分类中的一部分。

在本特辑中,我们将通过一个实例介绍功能测试。

根据测试技术分类

测试技术指的就是如何创建测试用例,从这个角度来看,测试可以作如下分类。

  • 白盒测试

  • 黑盒测试

  • 灰盒测试

白盒测试着眼于测试对象的内部结构来创建测试用例。例如,验证程序处理的执行顺序是否正确,或是测试程序内部某个值的变化。

黑盒测试着眼于测试对象的规格来创建测试用例。测试时并不在意测试对象内部执行了哪些处理,而是测试程序在输入了特定的内容后能否得到正确的结果。

顾名思义,灰盒测试介于上面两者之间,创建设计用例时既着眼于程序功能,也关注内部结构。例如,灰盒测试可以从黑盒测试的角度创建测试用例,也可以从白盒测试的角度编写测试代码。这种情况下,可以通过测试代码掌握程序的内部结构并加以利用,因此就能在黑盒测试中创建某些重现困难的特定条件来执行测试。

本特辑将重点关注黑盒测试和灰盒测试,不过在第 4 章中也会接触到一些白盒测试的内容。

智能手机应用程序的测试策略

至此,我们已经了解到了智能手机应用程序以及应用程序测试的分类。现在,测试已经成为了应用程序开发中不可或缺的一个部分。根据应用程序的不同,测试的方法和难易度也会产生差异。

单就测试方法来说,可以先大致分为本机应用程序特有的测试方法和 Web 应用程序的测试方法两种。而在测试混合应用程序时,要根据测试对象区别对待,将本机应用程序和 Web 应用程序中的各种测试方法适当地组合起来。

本机应用程序的测试

在测试本机应用程序时,因为不同的目标设备使用不同的开发语言,所以基本上测试也要依赖于特定的开发语言。例如,iOS 应用程序的测试代码要用 Objective-C 来实现,Android 应用程序的测试代码则要用 Java 来实现。

这里先简要介绍一下本机应用程序的单元测试和集成测试。第 2 章将会更加详细地介绍本机应用程序的集成测试。

本机应用程序的单元测试

在执行本机应用程序的单元测试时,首先要像上面说的那样,根据目标设备编写相应的测试代码。简而言之就是使用某个测试框架来编写测试代码。测试框架中具有代表性的有 Objective-C 语言的 GHUnit6 和 Java 语言的 JUnit7,等等。

6https://github.com/gabriel/gh-unit

7http://junit.org/

针对智能手机的单元测试与普通的单元测试一样,执行测试时要以应用程序的逻辑部分为中心,并且要尽量涵盖应用程序的控制器和处理器等部分。

本机应用程序的集成测试

在执行本机应用程序的集成测试时,要使用模拟器和设备本身实施 UI 测试。在 Web 应用程序的浏览器中,即使执行测试的平台不同,只要浏览器相同操作就能统一响应。但是在本机应用程序中,执行测试的平台不同,操作响应的方式和开发语言就也都不同。因此,目标 OS 之间的差异还是成为了多设备测试的阻碍。

目前现有的面向集成测试的 UI 自动化测试工具,都是实现了自动操作本机应用程序的框架。有关本机应用程序的 UI 测试和框架,请参考第 2 章。

Web 应用程序的测试

在测试 Web 应用程序时,可以直接使用在传统 Web 应用程序测试中总结出来的测试方法。其中一个最常用的模式就是在单元测试中测试应用程序的逻辑,在集成测试中使用浏览器进行端到端测试(End To End Testing)。在 Web 应用程序测试中,这一模式也可直接使用。

在这里,我们简要地介绍了智能手机 Web 应用程序的单元测试和集成测试。关于浏览器测试的内容将在第 3 章中详细介绍。第 4 章则会详细介绍使用 JavaScript 开发的 Web 应用程序该如何测试。

Web 应用程序的单元测试

因为可以把 Web 应用程序看作是一个传统的 Web 应用程序,所以也不需要特意介绍它的单元测试了。只需要根据所使用的 WAF(Web Application Framework,Web 应用程序框架)的结构以及特性,针对应用程序的业务逻辑、控制器等方面实施测试即可。

Web 应用程序的集成测试

集成测试其实并不是很难,沿用传统 Web 应用程序的浏览器测试也没有问题。可以利用 Selenium 等框架,根据目前所积累的技术和实践经验来实施测试。

要说智能手机 Web 应用程序与 PC 机 Web 应用程序之间的差别的话,那就是前者的页面技术采用了 HTML5 和 CSS3 等最新的技术、存在触摸和滑动等针对智能设备的特殊操作,还有页面大小是固定的,等等。

不过话说回来,如果能在一定程度上更新测试时使用的 PC 机浏览器并利用扩展功能的话,PC 机的 Web 应用程序也能够支持最新的 Web 开发技术,虽然不是完全支持。还有,如果使用模拟器或真实设备来进行测试的话,在测试时就可以考虑加入触摸和滑动等操作,也可以正确重现页面使用的实际环境。

本章小结

在本章中,我们围绕着智能手机开发的现状进行了说明,也为智能手机的应用程序分了类。另外,还在结合应用程序分类的基础上大致说明了各种应用程序的测试策略。

在后面的章节中,我们将接触到一些智能手机开发中的具体示例,并通过这些示例中的场景说明测试的思路以及自动化测试的方法。

专栏 测试代码的可维护性

对于测试代码来说,能够使操作自动化固然重要,但是可读性和扩展性等也十分重要。如果编写出来的测试代码虽然可以执行自动化测试,但是却毫无可维护性,这样的代码不仅无法继续使用下去,而且人们也会逐渐忘记它是测什么的以及怎么测的。这样的话,测试代码就完全失去意义了。

最近,出现了一些与浏览器测试中经常用到的程序库类似的,面向本机应用程序的框架。例如,在本机应用程序测试时,使用通过导入代理层来弱化不同操作系统间差异的 UI 测试框架,以及使用 DSL(Domain Spacific Language,特定领域语言)以更容易理解的方式描述本机应用程序操作的框架等。

目录

  • 编委会
  • 分栏目录
  • 第 4 回 众多亮点的游戏设计世界
  • 特辑 1 智能手机测试最前沿
  • 第 1 章 智能手机测试的基本知识
  • 第 2 章 本机应用程序的 UI 自动化测试
  • 第 3 章 浏览器自动化测试
  • 第 4 章 JavaScript 自动化测试
  • 第 5 章 服务器端自动化测试
  • 第 6 章 自动构建与发布应用程序
  • 特辑 2 Amazon Web Services 最新技巧
  • 第 1 章 Amazon Web Services 的分层比较
  • 第 2 章 使用 EC2 和 VPC 构建系统
  • 第 3 章 有效利用 RDS 构建数据库
  • 第 4 章 利用 CloudFormation 实现自动化的系统环境构建
  • 特辑 3 Sass/Compass 实战
  • 第 1 章 Sass/Compass 简介
  • 第 2 章 构建开发环境
  • 第 3 章 Sass 的基本语法以及 Compass
  • 第 4 章 写出现代化的 CSS
  • 第 5 章 实践中的 Sass/Compass
  • 第 9 回 使用 Boxen 进行 Mac 的环境搭建和配置管理
  • 第 9 回 通过重构改善数据库设计
  • 第 10 回 移动设备环境下的调试技术用方法
  • 第 4 回 使用 Grunt 实现前端开发的自动化
  • 第 9 回 用程序性能分析来分析性能问题
  • 第 9 回 通过 Doctrine Annotations 实现的声明式编程
  • 第 23 回 Perl 应用的测试与高速 CI 环境的构建方法
  • 第 18 回 致力于改善响应速度的“特命”小组
  • 图灵访谈 CSS 只是进化的一部分