云测服务 多设备控制 + 屏幕操作录制重放 实现完整多设备测试流程

AppetizerIO · 2017年01月19日 · 最后由 达峰的夏天 回复于 2017年06月04日 · 3815 次阅读

测试人员在找到一个问题之后从上报到修复通常是一个比较漫长而且需要大量交流的过程。很多时候开发人员常常会有以下抱怨:
“你怎么弄崩溃的?”,“我这里好好的啊”,“你从什么状态开始操作的?”,诸如此类。
大量的问来问去的语言交流使得修复的时间变长,影响进度(测试是个漂亮妹妹除外)。
虽然不同公司可能存在不同的上报流程(github 上的开源项目有些不厌其扰也搞了模板),但归根结底修复的人只希望得到一个测试人员提供的可以重现的测试流程,跑一遍,重现问题。这里我们向大家分享一下如何结合多设备控制以及屏幕操作的录制重放,在多设备上实现可重现的测试流程。鉴于公司的制度和流程不同,并不一定完全适用,大家挑有用的用就是了。

介绍

最简单的录制重放,就是那一个摄像头把测试全称录下来,这样虽然能够看到测试做了什么,但是和看电影一样,修复者没法参与。所以今天使用的是我们开源的appetizer-toolkit,这个命令行工具的原理是录制触摸屏上操作,然后存成一个 trace 文件,下一次可以从一样的状态重放。这样听上去有点像按键精灵,当然比按键精灵要做得好,时间控制非常准确,准确到可以重放音乐手游;支持多点触摸,因为是触屏操作,所以怎么奇怪的手势都可以支持;同样,因为录制的是触屏操作,所以如果应用中间需要切换到其他应用去打开文件什么的也是没有问题的;最后,用现在的命令行工具,可以灵活结合重放以及一些常用的控制命令,例如启动应用,输入文字,并不一定要录制在屏幕上按输入法输入文字;

配置环境

  1. 首先,到 github 页面去下载最新版本的appetizer-toolkit,支持三个操作系统,必须是 64 位机器(32 位的怎么办?重装吧)。对应平台的可执行在各自的文件夹下,linux/ `darwin/' 'win32/'
  2. 确认 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类似。一些有用的资料:

录制重放屏幕操作

  1. 运行./win32/appetizer.exe trace record trace.txt --device serialno就开始录制一个设备上接下去所有的屏幕操作了。启动录制后 appetizer toolkit 程序会继续接受命令行输入,输入exit回车即可结束录制。 下面的截图这样就算录制成功了
  2. 可以用./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 个屏幕事件
  3. 重放一下刚才录制的 trace,确保问题可以重现。重放命令是./win32/appetizer.exe trace replay trace.txt serialno
  4. 可以录制多段重放,在段与段间可以用 ./win32/appetizer.exe devices screenshot 1.jpg --device serialno 来保存设备屏幕截图
  5. 录制重放是支持多点触摸的,支持对时间精确度高的复杂手势,重放效果见视频

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()

加群来同行互相伤害

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 11 条回复 时间 点赞

点坐标?

对,坐标,游戏最好,如果是 app 可以结合控制命令

你好,我想问下,你是一个脚本录制完了再多个手机上都能直接回放吗?针对屏幕尺寸不同如何保证的?

只要多个设备是同样的纵宽比,就可以一起重放,会自动缩放。不同纵宽比的要录不同的脚本。

@appetizer.io 使用最新的版本 1.0.2 进行录制后,实际文件没有真正录制。换使用了 toolkit 后,得到如截图错误信息

@zhzhiq7 warning 没有问题,是有些特殊设备兼容问题。toolkit 显示 “recorder stopped and saved to ./text.log"应该就是录制完成了,可以用 replay 重放一下试试。

AppetizerIO 回复

@appetizer.io 报错是在一触发了屏幕的点击事件后就自动停止的,无论是用 toolkit 或是应用程序,得到的 trace 文件都是 1k 大小的文件,即便录制很长的时间

能重放吗?1k 可能是因为压缩过了,加一下群看一下您的设备:467889502

AppetizerIO 回复

不能重放,好的,多谢。

appetizer-toolkit 1.0.4 发布,欢迎试用。

https://github.com/appetizerio/appetizer-toolkit/releases

此次更新主要是稳定性修正以及自动更新机制

增加了在非帮助命令时访问 github release 界面获取最新版本代码的功能,并且在最新版本大于当前版本时提示更新
修复了 linux 和 mac 用户在进行 record 和 take screenshot 时无法找到资源文件导致程序奔溃的问题
修复了 linux 和 mac 用户使用一些功能是遇到无法找到驱动程序的崩溃问题
增加了崩溃报告机制

AppetizerIO Appetizer 基于字节码插桩的质量监控 中提及了此贴 03月31日 14:47
老马 Appetizer 整合梳理 中提及了此贴 09月27日 17:06
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册