写点什么

专项 1

用户头像
刘帅强
关注
发布于: 10 小时前

客户端专项测试

  • 用户维度

  • 崩溃(crash,弱网)

  • 卡顿(掉帧,gc, cpu)

  • 响应慢(启动时间,交互响应,H5 加载)

  • 发热(CPU,mem,io,network, gps 等硬件使用)

  • 耗电快(硬件占用)

  • 兼容性问题(机型覆盖,回归)

  • 技术维度-崩溃- 自动遍历、monkey 测试,横竖屏切换,快速进退

  • 卡顿(掉帧,gc, cpu)-卡顿测试,内存泄漏测试,method profile-响应慢(启动时间,交互响应,h5 加载)

  • 冷热启动、界面切换、h5 性能

  • 发热(CPU、mem、io、network、gps 等硬件使用)

  • method profile,gc 统计,io 统计,流量统计,硬件使用统计,耗电量分析

  • 兼容性问题(机型覆盖,回归)

  • 兼容性测试,自动化测试,自动遍历测试,monkey 测试

APP 性能

Activity 启动流程


https://developer.android.google.cn/guide/components/activities/activity-lifecycle?hl=zh_cn
  • 主要流程

  1. Application OnCreate

  2. 加载第三方 sdk

  3. Activity OnCreate

  4. 加载自身的逻辑

  5. 发送远端数据请求 xxx.json

  6. 渲染界面 List

  • App 启动性能指标:冷启动,暖启动,热启动,首屏启动

  • 建议时间

  • Cold strtup takes 5 seconds or longer

  • Warm stsrts takes 2 seconds or longer

  • Hot starts takes 1.5 seconds or longer

  • 检测手段:adb logcat,录屏+ 视频拆帧,uiautomator 等自动化工具 200ms 巡检界面变化,tranceview,硬埋点

  • 使用 adb logcat(首屏启动之前的时间)

  • package= com.xueqiu.android

  • 清理缓存数据:adb shell pm clear $package

  • 停止进程:adb shell am force-stop $ package

  • 启动 app: adb shell am start -S -W $paackage/.view.WelcomeActivityAlias

  • 获取数据: adb logcat |grep -i displayed

  • adb logcat 结果

  • startTime :记录刚准备调用 startActivityAmdWait()的时间点;

  • endTime:记录 startActivityAndWait()函数调用返回的时间点;

  • WaitTime: startActivityAndWait()调用耗时;

  • WaitTime = endTime - startTime

  • 使用 ffmpeg 拆针

  • adb shell am force-stop $package

  • adb shell screenrecord --bugreport --time-limit 30 /data/local/tmp/xueqiu.mp4 &

  • adb shell am start -S -W $pckage/.view.WelcomeActivityAlias

  • wait

  • adb pull / data/local/tmp.xueqiu.mp4.

  • ffmpeg -i xueqiu.mp4 xueqiu.gif

  • ffmpeg -i xueqiu.mp4 -r 10 frames_%03d.jpg

  • 接口性能

  • 接口性能常用的工具

  • 代理工具:Charles burpsuit

  • 抓包工具:tcpdump wireshark

  • Webview 性能分析

  • Chrome 自带的分析工具(62)

  • Disable cache:不加载缓存,从零载入

  • 蓝线:dom 出现

  • 红线: 图片等资源已经加载完

  • waterfall 名词解释


  • Queueing :队列等待时间

  • Stalled:在队列中,停止请求

  • Waiting :服务等待时间

  • Content download: 下载时间

  • webView 在真机中需要打开 webView 调试(需要翻墙)

  • 模拟器 6.0 默认支持

  • 物理机需要打开 app 内开关

  • Chrome 版本 fix

  • 下载版本 62 的 chrome

  • 起因是 chrome 新版本取消了一个 CSS 标签的支持

  • devtool 团队暂时没有考虑修复

  • H5 性能分析

  • https://www.w3.org/TR/navigation-timing/

  • 资源加载指标

  • prompt for unload: 访问一个新的页面时,旧页面卸载完成的时间

  • redirect:重定向,用户注销登录时返回主页面和跳转到其它网站等

  • app cache:检查缓存,是否打开

  • DNS(域名系统):DNS 查询的时间,如果是长连接或者请求文件来自缓存等本地存储则返回 fetchStart 时间点

  • TCP :与服务器建立连接的时间

  • request:浏览器发起请求的时间

  • response: 拿到第一个响应字节到最后一个响应字节的时间

  • processing:各种状态的时间点

  • load:触发 load 事件执行的时间

  • 自动化获取性能指标

  • appium/selenium 的 ExecuteScript APi

  • 注入 js

  • return JSON.stringify(windows.performance.timing)

  • JSON.stringify(window.performance.timing)

  • JSON.stringify(window.performance.getEntriesByName)(document.querySelector("img").src[0],null,2)

# w3 规定的“埋点操作”class TestData:  def testData(self):    driver = webdriver.Chrome()    driver.get("https://baidu.com")    print(driver.excute_script("return JSON.stringify(window.performance.timing)"))
复制代码

卡顿分析

  • systrace

  • 这个图是怎么绘制的?

  • sdk/platform-tools/systrace

  • 需要 python 2.7

  • no module win32con

  • pip install pypiwin32-no six

  • pip2 install six

  • 使用

  • 启动设备


  • 输入命令与参数(android 模拟器为夜神)

  • python systrace -e 127.0.0.1:62001-1

  • 不加参数启动

  • 在命令行:python systrace.py -e 127.0.0.1:62001

  • 在设备上进行操作

  • 在命令行:按下 enter

  • 详细信息

  • 帧点

  • 绿:16.6ms 内,黄,红超过 16.6ms

  • 任务状态

  • 灰:休眠,蓝色:可运行,绿色:运行,橙色:不响应信号

  • 函数调用

  • GPR 显示情况

  • -o <FILE> 输出的目标文件

  • -t ,N, -time=N 执行时间,默认 5s

  • -b N, -buf-size=N buffer 大小(单位 kb),用以限制 trace 总大小,默认无上限

  • -k <KFUNCS>, -kfrace=<KFUNCS> 跟踪 kernel 函数,用逗号分割

  • -a <APP_NAME>, -app=<APP_NAME> 跟踪应用包名,用逗号分割

  • -from-file=<FROM FILE> 从文件中创建互动的 systrace

  • -c <DEVICE_SERIAL>,-scrial-<DEVICVE_SERIAL> 指定设备

  • -l, -list-categories 列举要显示的数据

  • 快捷键

  • w : 放大

  • s: 缩小

  • m: 找到下一帧, 显示时间

  • python systrace -e 127.0.0.1:62001-1

  • 卡顿影响因素

  • 内存问题(内存抖动,full gc)

  • CPU 耗时

  • render(布局复杂,overdraw)

  • 帧分析

  • 冰冻帧:一个帧超过 0.7s

  • 帧分析: adb -s devicesname shell dumpsys gfxinfo |less

  • CPU 的统计

  • CPU 与 GPU 的关系

  • 图形 APPI 不允许 CPU 直接与 GPU 通信

  • 描述

  • 通过中间层来连接这两部分

  • 中间件维护一个队列

  • CPU 把 display list 放入队列

  • GPU 从队列中拉取数据进行绘制

  • GPU 渲染工具

  • Android 开发者工具提供性能调优工具

  • GPU 渲染分析:GPU-RENDRING-PROFILE


  • https://developer.android.google.cn/topic/performance/rendering/inspect-gpu-rendering?hl=zh_cn

  • GPR 显示内容

  • 绘制每一帧所消耗的时间

  • 不同的颜色代表 UI 绘制的不同阶段

  • 并且在柱形图的中间还有一根绿色的横线代表 16ms 的绘制时间基准

  • GRP 会统计并显示 app 最近运行的 128 帧

  • 蓝色

  • View 需要先转换为 GPU 能识别的格式

  • 蓝色较高

  • View 突然无效(invalidate)

  • onDraw 函数做了复杂的绘制逻辑

  • 红色

  • OpenGL 处理 DISPLAYLIST,将处理的结果传递给 GPU

  • 红色较高

  • View 过于复杂

  • view 重复提交

  • 橙色

  • CPU 在等待 GPU 完成工作

  • 橙色较高

  • GPU 任务太多,复杂的 view 绘制

  • mem 统计

  • 内存耗用名词解析

  • VSS Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)

  • RSS Resident Set Size Resident Set Size 实际使用物理内存(包含共享内存占用的内存)

  • PSS Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)

  • USS Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

  • 内存占用规律 :VSS >=RSS >=PSS >= USS

  • procstats

  • adb shell dumpsys procstats --hours 3


  • 输出格式

  • 进程名/USER/VersionCode

  • 状态:(minPSS-avgPSS-maxPSS/minPSS-avgUSS-maxUSS over samples)

  • 输入字段解释

  • 百分比:表示在总的时间内,进程在各种状态下的消耗

  • TOTAL:表示了进程的综合占用情况

  • Img Fg: 加载到前台

  • Service:标识了是否是服务

  • Persistent: 标识了是否一直驻留在内存中,与 Service 一样,表示内存进驻的级别

  • Top: 标识了是否是顶层进程

  • Receiver:标识了是否是广播进程

  • meminfo 内容:

  • 指定包名: adb shell dumpsys meminfo com.baidu.BaiduMap

  • 未指定包名 :adb shell dumpsys meminfo

在未指定包名是排序是从大到小的顺序排列的

  • 针对手机中同时存在多个应用在使用内存,这时应该测不同版本做内存对比情况

  • 网络流量分析

  • 显示网络流量

  • adb shell dumpsys netstats

  • 模拟器会报异常


  • 分块展示

  • Active interfaces :活动接口

  • Activity UID interfaces :活动 UID 接口

  • Dev statistics: Xt 统计信息

  • UID statistics :UID 统计信息

  • UID tag statistics: UID 代码统计信息

  • 活动接口和活动 UID 接口

  • Activity interfaces:

  • iface = wlan() ident = [{type=WIFI, subType = COMBINED, networkId ="GoogleGuest"}]

  • 找到 UID

  • adb shell dumpsys package com.baidu.BaiduMap |grep userId

  • userId = 10007 gids = [3003, 1028, 1015]


  • 查看相关应用的流量情况

  • set = DEFAULT 表示前台网络使用情况

  • set = BACKGROUND 表示后台使用情况

  • set = ALL 表示上述两类使用情况

  • tag = 0x0 表示与流量关联的套接字代码

  • rxBytes 和 rxPackets 表示在响应时间间隔内接受的字节数和数据包

  • txBytes 和 txPackets 在响应时间间隔内发送的字节数和数据包数

  • 耗电量测试

  • 待机时间成关注指标

  • 提升用户体验

  • 通过不同的测试场景,找出 APP 高耗电的场景并解决

  • 安装

  1. git clone https://github.com/google/battery-historian.git

  2. 注意编译版本 改为 20190513


  1. cd battery-historian

  2. $ go get -d -u github.com/google/battery-historian/... # -d -u 不运行只拉取

  3. go run setup.go

  4. go run cmd/battery-historian/battery-historian.go

  • 测试步骤

  • 使用 batterystats 生成数据

  • 使用 Battery historian 分析数据

  • batteryststs 收集数据

  1. 清理耗电量数据

  • adb shell dumpsys batterystats --reset

  • adb shell dumpsys batterystats --enable full-wake-history

  1. 运行测试用例/手工操作(长时间间耗电操作)

  2. 收集数据(数据收集需要时间)

  • Android 7.0 :adb bugreport bugreport.zip

  • Android 6.0 : adb bugreport > bugreport.txt

  1. 上传数据

  • 打开 localhost:9999,把 zip 或者 txt 数据上传

  • historian

  • 进入 historian

  • x 轴代表时间周期,默认以 60s 为一个周期

  • 指标含义

  • battery_level:电量

  • plugged: 充电状态及充电的时长

  • screen :屏幕是否被点亮

  • top:显示当前手机是运行 APP

  • status: 电池信息,有充电,放电,未充电,已充满,未知等不同状态。

  • 弱网测试

  • 封闭环境,网速降低

  • 丢包

  • 数据无法加载

  • 消息更新不及时

  • 弱网速度定义

  • 低于 2G

  • 3G

  • 弱网模拟

  • Charles

  • 操作步骤: 设置代理--> 开启节流 Proxy->Throttle Settings -> Enable Throttling

  • 打开模拟器-- 设置--代理(wifi)

  • 字段解释

  • Bandwidth 理论网速上限(带宽)

  • Utilisation 总宽带的百分比(利用)

  • Round-trip Latency 客户端与服务器第一次往返通信延迟,单位毫秒(请求往返延迟)

  • MTU 传输的 TCP 数据包的最大尺寸(最大传输单元)

  • Reliability 衡量连接完全失败的可能性 (可靠性)

  • 常用网速的展示

  • 健壮性测试

  • 用于测试系统出现故障时,是否能够自动恢复或者忽略故障继续运行

  • 操作过程

  • 对应用进行盲点(monkey) monkey -s 100 20000

  • monkey 如何验证?--和之前的崩溃卡顿检测结合起来

  • 网络不佳

  • 数据不通

  • 使用工具

  • Monkey, Maxim

  • Charles

  • Appcrawler

兼容性测试

  • 几个硬件之间,软件之间,或者是软硬件之间的相互配合程度

  • APP 兼容性测试

  • 移动设备型号多样

  • 测试 APP 在主流设备上能否正常运行

  • 测试 APP 在主流设备上崩溃卡顿现象

  • 兼容性测试作用

  1. 进一步提高产品质量,提高用户体验

  2. 尽可能达到平台无关性

  3. 保证软件存在价值,是衡量软件质量的重要指标

  4. 是产品的市场更广阔

  • 测试方法

  1. 手工测试

  2. 借助第三方工具

  • appcrawler

客户端测试平台

自动化遍历测试技术

  • 移动端业务问题

  • 业务线众多

  • 业务流程复杂

  • 依赖传统券商一些资源

  • 雪球 APP 存在的问题

  • 存在股票信息字段丢失或者数据异常

  • 微信分享不可用

  • 用户网络慢时发出请求后退出当前页面发生崩溃

  • 某些界面在 4.4 和 5.0 的系统上操作体验不同

  • 界面崩溃

  • 解决办法

  • 自动化解决

  • 产品迭代快速

  • 学习设计模式(PageObject)

  • 手工解决

  • 界面字段正确性:比如股票相关数据变化,共数十个字段

  • 接口正确性:后端接口传入数据的变化和内容

  • 专项测试回归难度大:内存泄漏、健壮性测试、弱网测试过程太多

  • 回归测试工作量大:不回归又会漏测

  • 改进策略

  • 自动化测试

  • 覆盖主要业务的 right path

  • 缩小规模尽量降低维护成本

  • 手工测试

  • 覆盖新功能测试

  • 探索性测试

  • 自动遍历测试

  • code less :用例维护成本降低到最低

  • automate: 尽可能的自动化覆盖回归业务

  • 常见遍历工具与技术

  • google android 原生 monkey, app crawler

  • 百度 smartmonkey

  • 腾讯 newmonkey

  • vigossjjj smart_monkey

  • macaca NoSmoke

  • 头条的 zhangzhao maxim

  • seveniruby appcrawler

android monkey 遍历技术

  • monkey 内部源码:

  • 简介

  • Monkey 是在一个模拟器或设备上运行的程序

  • 生成用户事件的伪随机流

  • 安装

  • Android SDK 提供了 Monkey 工具

  • 使用移动设备

  • 使用

  • 基本配置选项,例如设置事件数量

  • 操作约束,例如对指定 APP 进行测试

  • 调试选项

  • adb shell monkey [options] 事件计数

  • Monkey 常见命令

  • adb shell monkey 100 对所有包随机操作

  • adb shell monkey -p com.xueqiu.android 100 对指定包

  • adb shell monkey -p com.xueqiu.andoid -s 20 80 时间种子

  • adb shell monkey -p com.xueqiu.android -vv -s 20 80 详细日志

  • 时间延迟

  • adb shell monkey -p com.xueqiu.android --throttle 5000 1000

  • 事件百分比

  • adb shell monkey -p com.xueqiu.android --pct-touch 10 1000

  • 常用事件

  • --pct-touch :触摸事件,比如点击

  • --pct-motion : 动作事件,比如滑动(直线)

  • --pct-trackball :轨迹事件, 比如移动+ 点击,曲线滑动

  • --pct-majornav : 主要导航事件

  • --pct-majornav :主要导航事件,比如回退案件,菜单按键

  • Android maxim 遍历测试工具

  • 使用

  • 部分开源

  • https://github.com/zhangzhao4444/Maxim

  • adb push framework.jar/sdcard

  • adb push monkey.jar/sdcard

  • adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec

  • app_ process /system/bin tv.panda.test.monkey .Monkey -P

  • com.panda.videoliveplatform -uiautomatormix --running -minutes 60-v -V

  • 策略

  • 模式 DFS--uiautomatordfs

  • 增加深度遍历算法

  • 模式 Mix --uiautomatormix

  • 使用 accessibilityserver 获取界面接口解析各控件

  • 随机选取一个控件执行 touch 操作

  • 同时与原 monkey 其他操作按比例混合使用

多平台自动遍历技术测试工具 appcrawler

appcrpawles 开源地址:https://github.com/seveniruby/AppCrawler

与其他框架的关系

  • appcrawier 底层引擎- appium- adb- macaca- slelenium- appium 底层引擎- wda- uiautomato2Appca- appCrawler 环境要求


- appcrawlwe 2.5- java8 appium 1.8.X- 安装方法- 直接下载- 从源码编译- 备注- 后面提到的 appcrawler 命令或 java -jar appcrawler.jar 皆表示用 jar -jar 命令执行对应版本的 jar 包文件- java -jar appcrawler-2.4.0-jar-with-dependcies.jar- quick_start- 启动 appium- 启动模拟器或者链接真机- 开始自动遍历- appcrawler --capability- "appPackage = com.xueqiu.android.appActivity=.view.WelcomeActivityAlias"- 生成样板配置样式- 常用事件- 执行参数与配置文件- capability 设置:与 appium 完全一致- appPackage :"com.xueqiu.android"- appctivity:".view.WelcomeActivityAlias"- app:- appium:"http://127.0.0.1:4723/wd/hub"- noREset:true- automationName:uiautomator2- dontstopAppOnRset:true- testcase:用于启动 APP 后的基础测试用例- testcase 的完整形态- given: 所有的先决条件- when: 先决条件成立后的行为- then:断言集合- testcase 的简写形态- xpath:when 里的 xpath- action:对应 when 的 action- triggerActions: 特定条件触发执行动作的设置- 执行参数比配置文件优先级别高- 自动遍历支持- selectedList: 需要被遍历的元素范围- firstList: 优先被点击- lastList:最后被点击- tagLimitMax: 同祖先(同类型)的元素最多点击多少次- backButton:当所有元素被点击后默认以后退控件定位- blackList: 黑名单- maxDepth:6 遍历最大深度- 触发器- triggerAction- 需要特定次数的触发动作- 通常用于处理弹框- xpath:指定具体按钮- action:动作- times :规则的使用次数- log 文件解读- 自动遍历过程- 信息获取- 把当前 APP 界面 dump 为 xml 结构- 获取待遍历元素- 遍历范围 selectedList- 过滤黑名单 小控件 不可见控件 blackList- 重排控件顺序 firstList lastList- 跳过已点击+ 跳过限制点击的控件 tagLimit- 根据匹配的规则执行 Action- 循环上面的步骤

多设备管理方案

多设备管理平台 STF


  • 简介

  • 源码位置: https://github.com/openstf/stf

  • OpenSTF 是一个手机设备管理平台-可以对手机进行远管理,调试,远程手机桌面监控等操作

  • docker 安装

  • 拉取镜像

  • docker pull opentf/stf:latest

  • docker pull sorccu/adb:latest

  • docker pull rethinkdb:latest

  • 启动 rethinkdb

  • docker run -d --name rethinkdb -v/srv/rethinkdb:/data --net host rethinkdb rethink --bind all --cache-size 8 1 9 2 --http-port 8 0 9 0

  • 启动 stf

  • docker run -d --name stf --net host openstf/stf stf local --allow-remote

  • loclhost:7100

跨设备管理方案 selenium Grid

  • selenium grid 远程运行 selenium test

  • 主旨是在多个机器上并运行运行 selenium

  • 优点

  • 所有测试的中心入口点

  • 管理和控制浏览器运行的 Nodes/环境

  • 扩展

  • 并行运行测试

  • 跨平台的测试

  • 负载平衡

  • 组成

  • client --> HUB---> NODES

  • 官网: https://www.selenium.dev/downloads/hub

  • java -jar selenium-server-standalone-3.141.59.jar -role hub node

  • java -jar selenium-server- standalone-3.141.59.jar -role node -port 5677

  • 配置文件启动 Node

  • java -jar selenium-server-standalone.jar -role node -nodeConfignode1Config.jison

  • https://www.selenium.dev/documentation/en/grid/setting_up_your_own_grid/

  • 查看 github 中的项目文档

基于 Jenkins 的自动化调度详解

  • 自动冒烟测试

  • 自动化遍历测试

  • 自动遍历测试运行

  • 兼容性测试

核心依赖资源

  • 设备集群:真机,模拟器,云端设备

  • 管理平台:STF, Jenkins, Selenium Grid

  • 测试用例:遍历工具,测试用例

用户头像

刘帅强

关注

还未添加个人签名 2019.05.14 加入

测试小白 短期计划为:构建 测试开发的全貌,而非死磕某个知识点。

评论

发布
暂无评论
专项1