浅谈我与Android相处的点滴 一、个人自动化经验分享 二、Android基本架构了解 三、MonkeyTest指令学习 四、MonkeyRunner测试知识 五、写简单Python测试脚本 六、ADB与批处理的联系 七、小工具制作(讲1实例)
Android自动化工作计划与目标 Android自动化探索 目的: 1. 实现性能测试及压力测试 2. 实现功能的自动化测试 3. 提高生产力,解放人力 4. 为大规模自动化测试做技术探索和储备 策略: 1. 熟悉android 2. 选择脚本语言 3. 切入某个点实现自动化 4. 丰富更多功能的自动化 5. 实现压力测试 培养人员时间规划: 1. 熟悉android 2012.7.10-2012.07.15 2. 深入了解android testing 相关知识 2012.07.16 – 2012.07.31 3. 编写一个功能点的自动化 2012.08.01 – 2012.08.10 4. 熟悉性能压力测试环境和方法 2012.08.11 – 2012.08.20 5. 编写一个性能压力test case 2012.08.30 – 2012.08.31 6. 丰富功能点和性能等test case 2012.09.01 –后续 措施: 1. 学习:\\192.168.1.100\05 系统测试\Android测试 2. 浏览:http://www.apkbus.com/forum.php?mod=collection&action=view&ctid=1中测试相关部分。
Android自动化工作计划与目标 一、了解android的大体框架 1.应用程序 2.应用程序框架 3.程序库 4.android运行库 5.Linux内核 二、安装Android开发环境,根据例子运行了一个Hello World 三、熟悉Android Testing 相关知识 1.工具相关:DDMS、Itestin、adroidrobot、monkey、monkeyrunner、以及其他对比工具等等 2.test package 主要是编写test代码进行测试 例子:hello test 对HelloAndroid进行了测试并体现运行后的结果 3.Monkeyrunner: monkeyrunner工具则是提供一个API来编写程序,控制一个Android从外部设备或模拟器的Android代码。通过monkeyrunner,可以编写一个Python程序,安装一个Android应用程序或测试包,运行它,发送按键到它,需要它的用户界面图片,并将截图存储在工作站。monkeyrunner工具则是主要被设计用来测试应用程序和设备的功能/框架水平,运行单元测试套件。一个API测试设备与Python programs一个用Python编写的进行api测试的程序这是一个简单的monkeyrunner程序,连接到一个设备,创建一个MonkeyDevice对象。使用MonkeyDevice对象,程序来安装一个Android应用程序包,运行它的一个活动,并向其发送按键事件来达到我们的测试目的。
Android系统结构 ① 应用程序层 ② 应用程序框架层 ③ 系统运行库层 ④ linux核心层
Android构架划分 Android构架划分 Android本身是一套软件堆迭(Software Stack),或称为「软件迭层架构」,迭层主要分成三层:操作系统、中间件、应用程序。 Ⅰ. Applications【应用程序层】: 用户直接使用的功能,谷歌提供了基本应用,比如电话、联系人、短信、邮件、浏览器等,还有无数第三方应用...JAVA开发 Ⅰ. Applications【应用程序层】: 用户直接使用的功能,谷歌提供了基本应用,比如电话、联系人、短信、邮件、浏览器等,还有无数第三方应用...JAVA开发 Ⅱ.Application Framework【应用架构层】: 开发应用程序使用的基础组件,相当于供应用程序调用的API,JAVA开发,包括: 1. 丰富的界面控件,如列表、按钮、文本框、内嵌浏览器等等。 2. Content Providers,数据存储组件,应用程序可以通过Content Providers分享数据 给其他应用,也可以访问其他程序的数据,包括系统基本应用提供的数据,如联系人, 记事本等数据。 3. A Resouce Manager, 资源管理器,帮助应用程序访问图片,布局文件等资源。 4. A Notification Manager, 应用程序可以通过Notification Manager在主界面的状 态栏上显示一个自定义的提示信息,用户点击提示信息就能进入程序。 5. An Activity Manager, 主要负责管理应用程序的生命周期和程序调用栈。 Ⅱ.Application Framework【应用架构层】: 开发应用程序使用的基础组件,相当于供应用程序调用的API,JAVA开发,包括: 1. 丰富的界面控件,如列表、按钮、文本框、内嵌浏览器等等。 2. Content Providers,数据存储组件,应用程序可以通过Content Providers分享数据 给其他应用,也可以访问其他程序的数据,包括系统基本应用提供的数据,如联系人, 记事本等数据。 3. A Resouce Manager, 资源管理器,帮助应用程序访问图片,布局文件等资源。 4. A Notification Manager, 应用程序可以通过Notification Manager在主界面的状 态栏上显示一个自定义的提示信息,用户点击提示信息就能进入程序。 5. An Activity Manager, 主要负责管理应用程序的生命周期和程序调用栈。
Android构架划分 Android构架划分 Ⅲ. Android Runtime【系统运行库层】: 1、Android Runtime【运行环境】 应用程序的运行空间,包括一个实现JAVA语言大多数功能的核心库;以及一个类似JAVA虚拟机的Dalvik虚拟机,所以应用程序都是运行在虚拟机中运行。Dalvik虚拟机针对移动设备做过优化,每个程序单独运行在一个虚拟机中,提高系统的安全性和稳定性,但是相对牺牲了一部分性能。Dalvik VM底层基于Linux核心的线层管理和内存管理等功能。 Ⅲ. Android Runtime【系统运行库层】: 1、Android Runtime【运行环境】 应用程序的运行空间,包括一个实现JAVA语言大多数功能的核心库;以及一个类似JAVA虚拟机的Dalvik虚拟机,所以应用程序都是运行在虚拟机中运行。Dalvik虚拟机针对移动设备做过优化,每个程序单独运行在一个虚拟机中,提高系统的安全性和稳定性,但是相对牺牲了一部分性能。Dalvik VM底层基于Linux核心的线层管理和内存管理等功能。 2、Libraries【库文件界面】: 一系列的C/C++库,相当于Android系统在Linux核心系统上的功能扩展,为Application Framework层的许多功能提供支持,通过JNI供JAVA调用。包括: ● System C library - libc, 标准C系统库,针对linux嵌入式设备优化。 ● Media Libraries - 基于OpenCore的多媒体库,提供视频、音频、图片的播放记录等功能, 支持MPEG4, H.264, MP3, AAC, AMR, JPG, and PNG等 ● Surface Manager - 管理显示子系统模块,包括多层程序2D,3D图层混合显示。。。 ● LibWebCore - 大名鼎鼎的webkit浏览器内核 ● SGL - 底层2D图片引擎。 ● 3D libraries - 基于OpenGL ES 1.0 APIs; 包括硬件3D加速(硬件支持的话), 或者优化的3D软解析 ● FreeType - 字体引擎 ● SQLite - 基于SQL的轻量级数据库 2、Libraries【库文件界面】: 一系列的C/C++库,相当于Android系统在Linux核心系统上的功能扩展,为Application Framework层的许多功能提供支持,通过JNI供JAVA调用。包括: ● System C library - libc, 标准C系统库,针对linux嵌入式设备优化。 ● Media Libraries - 基于OpenCore的多媒体库,提供视频、音频、图片的播放记录等功能, 支持MPEG4, H.264, MP3, AAC, AMR, JPG, and PNG等 ● Surface Manager - 管理显示子系统模块,包括多层程序2D,3D图层混合显示。。。 ● LibWebCore - 大名鼎鼎的webkit浏览器内核 ● SGL - 底层2D图片引擎。 ● 3D libraries - 基于OpenGL ES 1.0 APIs; 包括硬件3D加速(硬件支持的话), 或者优化的3D软解析 ● FreeType - 字体引擎 ● SQLite - 基于SQL的轻量级数据库
Android构架划分 Android构架划分 Ⅳ. Linux Kernel【linux核心层】: Linux核心,Android的基础,基于2.6版本,基本的操作系统组件,包括内存管理,进程管理,存储管理,网络栈,驱动模型等等 Ⅳ. Linux Kernel【linux核心层】: Linux核心,Android的基础,基于2.6版本,基本的操作系统组件,包括内存管理,进程管理,存储管理,网络栈,驱动模型等等
monkey的基本用法 随机测试的使用方法比较简单,可参考下述参数表,这里举一个例子进行说明。 假设现在要KingsoftClips,我们可输入如下命令: adb shell monkey -p cn.wps.clip --pct-touch 50 --pct-motion 50 -v 1000 命令解释:↓ -p后面接的是要测试的包名,金山复制助手的包名为cn.wps.clip --pct-touch 50 指的是touch事件所占的百分比为50 同理--pct-motion 50指的是motion事件所占的百分比为50 -v 使反馈信息级别增加1,其默认值是0 而最后的1000,则表示发送1000个随机事件。 详情可参照下面提供的参数表格。 注意:自己指定的百分比之和不能超过100,否则会出错
monkey对应参数表 adb shell monkey -s 1001 -p cn.wps.clip -process-after-error --pct-trackball 30 -v --throttle 500 --pct-motion 50 --pct-syskeys 20 --throttle 500 20000
monkeyRunner的基本用法 在python中首先要导入Android的相关组件: from com.android.monkeyrunner import MonkeyRunner from com.android.monkeyrunner import MonkeyDevice from com.android.monkeyrunner import MonkeyImage 连接设备:device = MonkeyRunner.waitForConnection() 安装:device.installPackage('D:/AppInstall/KingsoftClip.apk') 卸载:device.removePackage ('cn.wps.clip') 启动Activity:device.startActivity(component='cn.wps.clip/.CloudClipActivity') Touch动作:device.touch(200,200,'DOWN_AND_UP') Drag动作:device.drag((250, 650),(250,150),0,20) 系统按键:device.press('KEYCODE_MENU') 输入字符:device.type('Bobby') 截图:result = device.takeSnapshot() result.writeToFile('D:/AppInstall/shot'+ time +'.png','png')
Python-测试脚本案例
monkeyRunner-Python录制与回放 运行环境:ADB+SDK包下的Tools工具
批处理-脚本案例 将下面代码保存为.bat或.cmd格式的文件,双击即可快速导出手机LOG信息,具体需要什么LOG可自己修改。
批处理与ADB之间的联系 .adb devices:查看当前已与PC端连接的设备序列号 .adb -s XX:加-s可对单一设备执行命令(XX指设备序列号) .adb install -r *.apk:安装应用程序(带-r参数可以覆盖安装) .adb uninstall cn.wps.clip:卸载应用程序(注意要用内部包名) .adb remount:(重新挂载系统分区,使系统分区重新可写) .adb shell rm system/app/ *.apk:删除系统应用(需要root) .adb shell am start -n 包名/包名+类名:启动一个Activity .adb pull /data/data/cn.wps.clip/databases/download.db 【导出应用的下载数据文件】 .常用抓取LOG命令 (1)adb shell top -m 10 -n 20 > c:\log\top.txt(top:打印CPU占用率最高的几个进程) (2)adb shell dumpsys > dumpsys.txt (dumpstate:打印手机现在的状态,包含了很多内容,比如CPU占用率,当前运行到哪一行代码,系统的属性等,“系统忙,....无响应”很多是由于死锁引起的,dumpstate对解决这类问题很有用;) (3)adb shell logcat /proc/kmsg | tee c:\log\kmsg.txt (kmsg 、kernel:打印的是内核信息) (4)adb pull /data/dontpanic c:\log (dontpanic:打印的是手机的数据中的堆栈信息) (5)adb pull /data/anr c:\log (anr:弹出 “应用程无响应 等待 强制关闭”这个对话框时留下来的信息。) (6)adb shell logcat > E:\log\logcat.txt (缓存区的LOG信息) (7)adb logcat -b radio (录无线通讯日志) (8)...... ★【Log中搜索异常关键字:FATAL EXCEPTION、NullPointerException、Indexoutof、ANR....】
有了这些代码,我们是否可以写个批处理来实现批量执行? 在CMD中直敲下面代码操作手机 有了这些代码,我们是否可以写个批处理来实现批量执行? 例1:adb shell input keyevent 3 --HOME键 例2:adb shell input keyevent 4 --Back键 例4:adb shell input keyevent 5 --电话呼叫 例5:adb shell input keyevent 6/26 --锁屏 例6:adb shell input keyevent 82--Menu键 例7:adb shell input keyevent 85--播放音乐 例8:adb shell input keyevent 7--输入字符7~ ....更多键值对可以到Google官方网查询
批处理-小工具制作 Monkey_Test关键代码: adb shell monkey -s 102 -p cn.wps.clip --kill-process-after-error -vv --throttle 1000 50000 一键安装关键代码: adb install -l -r XX.apk 一键截图关键代码: result = device.takeSnapshot() result.writeToFile('D:/KingTest/data/takeSnapshot%times%.png','png') 手机信息查看器关键代码: adb shell getevent -p adb shell getprop 李洪波 手机流量实时监控关键代码: adb shell cat /proc/self/net/dev /proc/net/dev
批处理-小工具制作 资源包审核工具:这个工具就不详述,在这里给大家展示下测试后的最终报告 录制关键代码: adb shell getevent(需要转换十六进制来获得坐标位置) 回放关键代码: adb shell sendevent /dev/input/event0 1 330 1 adb shell sendevent /dev/input/event0 3 58 53 adb shell sendevent /dev/input/event0 3 53 200(x) adb shell sendevent /dev/input/event0 3 54 380(y) adb shell sendevent /dev/input/event0 0 2 0 adb shell sendevent /dev/input/event0 0 0 0 以上4组命令必须配合使用,缺一不可 adb shell cat /proc/bus/input/devices 来获得对应设备的Evnet值
实现原理--流程图表示 自动化入口检测(单项) 读到APK 反编译 解密失败 解密成功 获得内部程序名称 无ADB 环境与 设备检测 自动设置环境 等待 安 装 失败 运行 保存LOG 卸载 退出
实现原理--流程图表示 批量应用入口检测 获取Apk 解密apk 解密失败 解密成功 获取失败 获取内部文件 未完成 无ADB 环境与 设备检测 OK 查杀 流氓软件 等待 检测合格 安 装 失败 运行 保存LOG+截图 是否完 成全部 OK 卸载 退出 记录报表
实现原理--流程图表示 一键卸载 判断root 设备无ROOT 检测环境 检测设备 读取data 读取失败 读取成功 数据处理 卸载失败 逐个卸载 卸载 打印结果 计数=0 全部卸载 退出
Question?
谢谢观赏