App已经渗透到每个人的生活、娱乐、学习、工作当中,APP作为现如今几乎最广泛的应用程序,在所有的移动平台上都有应用,并且以极高的速度增长。但是作为程序而言,出现的时间并不是非常久。很多原有的软件测试流程和思想无法直接套用在APP的测试中,因为和一般的PC端软件相比,APP又具有很多特殊的属性。
例如,传统软件针对不同的平台甚至系统,都会有完全对应的版本,而APP一般对于系统版本并不敏感;其次,APP基本都是轻量化开发,无需复杂的设置或者调试,往往都是傻瓜化安装,上手难度极低;另外,APP的运行环境基本上是以无线连接为主(3/4/5G,WiFi),对于网络连接的速度比较敏感……这些都是和传统软件并不一致的地方。
所以,APP作为一个特殊种类的软件,是有必要单独总结出来测试方法和测试思路的,这对于测试对象为APP的测试工程师来说,是十分必要的。
一、 APP测试思想
APP测试实际上依然属于软件测试的范畴,是软件测试的一个真子集,所以经典软件测试理论,依然是在APP测试中有效的,只是需要针对APP的特殊情况进行一定的增补和额外覆盖。
对于APP测试,一般采用的是黑盒测试思想,也会在必要的时候进行自动化测试以及性能测试,并且对于APP还会有专项测试,例如内存,流量以及耗电量测试。
APP测试也是需要进行功能测试的,其功能测试与传统功能测试是同样的测试流程和标准,并没有很大的区别。
二、 APP测试流程
1. 测试流程图
2. 测试预备条件
在软件测试中,测试预备条件是经常被忽略的方面,以至于很多测试都会在这里被阻塞。所以在APP测试中,因为牵扯的预备条件比传统软件更多些,更需要额外精力进行事先准备。
在测试任务开始前,所具备的测试资源应该着重检查,包括但不限于:功能需求文档、功能需求说明、测试设备、测试方案、测试环境、测试人员等。
3. 测试范围
测试范围是APP中一个比较重要,却经常容易被忽略的方面。APP作为与移动平台进行适配的软件,是有针对平台范围和版本范围的。
当前移动平台大体分为安卓、iOS和其他类型(例如Blackberry/Windows Phone/Symbian/…),其中安卓又分为原生系统、改造系统(EMUI/MIUI/Flyme/…)。这些不同的改造平台与安卓原生系统存在着版本对应关系。而其他份额较小的系统类型,则存在自己的版本演进体系,针对这些系统的测试,需要花费一定的精力进行梳理版本脉络。
安卓系统本身还存在着版本演进,改造版本除了自身的版本演进之外,还和安卓原生版本存在着对应的关系,许多在原生系统中覆盖的版本范围,在改造系统中,并不是严格一一对应的。
所以在APP测试中,要特别注意测试对象所覆盖和针对的系统版本以及对应平台,尤其是对于测试设备本身硬件的要求,要格外注意。
三、 APP测试点
针对APP的特点,主要有一下四个方面是APP软件的测试重点,分别是:功能测试、性能测试、界面/易用性测试和兼容性测试。这基本上已经涵盖了APP测试中所要重点关注的指标,如下图所示:
1、 功能测试
2、 性能测试
3、 界面/易用性测试
4、 兼容性测试
这些测试点包括了我们针对APP进行测试的所有关键点。按照APP的架构来分,基本上分为前端和后端两大部分,这两大部分的项目中,有数项作为基础覆盖项,是需要在每次的测试中都必须进行测试的:安装/卸载测试、UI测试、标称功能测试、标称性能测试、安全测试、兼容测试、升级更新测试、用户体验测试、硬件操作测试、接口测试和数据库测试。
在敏捷测试理论中,功能测试是往往被单一划分出来的,软件测试首先被划分为功能测试和非功能测试两大类,其余的测试内容都是从非功能测试中细分出来的。
作为软件测试工程师来说,再将测试内容划分为前端和后端,再将这些测试种类分别对应到前后端中,再进行对应测试,是非常高效且可以杜绝测试漏项的方法。
在早期的APP测试中,手工测试是用来进行APP测试的不二法门,软件的手工测试极为重要。但随着技术的不断发展和自动化测试技术的不断深入,之前采用的一些测试方法,已经可以采用自动化测试的办法进行覆盖和替代,大大降低了测试工程师的负载,也提高了效率。但是手工测试依然是不可替代的,因此,从手工测试开始了解和认知APP测试,是非常有必要且关键的。
四、 APP测试点分项
对于APP来说,不同用途的APP所侧重的测试方面也是非常不同的,另外,不同的用户可能对于同一款APP的使用习惯也存在不同之处。对一款APP来说,可能用户具体的使用场景会远远超过项目开发团队的预想,所以在测试过程中,场景的完备考虑和多场景的交互以及有侧重地进行测试是十分必要的。
从一款APP被指定要被测试开始,我们就进入了测试准备阶段,这就要求测试工程师在方案预想中,要尽可能多地考虑。
1.安装卸载测试
对于APP的应用来说,最先进行的就是安装及卸载测试,这是APP运营和测试的开始,并且针对不同的平台,APP应该提供相应的版本以及适配版本说明。因为考虑产品版本更新迭代速度,产品都会向下兼容较为早期的版本,所以一般不会注明所支持的最初版本。这一点与一些更新并不频繁的APP不同,需要注意,特别是经过魔改的安卓版本。
在这一点上,需主要考虑的是不同的安装途径、不同的系统版本、不同的安装方式(包括但不限于通过应用市场、APK文件卡载、蓝牙分享)、不同的卸载方式等。
安装测试还会涉及到一个场景,就是升级。在项目中版本升级是一个极为重要的测试项,需要注意的是,每次版本的迭代都需要对升级进行检测,去验证升级之后主要功能是否正常。一般多用冒烟测试进行验证。
一般情况下,正常用户升级自己的软件通过三种途径:
1)根据APP弹出的升级提示框选择升级
2)自己到应用商店或者其他渠道下载升级
3)强制升级。然而其本质都是:覆盖安装。
具体则是将最新的APP下载到手机的内存上,然后安装覆盖掉旧版本的APP。
而这些测试的主要测试点则集中在:
1)正常版本升级
2)跨主版本/次版本升级
3)强制升级
2.UI测试
UI是APP呈现给用户最直观的方面,因此这里的检查是最需要耐心和细致的,因为非常容易因为视觉疲劳而产生漏检。
检查UI图片,icon,文字,布局等UI元素与效果图是否一致,以及在不同分辨率和横竖屏显示状态下,是否存在变形、错行、字符丢失等问题。一般UI方面不会存在特别严重的问题,这反而是非常容易被忽略的原因。
3.功能测试
功能测试是对APP的最主要的测试,每项新开发/升级/改动的功能都需要进行测试。测试时,测试工程师把APP当作"黑盒"一样进行手动测试,看看提供的功能是否正确并如设计的一样正常运作,而事实上,功能测试也往往就是以黑盒测试为基础的。这里需要注意的是,在功能测试过程中,只要是和需求说明不一致的地方,都是缺陷,而不是只要能正常操作就是通过测试的。
测试工程师除了手动测试之外,后期的自动化测试维护也是需要的。除了经典软件测试,像点击按钮、提交订单等等,也是需要进行覆盖测试的。有关功能测试的内容和验证点,需要和BA对需求进行细节的确认。
测试中非常常见的回归测试,也往往针对功能测试,所以功能测试是整个APP测试中的重中之重。在敏捷测试中,往往也将测试内容分为功能测试和非功能测试两大类,由此可见功能测试的地位。
4.性能测试
APP应用是否优秀,不仅仅体现在功能性上,也包括性能。如果性能表现不够稳定,则会在影响部分用户的使用体验。
与APP架构相关,这里的性能包括客户端和服务端两大部分,客户端性能是关注APP在不同类型设备不同类型平台上的性能表现。服务端性能测试其实和一般的服务端性能测试项目并无二致,都是为了考察项目或接口服务在大量用户并发访问下的服务端表现。
性能测试基本上普遍的测试点包含:CPU/内存占用,界面切换流畅度,流量/电量消耗,启动时间等。
应用的流量消耗是用户的一个重要关注点,一是节省用户的使用成本,二是流量优化能带来响应速度的优化,三是能清楚的知道每个场景需消耗的流量,确认是否有能优化的空间。
客户端流量测试的测试点主要有以下几点:
1)首次启动到全部加载完成耗流(冷启动)
2)非首次启动到全部加载完成耗流(热启动)
3)后台运行耗流
4)运行某个场景消耗的总流量
有关服务器端的性能测试,则一般依赖JMeter或LoadRunner等。
5.安全测试
APP项目上线前,一般也会针对项目内容的不同,不同程度地展开反编译性、数据安全、键盘安全、通信保密性及安全策略等方面的验证。对于APP项目的安全测试,如果没有特别的安全团队,可以通过现有各大厂商提供的安全检测平台或者工具进行基础或较高阶位的安全测试。
对于一般APP则主要是通过利用一些安全辅助平台对被测应用进行测试,主要用到两个安全辅助平台:腾讯哈勃分析系统 和 VirusTotal(可疑文件分析服务的网站)以及drozer(安全测试工具)。
1)将APP在 https://www.virustotal.com/ 扫描,获取报告;
2)将APP在 https://habo.qq.com/ 扫描,获取报告;
安全测试是一个和其他测试内容相对独立的领域,一般而言,安全测试团队会独立于其他测试团队进行设置,所以作为安全测试人员,可以在这一点做更深入和细致的了解。
6.兼容测试
兼容性测试主要是对APP在各种平台各类机型上的兼容、适配等情况进行测试,所有最终是交付给用户的APP,每次迭代,就会有若干版本在用户中流转,如果没有强制在线升级,那么就会出现多个版本并存的局面。
按照软件开发原则,新版本的开发不应该影响到旧有版本,尤其是出现新版本改动比较大,或者重构应用的时候,对老版本进行回归测试也是必不可少的测试点,当然并不是要测试到每个点,修改的部分需着重测试,可以和开发沟通了解可能影响的点,有针对性地测试,也可以采用冒烟测试,所以兼容性测试也是一个很重要的测试项。
兼容性测试常见的是:设备型号, 移动端设备的系统版本、移动端APP的新旧版本、屏幕尺寸, 屏幕分辨率, 网络类型及软硬件兼容性等。
针对个人开发者、初创公司,以及App比较单一的公司,没有足够多的测试机,是可以使用兼容性云测服务的。目前很多的公司,已经提供了兼容性云测服务,例如TestIn、TestBird,除此,大型公司也对外推出自己的测试工具,比如谷歌、腾讯WeTest、百度MTC、阿里MQC等等。
7.用户体验测试
用户体验测试是一个较为主观的测试内容,从用户使用角度出发,感知产品或服务的易用性,人机交互和人体工程学方面的测试。大致可以分为界面设计、功能易用、横竖屏切换、系统功能响应等。细节方面甚至包括提示信息展示样式、操作动线轨迹等等的测试。
8.接口测试
这是一个比较深度的测试内容,往往是在测试初始阶段就要介入的,因为APP的数据交换成功与否,和接口能否实现正确调用息息相关。
接口测试的主要内容是测试模块或子系统组装后,功能以及模块间接口的调用是否正确,将模块组装起来,对与设计相关的APP体系结构的构造进行测试。在这里主要使用的工具是Postman和JMeter。
9.数据库测试
数据库测试其实主要是基于接口测试的结果,当接口测试成功通过之后,对数据库进行数据查验及确认,这里需要使用数据库工具,具体则是在前端进行针对数据的增删查改操作之后,到后端数据库进行验证。
需要额外注意的是,如果是直接对数据库进行操作测试,是存在将不符合业务逻辑的数据引入数据库的可能,这会带来不可知的风险。所以数据库测试,尤其是增删改这样的操作,严禁随意在生产/正式环境中进行。
10.稳定性测试
作为一款高使用度的APP,率先考虑的非功能性指标是稳定性,对于APP来说,如果是关注在线活跃度和用户活跃时间的,那么稳定度也是一个非常需要关注的点。这个测试点的指标和认知是与产品定位高度相关的,作为测试工程师来说,这一点必须注意。
稳定性测试是指对应用进行长时间的操作,检测功能是否稳定。一般稳定性测试时间是 N*12小时。项目中稳定测试多采用Monkey,进行随机测试。
以上罗列出了APP的重要重点测试方法,一个版本的迭代到上线,最终要输出测试通过的报告,才会sign off正式上线。
测试报告中应包含了项目团队这本次版本的所有内容。而测试工程师也恰恰回会通过这个报告来对自己的测试内容进行查漏补缺。
在APP测试过程当中,除了本文提到的诸多测试内容之外,类似功耗测试、内存+CPU测试和内存泄漏测试等,也都是需要重点关注的。
一个成熟的、推向市场的APP,必须经过各个方面的锤炼和检验,才能获得用户的认可,而这个认可的背后,就是测试工程师对于APP测试的把握。
作者:苗条小胖