Android Monkey测试入门
这是一个从0到1的过程,一步一步搭建的测试接口框架,本教程从开始写框架的思路,和实现过程深入解析,并且深入到了每个相关的的各个细节,不论你是刚入门的菜鸟,还是一个懂编码经验的工程师,相信本系列的文章都会对你有所帮助。
你即可以学到从0到1搭建自动化的编码思想,也可以改变成一个接口自动化工具,在需要的时候可以自己更改代码和维护。
你可以收获什么?
1.完善python基础和编程思
2.有一个设计测试框架思维
3.提升自己能力,在也不怕面试没有编码经验
4.一个可以拿出手的项目,简历中的一个亮点
5.干货分享相比搜索到各种知识,这篇文章或许略有难度,但收获一定是你想不到的
?
(注意:干货哦,非常值得学习,点击进入学习)
App monkey 使用篇
安装包下载:
下载mumu模拟器地址:http://mumu.163.com/baidu/
下载adb安装包 地 址:http://www.downza.cn/soft/219906.html
Adb环境变量 ??配 置:在path里新建adb安装路径即可。
cmd 打开命令提示符窗口输入:adb 显示如下图即安装成功。
Adb连接mumu模拟器:
cmd 打开命令提示符窗口修改端口号:
端口修改为7555
adb??connect 127.0.0.1:7555
cmd 打开命令提示符窗口输入adb devices 如图显示即成功连接
cmd 打开命令提示符窗口输入 adb shell pm list packages (查看apk安装包名)
使用adb shell monkey - p com.tencent.mm -V 10000 即可
查看包名:查看电脑中某一位置的apk文件的包名:PC打开CMD-进入TMG目录-运行设备--查看包名aapt dump badging *.apk(apk文件的路径,可以直接拖拽)。
或者直接查看手机中存在的apk包,进入adb shell 命令后---手机的data/data文件夹--ls查看所有包名 找到要测apk的包名
monkey -pcom.tencent.mtaexample -s 23 ?--throttle2000 --ignore-crashes --ignore-timeouts -v -v -v 100000>/data/local/tmp/log.txt 2>&1 &
? ? ? ? 1. ? -p后面接着的对应的包名,如果是整机测试,就不需要 -ppackage_name
? ? ? ? 2. ? -s后面是对应的种子数,好像就是操作步骤,根据她们测试的经验,一般种子数在23,同步她们测试的结果,一般种子的个数固定为23,和她们选择的操作步骤就是同步的。
? ? ? ? 3. ? --ignore-crashes --ignore-timeouts 这里是在monkey测试的过程中遇到carash或者timeout的情况时忽略掉,一般不设置时,出现carash或者timeout时,Monkey测试会终止。这里是防止Monkey测试终止。
? ? ? ? 4. ? -v 指的是Monkey测试时打印log级别。
? ? ? ? 5. ? 100000 这里是指点击的次数,根据她们测试的经验,对于单个应用程序这个次数设置在100000次就可以了;如果是整机,一般设置在500000次。
/data/local/tmp/log.txt测试的log记录在手机上/data/local/tmp/ 下面的log.txt里面,这个名字可以自己写。
? ? ? ? 6. ? 2>&1 固定的写法,这个也很重要,代表的意思是中间忽略的东东的日志一并输入到指定的文件中。
? ? ? ? 7. ? 最后单独的一个"&" 是一旦Monkey测试开始了,之后可以拔掉数据线,不会影响Monkey测试。
? ? ? ? 8. ? 测试所有模块 ?monkey ?-s 23 --ignore-crashes --ignore-timeouts -v-v -v 100000> /data/local/tmp/log.txt 2>&1 &
六、monkey常用参数详解
-v ?日志详细程度
Level 0 ?: ?adb shell monkey ?-p fishjoy.control.menu ?-v 100 ? 最简单(默认),除了启动、测试完成和最终结果外只提供较少的信息。
Level 1 ?: ?adb shell monkey ?-p fishjoy.control.menu ?-v ?-v 100 ?提供了较为详细的测试信息,如逐个发送到Activity的事件信息
Level 2 ?: ?adb shell monkey ?-p fishjoy.control.menu ?-v ?-v ?-v 100?提供了更多的设置信息,如测试中选中或未选中的Activity信息
比较常用的是-v -v -v,一般会保存到指定文件*开发人员查找bug原因时使用
-s(随机数种子)
指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。
示例: monkey测试1:adb ?shell ?monkey ?-p fishjoy .control.menu ?–s 10 ?100
? ? ? ? ? monkey测试2:adb ?shell ?monkey ?-p fishjoy .control.menu ?–s 10 ?100
--throttle ?
指定用户操作(即事件)间的时延,单位是毫秒;如果不指定这个参数,monkey会尽可能快的生成和发送消息。
示例:adb ?shell monkey -p fishjoy.control.menu ?--throttle 3000 100?
-p ?
用此参数指定一个或多个包。指定包之后,monkey将只允许系统启动指定的app。如果不指定包,monkey将允许系统启动设备中的所有app。
--ignore-security-exception?
作用:通常,当程序发生许可错误(例如启动一些需要许可的Activity)导致的异常时,Monkey将停止运行。设置此项,Monkey将继续发送事件给系统,直到事件计数完成。
--ignore-timeouts
作用:通常,应用程序发生任何超时错误(如“Application Not responding”对话框)Monkey将停止运行,设置此项,Monkey将继续发送事件给系统,直到事件计数完成。
--ignore-crashes
作用:通常,应用发生崩溃或异常时Monkey会停止运行。如果设置此项,Monkey将继续发送事件给系统,直到事件计数完成。
--pct-touch
作用:调整触摸事件的百分比.(触摸事件是指在屏幕中的一个down-up事件,即在屏幕某处按下并抬起的操作)比如一个应用80%的操作都是触摸,那就可以将此参数的百分
比设置成相应较高的百分比。如触摸返回、触摸签到等
--pct-motion
调整motion事件百分比。(motion事件是由屏幕上某处一个down事件、一系列伪随机的移动事件和一个up事件组成)也就是直线滑动事件如从左到有滑动解锁
--pct-trackball
作用:调整滚动球事件百分比。(滚动球事件由一个或多个随机的移动事件组成,有时会伴随着点击事件)如不规则滑动解锁
--pct-nav 导航,现在手机基本没有导航了
---pct-syskeys 按键消息比例,主页、后退、音量增减
--pct-anyevent 其他不常用的按键比例的设置,不常用
--hprof ?monkey测试完成后生成内存快照,data/misc路径下生成,不常用,比较占空间
--ignore-security-exceptions ?忽略权限问题的
--kill-process-after-error 当错误发生时杀进程
--monitor-native-crashes 监视崩溃时的本地代码
七、杀monkey进程
如果想中断运行中的monkey CTRL+C
adb shell ps | grep monkey ?返回进程号
adb shell kill [刚才查到的进程号]
app包名查看:
a.手机安装包名查看器‘
?b.aapt命令 ?aapt dump badging *.apk
c、源码下的AndroidManifest.xml文件查看
d.adb logcat抓取当前Android机运行的app的包名( ?I/ActivityManager(数字): Displayed 包名/类
名: +ms )
命令行输入 adb logcat >e:\bag.txt
手机操控app,ctrl+c停止
去e:\bag.txt这个文件下搜索关键字如Displayed?,一般都能找到
?
基本用法
命令语法
adb 命令的基本语法如下:
adb [-d|-e|-s?]
如果只有一个设备/模拟器连接时,可以省略掉?[-d|-e|-s ]?这一部分,直接使用?adb 。
为命令指定目标设备
如果有多个设备/模拟器连接,则需要为命令指定目标设备。
参数
含义
-d
指定当前唯一通过 USB 连接的 Android 设备为命令目标
-e
指定当前唯一运行的模拟器为命令目标
-s
指定相应 serialNumber 号的设备/模拟器为命令目标
在多个设备/模拟器连接的情况下较常用的是?-s ?参数,serialNumber 可以通过?adb devices?命令获取。如:
$ adb devices
?
List of?devices attached
cf264b8f ???device
emulator-5554???device
输出里的?cf264b8f?和?emulator-5554?即为 serialNumber。比如这时想指定cf264b8f?这个设备来运行 adb 命令获取屏幕分辨率:
adb -s?cf264b8f shell wm size
遇到多设备/模拟器的情况均使用这几个参数为命令指定目标设备,下文中为简化描述,不再重复。
启动/停止
启动 adb server 命令:
adb start-server
(一般无需手动执行此命令,在运行 adb 命令时若发现 adb server 没有启动会自动调起。)
停止 adb server 命令:adb kill-server
查看 adb 版本
命令:adb?version
示例输出:Android?Debug?Bridge?version?1.0.32Revision?09a0d98bebce-android
以 root 权限运行 adbd
adb 的运行原理是 PC 端的 adb server 与手机端的守护进程 adbd 建立连接,然后 PC 端的 adb client 通过 adb server 转发命令,adbd 接收命令后解析运行。
所以如果 adbd 以普通权限执行,有些需要 root 权限才能执行的命令无法直接用adb xxx?执行。这时可以?adb shell?然后?su?后执行命令,也可以让 adbd 以 root 权限执行,这个就能随意执行高权限命令了。
命令:adb?root
正常输出:restarting adbd as?root
现在再运行?adb shell,看看命令行提示符是不是变成?#?了?
有些手机 root 后也无法通过?adb root?命令让 adbd 以 root 权限执行,比如三星的部分机型,会提示?adbd cannot run as root in production builds,此时可以先安装 adbd Insecure,然后?adb root?试试。
相应地,如果要恢复 adbd 为非 root 权限的话,可以使用?adb unroot?命令。
指定 adb server 的网络端口
命令:adb -P ?start-server
默认端口为 5037。
设备连接管理
查询已连接设备/模拟器
命令:adb?devices
输出示例:
List of?devices attached
cf264b8f ???device
emulator-5554???device
输出格式为?[serialNumber] [state],serialNumber 即我们常说的 SN,state 有如下几种:
offline?—— 表示设备未连接成功或无响应。
device?—— 设备已连接。注意这个状态并不能标识 Android 系统已经完全启动和可操作,在设备启动过程中设备实例就可连接到 adb,但启动完毕后系统才处于可操作状态。
no device?—— 没有设备/模拟器连接。
以上输出显示当前已经连接了两台设备/模拟器,cf264b8f?与?emulator-5554分别是它们的 SN。从?emulator-5554?这个名字可以看出它是一个 Android 模拟器。
常见异常输出:
没有设备/模拟器连接成功。
List of?devices attached
设备/模拟器未连接到 adb 或无响应。
List of?devices attached
cf264b8f offline
USB 连接
通过 USB 连接来正常使用 adb 需要保证几点:
硬件状态正常。
包括 Android 设备处于正常开机状态,USB 连接线和各种接口完好。
Android 设备的开发者选项和 USB 调试模式已开启。
可以到「设置」-「开发者选项」-「Android 调试」查看。
如果在设置里找不到开发者选项,那需要通过一个彩蛋来让它显示出来:在「设置」-「关于手机」连续点击「版本号」7 次。
设备驱动状态正常。
这一点貌似在 Linux 和 Mac OS X 下不用操心,在 Windows 下有可能遇到需要安装驱动的情况,确认这一点可以右键「计算机」-「属性」,到「设备管理器」里查看相关设备上是否有黄色感叹号或问号,如果没有就说明驱动状态已经好了。否则可以下载一个手机助手类程序来安装驱动先。
通过 USB 线连接好电脑和设备后确认状态
adb?devices如果能看到xxxxxx?device 说明连接成功。
无线连接
除了可以通过 USB 连接设备与电脑来使用 adb,也可以通过无线连接——虽然连接过程中也有需要使用 USB 的步骤,但是连接成功之后你的设备就可以在一定范围内摆脱 USB 连接线的限制啦!
操作步骤:
将 Android 设备与将运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。
将设备与电脑通过 USB 线连接。
应确保连接成功(可运行?adb devices?看是否能列出该设备)。
让设备在 5555 端口监听 TCP/IP 连接:adb?tcpip 5555
断开 USB 连接。
一般能在「设置」-「关于手机」-「状态信息」-「IP地址」找到。
?
通过 IP 地址连接设备。
adb connect
确认连接状态。如果能看到
:5555 device
说明连接成功。如果连接不了,请确认 Android 设备与电脑是连接到了同一个 WiFi,然后再次执行?adb connect ?那一步;如果还是不行的话,通过?adb kill-server?重新启动 adb 然后从头再来一次试试。
断开无线连接
命令:adb disconnect
应用管理
查看应用列表
查看应用列表的基本命令格式是
adb?shell?pm?list?packages?[-f]?[-d]?[-e]?[-s]?[-3]?[-i]?[-u]?[--user USER_ID]?[FILTER]
即在?adb shell pm list packages?的基础上可以加一些参数进行过滤查看不同的列表,支持的过滤参数如下:
参数
显示列表
无
所有应用
-f
显示应用关联的 apk 文件
-d
只显示 disabled 的应用
-e
只显示 enabled 的应用
-s
只显示系统应用
-3
只显示第三方应用
-i
显示应用的 installer
-u
包含已卸载应用
包名包含??字符串
所有应用
命令:
adb shell pm list?packages
输出示例:
package:com.android.smoketestpackage:com.example.android.livecubespackage:com.android.providers.telephonypackage:com.google.android.googlequicksearchboxpackage:com.android.providers.calendarpackage:com.android.providers.mediapackage:com.android.protipspackage:com.android.documentsuipackage:com.android.gallerypackage:com.android.externalstorage
...// other packages here
...
系统应用
命令:adb shell pm list?packages -s
第三方应用
命令:adb shell pm list?packages -3
包名包含某字符串的应用
比如要查看包名包含字符串?mazhuang?的应用列表,命令:
adb shell pm list?packages mazhuang
当然也可以使用 grep 来过滤:
adb shell pm list?packages | grep mazhuang
安装 APK
命令:adb install?
参数:
adb install?后面可以跟一些参数来控制安装 APK 的行为,常用参数及含义如下:
参数
含义
-r
允许覆盖安装。
-s
将应用安装到 sdcard。
-d
允许降级覆盖安装。
完整参数列表及含义可以直接运行?adb?命令然后查看?adb install [-lrtsdg] ?一节。
如果见到类似如下输出(状态为?Success)代表安装成功:
12040?KB/s (22205609?bytes in?1.801s)
????????pkg: /data/local/tmp/SogouInput_android_v8.3_sweb.apkSuccess
而如果状态为?Failure?则表示安装失败。常见安装失败输出代码、含义及可能的解决办法如下:
输出
含义
解决办法
INSTALL_FAILED_ALREADY_EXISTS
应用已经存在
使用?-r?参数
INSTALL_FAILED_INVALID_APK
无效的 APK 文件
?
INSTALL_FAILED_INVALID_URI
无效的 APK 文件名
确保 APK 文件名里无中文
INSTALL_FAILED_INSUFFICIENT_STORAGE
空间不足
清理空间
INSTALL_FAILED_DUPLICATE_PACKAGE
已经存在同名程序
?
INSTALL_FAILED_NO_SHARED_USER
请求的共享用户不存在
?
INSTALL_FAILED_UPDATE_INCOMPATIBLE
已经安装过签名不一样的同名应用,且数据没有移除
?
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
请求的共享用户存在但签名不一致
?
INSTALL_FAILED_MISSING_SHARED_LIBRARY
安装包使用了设备上不可用的共享库
?
INSTALL_FAILED_REPLACE_COULDNT_DELETE
替换时无法删除
?
INSTALL_FAILED_DEXOPT
dex 优化验证失败或空间不足
?
INSTALL_FAILED_OLDER_SDK
设备系统版本低于应用要求
?
INSTALL_FAILED_CONFLICTING_PROVIDER
设备里已经存在与应用里同名的 content provider
?
INSTALL_FAILED_NEWER_SDK
设备系统版本高于应用要求
?
INSTALL_FAILED_TEST_ONLY
应用是 test-only 的,但安装时没有指定?-t?参数
?
INSTALL_FAILED_CPU_ABI_INCOMPATIBLE
包含不兼容设备 CPU 应用程序二进制接口的 native code
?
INSTALL_FAILED_MISSING_FEATURE
应用使用了设备不可用的功能
?
INSTALL_FAILED_CONTAINER_ERROR
sdcard 访问失败
确认 sdcard 可用,或者安装到内置存储
INSTALL_FAILED_INVALID_INSTALL_LOCATION
不能安装到指定位置
切换安装位置,添加或删除?-s?参数
INSTALL_FAILED_MEDIA_UNAVAILABLE
安装位置不可用
一般为 sdcard,确认 sdcard 可用或安装到内置存储
INSTALL_FAILED_VERIFICATION_TIMEOUT
验证安装包超时
?
INSTALL_FAILED_VERIFICATION_FAILURE
验证安装包失败
?
INSTALL_FAILED_PACKAGE_CHANGED
应用与调用程序期望的不一致
?
INSTALL_FAILED_UID_CHANGED
以前安装过该应用,与本次分配的 UID 不一致
清除以前安装过的残留文件
INSTALL_FAILED_VERSION_DOWNGRADE
已经安装了该应用更高版本
使用?-d?参数
INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE
已安装 target SDK 支持运行时权限的同名应用,要安装的版本不支持运行时权限
?
INSTALL_PARSE_FAILED_NOT_APK
指定路径不是文件,或不是以?.apk结尾
?
INSTALL_PARSE_FAILED_BAD_MANIFEST
无法解析的 AndroidManifest.xml 文件
?
INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION
解析器遇到异常
?
INSTALL_PARSE_FAILED_NO_CERTIFICATES
安装包没有签名
?
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES
已安装该应用,且签名与 APK 文件不一致
先卸载设备上的该应用,再安装
INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING
解析 APK 文件时遇到CertificateEncodingException
?
INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME
manifest 文件里没有或者使用了无效的包名
?
INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID
manifest 文件里指定了无效的共享用户 ID
?
INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
解析 manifest 文件时遇到结构性错误
?
INSTALL_PARSE_FAILED_MANIFEST_EMPTY
在 manifest 文件里找不到找可操作标签(instrumentation 或 application)
?
INSTALL_FAILED_INTERNAL_ERROR
因系统问题安装失败
?
INSTALL_FAILED_USER_RESTRICTED
用户被限制安装应用
?
INSTALL_FAILED_DUPLICATE_PERMISSION
应用尝试定义一个已经存在的权限名称
?
INSTALL_FAILED_NO_MATCHING_ABIS
应用包含设备的应用程序二进制接口不支持的 native code
?
INSTALL_CANCELED_BY_USER
应用安装需要在设备上确认,但未操作设备或点了取消
在设备上同意安装
INSTALL_FAILED_ACWF_INCOMPATIBLE
应用程序与设备不兼容
?
does not contain AndroidManifest.xml
无效的 APK 文件
?
is not a valid zip file
无效的 APK 文件
?
Offline
设备未连接成功
先将设备与 adb 连接成功
unauthorized
设备未授权允许调试
?
error: device not found
没有连接成功的设备
先将设备与 adb 连接成功
protocol failure
设备已断开连接
先将设备与 adb 连接成功
Unknown option: -s
Android 2.2 以下不支持安装到 sdcard
不使用?-s?参数
No space left on devicerm
空间不足
清理空间
Permission denied ... sdcard ...
sdcard 不可用
?
参考:PackageManager.java
卸载应用
命令:
adb uninstall [-k] ?表示应用的包名,-k?参数可选,表示卸载应用但保留数据和缓存目录。
命令示例:
adb?uninstall?com.qihoo360.mobilesafe
表示卸载 360 手机卫士。
清除应用数据与缓存
命令:adb shell pm clear ?表示应用名包,这条命令的效果相当于在设置里的应用信息界面点击了「清除缓存」和「清除数据」。
命令示例:adb?shell?pm?clear?com.qihoo360.mobilesafe
表示清除 360 手机卫士的数据和缓存。
查看前台 Activity
命令:adb shell dumpsys activity activities | grep?mFocusedActivity
输出示例:mFocusedActivity: ActivityRecord{8079d7e u0 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher t42}
其中的?com.cyanogenmod.trebuchet/com.android.launcher3.Launcher?就是当前处于前台的 Activity。
与应用交互
主要是使用?am ?命令,常用的??如下:
command
用途
start [options]
启动??指定的 Activity
startservice [options]
启动??指定的 Service
broadcast [options]
发送??指定的广播
force-stop
停止??相关的进程
?参数很灵活,和写 Android 程序时代码里的 Intent 相对应。
用于决定 intent 对象的选项如下:
参数
含义
-a
指定 action,比如?android.intent.action.VIEW
-c
指定 category,比如?android.intent.category.APP_CONTACTS
-n
指定完整 component 名,用于明确指定启动哪个 Activity,如com.example.app/.ExampleActivity
?里还能带数据,就像写代码时的 Bundle 一样:
参数
含义
--esn
null 值(只有 key 名)
-e|--es
string 值
--ez
boolean 值
--ei
integer 值
--el
long 值
--ef
float 值
--eu
URI
--ecn
component name
--eia [,[,
例如:adb?shell am start -n com.tencent.mm/.ui.LauncherUI
表示调起微信主界面。
adb?shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast"?"hello, world"
表示调起?org.mazhuang.boottimemeasure/.MainActivity?并传给它 string 数据键值对?toast - hello, world。
调起 Service
命令格式:adb shell am startservice [options]
例如:adb?shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
表示调起微信的某 Service。
发送广播
命令格式:adb shell am broadcast [options]
例如:adb shell am broadcast -a?android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver
表示向?org.mazhuang.boottimemeasure/.BootCompletedReceiver?发送一个BOOT_COMPLETED?广播,这类用法在测试的时候很实用,比如某个广播的场景很难制造,可以考虑通过这种方式来发送广播。
强制停止应用
命令:adb shell am force-stop
命令示例:adb?shell?am?force-stop?com.qihoo360.mobilesafe
表示停止 360 安全卫士的一切进程与服务。
文件管理
复制设备里的文件到电脑
命令:adb pull ?[电脑上的目录]
其中?电脑上的目录?参数可以省略,默认复制到当前目录。
例:adb pull /sdcard/sr.mp4 ~/tmp/
小技巧:设备上的文件路径可能需要 root 权限才能访问,如果你的设备已经 root 过,可以先使用?adb shell?和?su?命令在 adb shell 里获取 root 权限后,先?cp /path/on/device /sdcard/filename?将文件复制到 sdcard,然后?adb pull /sdcard/filename /path/on/pc。
复制电脑里的文件到设备
命令:adb push ??
例:adb push ~/sr.mp4 /sdcard/
小技巧:设备上的文件路径普通权限可能无法直接写入,如果你的设备已经 root 过,可以先?adb push /path/on/pc /sdcard/filename,然后?adb shell?和su?在 adb shell 里获取 root 权限后,cp /sdcard/filename /path/on/device。
模拟按键/输入
在?adb shell?里有个很实用的命令叫?input,通过它可以做一些有趣的事情。
input?命令的完整 help 信息如下:
Usage: input [