常见的apk专项测试,主要有几类(主要指项目中经常用到的)
稳定性
安全性
兼容性
版本升级
流量测试
实际测试总结(对整个项目团队是如何进行测试以及测试的内容)
稳定性测试是指对应用进行长时间的操作,检测功能是否稳定。一般稳定性测试时间是 N*12小时。项目中稳定测试多采用monkey,进行随机测试。
测试方法:
1、跑monkey
adb shell monkey -p packageName -v -v -v --throttle 500 -s 4 --ignore-crashes --ignore-timeouts --ignore-security-exceptions times(次数) |logcat -v time > e:\log\monkeyLog.txt(日志保存路径)
参数:
-p : 指点包名,如果要指定多个包名,需多个-p参数
-v : 指定日志的详细程度,取值1-3,三个 -v 详细程度最高
-throttle : 指定用户操作时的时延,单位毫秒
-s : 指定伪随机数生成器的seed值,取值1-10,当seed相同,产生的事件序列也相同
–ignore-crashes : 指应用程序崩溃,monkey依然发送事件,直到事件数完成
–ignore-timeouts: 指应用程序发生ANR,monkey依然发送事件,直到事件数完成
–ignore-security-exceptions: 指应用程序发生许可错误,monkey依然发送事件,直到事件数完成
|logcat -v time: 给monkey命令的日志加上时间
2、日志解析
稳定性测试是否能通过在于日志,需要把日志里的报错日志搜索出来,开发定位问题。
用Notepad++打开日志
ctrl + F
分析exception日志,定位问题。
如果平时不接触安全测试,安全测试就像一个盲区,我也是有一个同事负责项目预置版本需要对安全方面进行测试,利用空余时间,琢磨了一二,其中看到了一些不错的博客,能对安全测试有个系统了解,我觉得这是有必要的。
移动安全测试的一些总结:http://blog.51cto.com/laoyinga/2155341
常见的安全漏洞 :https://blog.csdn.net/zhangcanyan/article/details/51347629
在自己的项目测试中,安全测试就是利用一些安全辅助平台对被测应用进行测试,主要用到两个安全辅助平台:腾讯哈勃分析系统 和 VirusTotal(一个可疑文件分析服务的网站)以及drozer(安全测试工具)。
测试方法:
将app在 https://www.virustotal.com/ 扫描,获取报告
将app在 https://habo.qq.com/ 扫描,获取报告
******* 如果有报错日志,给开发看,他们会分析的是否需要修复还是忽略 *******
(以下是我项目组的测试报告中的安全测试~~~~)
3、利用drozer进行安全渗透测试
drozer是一款综合的安全评估和攻击的android框架,全面评估app的安全性,并帮助团队把app的安全风险保持在可控范围内。安卓组件是构成安卓应用的基础,其中有四大组件是我们安全渗透测试的关注点。
四大组件:
activities ---- 控制用户UI,处理用户在智能手机屏幕上的交互
services ----无须可视化界面,提供后台长时间运行的功能
Broadcast Receivers ---- 处理安卓应用程序与安卓系统之间的通信
Content Providers ---- 处理数据与数据库之间的管理问题
测试步骤:
(安装drozer, drozerAgent.apk, 配置java, jdk,adb,这里我就不阐述了~~~)
1、手机和PC端相连,在PC上使用adb命令进行端口转发,到drozer使用的端口:31415
adb forward tcp:31415 tcp:31415
2、在手机上打开drozer agent.apk,选择embedded server ---->enable
3、cmd命令窗口切到drozer安装路径,开启drozer console
在开始使用测试之前,首先得熟悉一些drozer命令:
https://blog.csdn.net/cch139745/article/details/53519900 (drozer命令大全)
以下就只介绍用的多的drozer命令哒~
a、list -----列出所有模块
附录:(APP模块的作用说明)
APP模块
模块名 ------------------------ 作用
app.activity.forintent : 通过intent查找它的activity app.activity.info : 获取activities信息 app.activity.start : 开启 Activity app.broadcast.info : 获取broadcast receivers信息 app.broadcast.send : 发送广播 app.broadcast.sniff : 嗅探广播中intent的数据 app.package.attacksurface :确定安装包的可攻击面 app.package.backup : 列出可备份的包 app.package.debuggable: 列出可debug的包 app.package.info : 获取已安装包的信息 app.package.launchintent: 获取程序启动的activity信息 app.package.list : 手机已安装的程序包 app.package.manifest : 获取程序manifest文件信息 app.package.native : 列出Native libraries 信息 app.package.shareduid : 查找拥有共同uid的包和他们所有的权限 app.provider.columns : 展示content provider URI的各列 app.provider.delete : 删除content provider URI的内容 app.provider.download : 使用openInputStream读取指定uri的内容,并下载在电脑中 app.provider.info : 获取 content providers信息 app.provider.insert : 插入数据到content provider app.provider.query : 查询content provider 内容 app.provider.read : 使用openInputStream读取指定uri的内容 app.provider.update : 更新content provider的内容 app.service.info : 获取services的信息 app.service.send : 使用 Message攻击暴露的service,其service实现了handleMessage app.service.start : 开启服务 app.service.stop : 停止服务 b、run 模块名 -h ----查看某个模块的参数 c、run app.package.list ----- 列出手机上安装了的应用 run app.package.list -f 筛选字 ----搜索特定的包名 d、run app.package.info -a 包名 -----获取包名的详细信息
测试步骤:
1、确定攻击面
安全渗透测试在我的浅薄的理解中,就是看能不能对暴露组件进行攻击,导致敏感数据泄漏到安装在同一设备上的其他应用程序上。一般来说,应用程私有组件只能被当前应用启动,不能被其他应用启动相对是安全的。当一个应用程序的组件暴露,就可以被第三方的应用任意调用,可能导致敏感信息泄露、拒绝服务、权限提升绕过,界面劫持、远程代码执行等安全漏洞。
run app.package.attacksurface packageName
还是存在很多的潜在风险的。接下来就是对这些暴露的组件进行攻击。
补充:组件暴露漏洞检测规则
每一个组件在Manifest.xml定义,都有一个android:exported属性,满足以下两种情况都认为是有组件暴露漏洞的:1、显式设置exported属性为true;2、没有显式设定exported值,但组件下面有intent filter,这样组件exported默认值也为true。
2、对暴露的组件进行攻击
1)Activities
应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。暴露的activity意味着可以被导出。
查看暴露的activities:
run app.activites.info -a packageName
启动暴露的activity:
run app.activity.start --component packageName activityName
2)Service
service是一个没有用户界面的程序,可以用来开发后台服务或者监控类的程序和执行比较耗时的后台任务。例如,当音乐播放器退出用户界面之后,还需要继续播放,通常会使用Context.startService()来启动一个后台服务,来保持音乐的持续播放。
查看暴露的service:
run app.service.info -a packageName
提升权限:
run app.service.start
(平时没有用到这一块,有兴趣的可以自己研究下~~~~~)
3)Content Providers
每个应用程序都会有些数据存储,Content Provider使一个应用程序的指定数据集提供给其他应用程序,例如通讯录、信息和通话记录等。
查看暴露的provider:
run app.provider.info -a packageName
浏览可以访问的Uri:
run scanner.provider.finduris -a packageName
获取Uri的数据:
run app.provider.query 可以访问的Uri
如果查询到数据,就说明存在漏洞。就可以对数据进行SQL注入,获取表中的数据等。
(这些可以访问的uri是facebook对外暴漏的,也是无法获取到其数据的,根据自己应用的uri,可以排查,后面就只是介绍下常用的操作哒~)
SQL注入:(指利用现有应用程序,将恶意的SQL命令注入到后台数据库执行一些恶意的操作)
可以根据这些参数的使用尝试着对可访问的Uri进行操作。当你SQL注入的时候,如果报错就证明存在SQL注入。
检测sql注入和目录遍历:
run scanner.provider.injection -a packageName run scanner.provider.traversal -a packageName
4)Broadcast Receivers
应用可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice 来响应它们收到的信息,或者用NotificationManager 来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
利用intent对组件的触发一般有两类漏洞,一类是拒绝服务(broadcast),一类的权限提升(service)。拒绝服务危害性比较低,更多的只是影响应用服务质量;而权限提升将使得没有该权限的应用可以通过intent触发拥有该权限的应用,从而帮助其完成越权行为。
查看暴漏的broadcast:
run app.broadcast.info -a packageName
尝试拒绝服务攻击检测,向广播组件发送不完整intent:
1)空action
run app.broadcast.send --component com.hatsune.eagleee ReceiverName
2)空extras
run app.broadcast.send --action android.intent.action.xxx
总的来说,使用drozer做安卓安全渗透测试需要对drozer命令和android组件比较熟悉。
兼容性测试主要是对app在各类机型上的兼容、适配等情况进行测试,而且用户体验是评价一个产品好坏的重要指标,所有做出来的软件,盈利的软件,最终是交付给用户。所以兼容性测试也是一个很重要的测试项。兼容性测试常见的便是:
移动端设备的版本号测试
手机屏幕的分辨率测试
新老版本兼容测试
(一个app, 一次次迭代,就会有多个版本在市场上被使用,新版本的开发不应该影响到旧版本,尤其是出现一次版本改动比较大,或者重构应用的时候,回归多个老版本是必不可少的测试点,当然并不是要测试到每个点,修改的部分需着重测试,可以和开发沟通了解,了解可能影响的点,有针对性的测试)
测试点:
主要流程能正常运行
界面没有错位、重叠,展示不全等不美观问题
旧版本可能影响的模块主要功能可以正常运行
测试方法:
1、准备多台测试机 (-----top排行的手机基本足够)
(因为公司是做手机,不缺测试机,一般我准备至少5台不同安卓版本,不同分辨率的手机,对新功能版本号,分辨率进行测试)
版本号:功能正常运行。
分辨率:页面美观,无错位,重叠,展示不全等问题。
(以下是我项目组的测试报告中的兼容性测试~~~~)
2、云测试
针对个人开发者、初创公司,以及App比较单一的公司,没有足够多的测试机,是可以使用兼容性云测服务的。目前很多的公司,已经提供了兼容性云测服务,例如TestIn、TestBird,除此,大型公司也对外推出自己的测试工具,比如谷歌、腾讯WeTest、百度MTC、阿里MQC等等。
eg: 以下是TestIn兼容性测试执行界面
testIn测试报告,很详细:
用还是很好用的,就是得收费。其他的也差不多,可以去体验下。
3、自主研发兼容性自动化测试平台
无论是国际知名App,还是国内知名App,谷歌、Facebook,BAT等,他们都有大量的App对外推出,对于App兼容性要求非常高。这些公司的兼容性测试,都有一个相同的解决方案,那就是自动化测试框架与平台的实现,但是这个成本是比较高的。不仅要有自己测试的实验室,还要拥有大量的手机,还有一整套的自动化测试平台。
当然我不会,但是也是一个努力的方向啊,本公司是制作手机的,正好拥有这些条件,今年10月份测试部自主研发一套兼容性自动化测试平台,满满的膜拜啊,正在内部试用中。
在项目中版本升级是一个很重要的测试项,每次版本的迭代都需要测升级,去验证升级之后主要功能是否正常。一般情况下,正常用户升级自己的软件,无异于三种途径:1、根据app弹出的升级提示框选择升级; 2、自己到应用商店或者其他渠道下载升级。3、强制升级。然而其本质都是:覆盖安装。将最新的app下载到手机的sdcard上,然后安装覆盖掉旧版本的apk。
测试点:
正常升级
跨版本升级
强制升级
在传音,先后进入了两个项目团队,对于升级测试,也有些不同。
第一个项目团队是一个管理应用,并没有上到市场上,升级测试也比较简单,主要操作就是:
1)在数据库中修改版本号,客户端弹出升级提示,点击升级或者不升级。(用多个版本进行测试,是否都能升到最新版本,且功能正常)。
2)如果是强制升级,将强制升级的字段修改成强制升级。那么所有的版本在打开应用的时候都会自动升级。(同样用多个版本测试,是否都能升到最新版本,且功能正常)。
第二个项目团队是一个新闻应用,有上到市场上,可以在GooglePlay下载。
测试方法:
1)安卓设备上先安装一个最近的旧版本
adb install apk路径
2)将新版本push到手机的sdcard上
adb push 新版本apk路径 /mnt/sdcard
3)在File Manager 文件管理中选择刚push的apk,点击安装
4)查看新版apk是否已经覆盖安装了旧版本,且功能正常
5)然后卸载最新的apk, 设备上装上前几个版本,重复上面,进行跨版本升级测试。
6)测试通过之后,上到GP或者应用商店等渠道后,验证一遍,功能正常就算完成啦~
(上一节android性能测试:https://blog.csdn.net/xiaomaoxiao336368/article/details/83547318
留下流量测试一节没有讲,这里补充下)
应用的耗流也是用户的一个重要关注点,一是节省用户的使用成本,二是流量优化能带来响应速度的优化,三是能清楚的知道每个场景需消耗的流量,确认是否有能优化的空间。
测试点:
首次启动到全部加载完成耗流(冷启动)
非首次启动到全部加载完成耗流(热启动)
后台运行耗流
运行某个场景消耗的总流量
测试方法:
1、使用测试工具 Emmagee或者GT(上一节有介绍~)
1)安装应用待测apk,安装Emmagee
2)首次启动–打开Emmagee,选择被测应用,待页面全部加载完成(Net Traffic数值趋于稳定)
测试流量的时候除了项目定的一些标准,还会和市场上竞品进行对比。对于产品来说,尤其是同类产品,数据是最重要的。以下是我项目组的测试报告里流量测试的输出:
2、使用安卓系统自带的TCP流量计数进行人工计算
1)查找app对应的Uid
方法1:adb shell dumpsys package packageName |grep userId= 方法2:adb shell ps |grep packageName --------先获取pid,第二列
adb shell cat /proc/{pid}/status |grep Uid
2)计算下行(下载)和上行(上传)流量情况
步骤:
1、获取当前下行(下载)流量
adb shell cat /proc/uid_stat/{Uid}/tcp_rcv
启动app至彻底启动,运行上面命令
2、获取当前上行(上传)流量
adb shell cat /proc/uid_stat/{Uid}/tcp_sd
启动app至彻底启动,运行上面命令
注意:
1)启动APP后的流量应多尝试几次,当不操作APP且流量值不变化时为准。
2)此方法虽测出对应场景的上下行流量,但是无法进行具体的剖析,要定位查 找问题需要使用第三种方法
3)使用tcpdump+wireshark抓包分析(流量异常情况)
上面的两种方法,都是直接对总的流量进行统计,如果发现某刻操作流量值异常增大,就需要我们定位到具体的请求来查找问题。 对于异常流量的分析,使用tcpdump+wireshark.
tcpdump(需获取root权限)是Linux系统下的一款抓包命令集,是基于网卡抓取流动在网卡上的数据包。tcpdump拦截和显示发送或收到过网络连接到该机器的TCP/IP和其他数据包,简单说就是监控手机的进出网络数据。因为android本身也是一个Linux系统,所以也有对应的tcpdump。
wireshark是一个网络封包分析软件,撷取网络封包,并尽可能显示出最为详细的网络封包资料。wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。
注意:如果我们需要测试某一个App消耗的流量就需要禁用其他APP的连网权限。
测试方法:
1、手机需获取root权限,可以根据自己手机的机型版本号在度娘上找对应的刷机版本号(user debug版本),或者找可以刷机的工具一键root。
2、下载tcpdump,push到手机上
下载地址:http://www.strazzere.com/android/tcpdump
adb push tcpdump路径 手机路径
3、切换到root用户,执行抓包命令
参数:
“-p”:不使用混杂模式 “-n”:不把网络地址转换成名字 “-s 0”:-s参数用以指定数据包捕获长度,此处指定为0,表示抓取完整的数据包 “-vv”:输出详细的报文信息
4、打开wireshark对数据包进行分析
下载地址:https://www.wireshark.org/download.html
(后面这一块自己也是一知半解,以后get到了,再补上~~~~~~~)
一个版本的迭代到上线,最终要输出的一个测试通过的报告,才会正式上线。测试报告中应包含了项目团队这一次版本的所有内容。根据我团队的项目(新闻类app),测试报告大体包括:
Release Note (罗列此版本迭代和修改优化的功能点)
测试用例 (功能点)
稳定性测试(跑monkey,对日志、内存进行分析)
内存泄漏 (连续500次的登陆退出) ----(monkeyrunner)写的脚本~~
性能测试(内存+CPU)
兼容性测试 (版本号、分辨率)
安全测试 (安全网站扫描)
流量测试 (测试工具统计:emmagee)
功耗测试 (测试工具统计:emmagee)
(现在都是快速迭代,只有大版本的时候才测得这么细,但是兼容,稳定、内存每个版本都要测)
MonkeyTestUI测试稳定性:
除了我在上面专项测试中提到的测试方法,在实际测试中,我是用的是我们团队自己研发的一个MonkeyTestUI工具,相比通过adb命令的无图形界面以及生成的日志只能自己写脚本循环遍历,然后查找出Expection来对日志进行分析,定位问题。MonkeyTestUI就没有那么繁琐,首先,MonkeyTestUI它是图形界面,无需写adb命令;可以同时对多台手机进行Monkey测试;其次,生成的日志可直接扫描,自动生成execl报表,并统计出异常的个数以及是哪个层次的异常,除此之外,还能自动生成内存变化曲线图(是可以定位一些可能存在的内存问题的)。
MonkeyTestUI界面
注意:被测应用monkey测试的时候,要选择白名单
内存曲线:
跑monkey,还有一个重要的点就是:对日志分析,查找报错的日志,然后定位问题。
传统的测试方法,就像我上面提到的稳定性测试一样,需自己搜索整理出异常日志。MonkeyTestUi不需要这么麻烦,只需要把某个设备生成的日志直接在异常扫描工具(aee.exp_logv2.4_windows.exe)中扫描即可。如果有报错的日志,会自动生成result.xls.
具体操作如下:
1)跑Monkey生成的内存和日志地址
2)扫描日志
结果解析:
(生成的扫描结果只会记录异常的日志)
a、如果没有异常日志,resule.xls则是空白
b、Statistics.txt,统计报错的个数
注意事项:
扫描之前,先要将Monkey日志的 .dbg文件默认打开方式为aee_extract.exe。
3)扫描内存
生成的报告:(峰值过高或者一直增长是需要关注的,很有可能存在风险)
安卓移动端专项测试就讲到这了,希望可以帮到你们~~
如果需要我提供工具的,可以私信我~ ~ I am Kitten
附件:项目团队的测试标准,每个公司的标准不一致,这里仅作参考~
1、内存溢出
2、功耗测试
3、性能测试
4、其他测试点
作者:Kitten_336368
原文链接:https://blog.csdn.net/xiaomaoxiao336368/article/details/84887948