测试人员在找到一个问题之后从上报到修复通常是一个比较漫长而且需要大量交流的过程。很多时候开发人员常常会有以下抱怨:
“你怎么弄崩溃的?”,“我这里好好的啊”,“你从什么状态开始操作的?”,诸如此类。
大量的问来问去的语言交流使得修复的时间变长,影响进度(测试是个漂亮妹妹除外)。
虽然不同公司可能存在不同的上报流程(github上的开源项目有些不厌其扰也搞了模板),但归根结底修复的人只希望得到一个测试人员提供的可以重现的测试流程,跑一遍,重现问题。这里我们向大家分享一下如何结合多设备控制以及屏幕操作的录制重放,在多设备上实现可重现的测试流程。鉴于公司的制度和流程不同,并不一定完全适用,大家挑有用的用就是了。
介绍
最简单的录制重放,就是那一个摄像头把测试全称录下来,这样虽然能够看到测试做了什么,但是和看电影一样,修复者没法参与。所以今天使用的是我们开源的appetizer-toolkit,这个命令行工具的原理是录制触摸屏上操作,然后存成一个trace文件,下一次可以从一样的状态重放。这样听上去有点像按键精灵,当然比按键精灵要做得好,时间控制非常准确,准确到可以重放音乐手游;支持多点触摸,因为是触屏操作,所以怎么奇怪的手势都可以支持;同样,因为录制的是触屏操作,所以如果应用中间需要切换到其他应用去打开文件什么的也是没有问题的;最后,用现在的命令行工具,可以灵活结合重放以及一些常用的控制命令,例如启动应用,输入文字,并不一定要录制在屏幕上按输入法输入文字;
配置环境
首先,到github页面去下载最新版本的appetizer-toolkit,支持三个操作系统,必须是64位机器(32位的怎么办?重装吧)。对应平台的可执行在各自的文件夹下,linux/ `darwin/' 'win32/'
确认adb 都装好了(废话吧,是嘛),确认adb在PATH环境变量里面。这里以windows为例,测试一下 ./win32/appetizer.exe devices list 输出应该一串json,看看连在电脑上的设备有没有在里面
如果找不到adb,用./win32/appetizer.exe adb detectadb确认一下是否找到了adb可执行文件,如果没有,检查环境变量设置
如果发现有遗漏的设备,用adb devices检查一下设备是否是online状态,一般有些需要重新插拔
如果工具丢出一堆crash stacktrace,请到我们的QQ群(见最下面)去反映一下
调整设备到初始状态
执行./win32/appetizer.exe devices list获取目前已经连接的设备。每个设备由一个serialno标识(和adb devices得到的一样)。./win32/appetizer.exe devices control系列命令是adb的多机扩展,可以同时控制多个设备。
该命令的第一个参数是设备列表,可以是单个设备的serialno,也可以是一系列设备的serialno,用逗号隔开,例如serialno1,serialno2。
以下是控制命令的子命令:
DEVICE=serialno1,serialno2 # 设备序列号列表,注意不要有空格
./win32/appetizer.exe devices control $DEVICE uninstall com.helloworld # 卸载应用
./win32/appetizer.exe devices control $DEVICE install hellworld.apk # 安装应用
./win32/appetizer.exe devices control $DEVICE kill_all # 杀掉后台应用
./win32/appetizer.exe devices control $DEVICE launch_pkg com.helloworld # 启动应用
./win32/appetizer.exe devices control $DEVICE shell input keyevent KEYCODE_HOME # 模拟按HOME按键
./win32/appetizer.exe devices control $DEVICE shell pm grant pkg android.permission.SOME_PERMISSION # 赋予权限(小米弹框除外)
./win32/appetizer.exe devices control $DEVICE shell "input keyboard text 'Paste%stext%son%sAndroid%sDevice'" # 输入一段文本, Android 6.0前
./win32/appetizer.exe devices control $DEVICE shell "input keyboard text 'Paste text on Android Device'" # 输入一段文本, Android 6.0后
./win32/appetizer.exe devices control $DEVICE shell screenrecord /sdcard/demo.mp4 # 录制屏幕video(4.4+)
常见初始状态,包括关闭所有后台程序,回到桌面,打开待测应用,这些步骤可以用appetizer-toolkit-win.exe的命令行完成。其中./win32/appetizer.exe devices control $DEVICE shell还能用来在多个设备上执行同一个shell命令,用法和adb shell类似。一些有用的资料:
录制重放屏幕操作
运行./win32/appetizer.exe trace record trace.txt --device serialno就开始录制一个设备上接下去所有的屏幕操作了。启动录制后appetizer toolkit程序会继续接受命令行输入,输入exit回车即可结束录制。
下面的截图这样就算录制成功了
可以用./win32/appetizer.exe trace info trace.txt确认一下录制的trace的情况,比如:
json
{"contacts": 1, "description": "", "height": 1920, "length": 2.4815590000071097, "records": 52, "valid": true, "width": 1080}
表示这是个合法的trace (valid),总计2.48秒,在一个1920x1080的设备上录制的,单点触摸(contacts),记录了52个屏幕事件
重放一下刚才录制的trace,确保问题可以重现。重放命令是./win32/appetizer.exe trace replay trace.txt serialno
可以录制多段重放,在段与段间可以用 ./win32/appetizer.exe devices screenshot 1.jpg --device serialno 来保存设备屏幕截图
录制重放是支持多点触摸的,支持对时间精确度高的复杂手势,重放效果见视频
Python脚本
命令行工具可以通过命令行调用,也可以通过Python调用,Appetizer toolkit的Python SDK提供了Python接口来使用所有toolkit的功能。
中文文档在此
举个栗子:
appetizer=Appetizer('/home/haha/appetizer-toolkit/appetizer-toolkit-linux-x64')
# 列举所有已经连接的可以使用的设备
print (appetizer.devices.list())
# 获取一个设备的屏幕截图
appetizer.devices.take_screenshot("path/to/save/jpg/file", "serial_number")
# 安装APK文件到多个设备
appetizer.devices.control(["serialno1", "serialno2"], 'install', 'path/to/APK/file')
# 启动一个APP
appetizer.devices.control(["serialno1", "serialno2"], 'launch_pkg', 'com.example.app')
# 在多个设备上同时执行一个shell命令并获取返回信息
print(appetizer.devices.control(["serialno1", "serialno2"], 'shell', 'ls | grep system')
# 镜像控制:将一个设备上的触摸屏输入实时投射到多个从属设备上
task = appetizer.devices.mirror("master_serialno", ["slave_serialno1", "slave_serialno2"])
# task对象代表了正在执行的镜像控制任务
time.sleep(5)
task.stop()
加群来同行互相伤害