测试开发笔记八(专项测试)

01 | App启动性能分析


基本的测试checklist和手段

image.png

专项测试(用户维度)

  • 崩溃(Crash,弱网)
  • 卡顿(掉帧,gc,cpu)
  • 响应慢(启动时间,交互响应,H5加载)
  • 发热(cpu,mem,io,network,gps等硬件使用)
  • 掉电快(硬件占用)
  • 兼容性问题(机型覆盖,回归)

专项测试(技术维度)

  • 崩溃(自动遍历,monkey测试,横竖屏切换,快速进退)
  • 卡顿(卡顿测试,内存泄漏测试,method profile)
  • 响应慢(冷仍启动,界面切换,h5性能测试)
  • 发热(method profile,gc统计,io统计,流量统计,硬件使用统计,耗电量分析)
  • 兼容性问题(兼容性测试,自动化测试,自动遍历,monkey测试)

app性能

  • android应有由很多的activity组成,这些activity的耦合度比较低
  • activity的启动流程


    image.png
  • 主要流程
    1.Application OnCreate(加载第三方的sdk等)
    2.Activity OnCreate(加载自身逻辑,发送远程数据请求,渲染界面List)

app启动性能指标

  • 冷启动(进程已被kill,或新安装的应用)建议小于5s
  • 暖启动(app在后台久了,会被内存管理kill,此时用户重启应用),建议小于2s
  • 热启动(app在后台运行),建议小于1.5s
  • 首屏启动(加上了stuff时间)

测试工具和方法

  • adb logcat
  • 录屏+视频拆帧:把1s拆成10帧,人工数帧,可以计算首屏启动时间
  • uiautomator等自动化工具,每隔200ms打印page_source的变化
  • traceview:android的分析工具
  • 硬埋点:最准确,app启动前后植入埋点,再把数据回传到服务器,需开发配合,不常用

adb logcat 使用

  • package=com.xueqiu.android
  • adb shell pm clear $package 清除缓存
  • adb shell am force-stop $package 停止进程
  • adb shell am start -S -W $package/.view.WelcomeActivityAlias 启动app
  • adb logcat | grep -i displayed 获取数据

adb logcat结果

  • startTime:记录刚准备调用startActivityAndWait()的时间点
  • endTime:记录startActivityAndWait()函数调用返回的时间点
  • WaitTime:startActivityAndWait()调用耗时(endTime - startTime)
  • TotalTime:创建进程+创建object+创建activity的时间

使用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 $package/.view.WelcomeActivityAlias # 或手动点击
adb pull /data/local/tmp/xueqiu.mp4 .
ffmpeg -i xueqiu.mp4 xueqiu.gif
ffmpeg -i xueqiu.mp4 -r 10 frames_%03d.jpg

02 | 接口性能


工具

  • 代理工具:charles,burpsuite
    1.电脑的流量都会经过charles,再到服务器
    2.抓到请回和返回数据的内容
  • 抓包工具:tcpdump,wireshark
    1.主动请求服务器,抓取服务器返回的数据包
    2.监听端口,抓取发送和返回的数据包

03 | webview性能分析


简介

  • WebView是android中一个非常重要的控件,它的作用是用来展示一个web页面。它使用的内核是webkit引擎,4.4版本之后,直接使用Chrome作为内置网页浏览器。

chrome检查中的关键选项

手机浏览器性能分析

chrome://inspect

04 | H5性能分析


参考资料

资源加载指标

  • prompt for unload:访问新页面时,旧页面卸载完成时间
  • redirect:重定向,用户注销登录返回主页面或跳转到其他网站
  • app cache:检查缓存是否打开
  • DNS:DNS查询时间,若是长连接或请求文件来自缓存等本地存储则返回fetchStart时间点
  • TCP:与服务器建立连接的时间
  • request:浏览器发起请求的时间
  • response:拿到第一个响应字节到最后一个响应字节的时间
  • processing:各种状态的时间点
  • load:触发load事件执行时间

获取单个资源的性能

浏览器 -> console -> PerformanceTiming

自动化获取性能指标

  • chrome -> console :
    1.window.performance.timing
    2.window.performance.timing.responseEnd - window.performance.timing.responseStart
  • python代码
from selenium import webdriver

class TestPerformance():
    def test_performance(self):
        driver = webdriver.Chrome()
        driver.get("http://www.baidu.com")
        print(driver.execute_script("return JSON.stringify(window.performance.timing)"))

05 | CPU统计


CPU与GPU的关系

  • 图形api不允许CPU直接与GPU通信
  • 通过中间层链接CPU和GPU
  • 中间层维护一个队列
  • CPU把display list放入队列
  • GPU从队列取数据进行绘制


    image.png

    image.png

GPU渲染工具

  • android开发者模式提供性能调优工具:开发者选项 - GPU呈现模式分析 - 在屏幕上显示为条形图

GPR显示内容

06 | mem统计


名词解释

名词术语 全拼 解释
VSS virtual set size 虚拟内存(包含共享库占用的内存)
RSS resident set size 实际使用的物理内存(包含共享库占用的内存)
PSS proportional set size 实际使用的物理内存(比例分配共享占用内存)
USS unique set size 进程独自占用的物理内存(不包含共享库占用的内存)

各指标解析

VSS:衡量虚拟内存大小无太大用处,无法知道分配物理内存大小
RSS:各进程的RSS相加,会超过系统内存使用量
PSS:各进程的RSS相加,就是系统内存使用量
USS:是PSS中自己的部分,不包含任何共享部分

procstats

  • adb shell dumpsys procstats --hours 3
  • adb shell dumpsys meminfo com.xueqiu.android

输出详解

image.png
  • 进程详情
    1.进程名称/user/versionCode
    2.状态:minPSS-avgPSS-maxPSS/minUSS-avgUSS-maxUSS
  • 100%:表示在总的时间内,进程在各种状态下的消耗(100%即在这段时间,进程一直处于运行当中)
  • total:表示进程的综合占用情况
  • Imp Fg:加载到前台
  • Service:标识是否是服务
  • Persisitent:标识是否一直驻留在内存,与service一样表示内存进驻的级别
  • Top:标识是否是顶层进程
  • Receiver:标识是否是广播进程

补充

同一时间有多个应用占用内存,测内存要对比不同版本的内存大小

07 | 网络流量分析


显示网路流量

adb shell dumpsys netstats

找到应用UID

  • adb shell dumpsys package com.xueqiu.android | grep userId
  • adb shell dumpsys netstats | grep 10051
    1.rb:receive byte
    2.rp:receiver package
    3.tb:transport byte
    4.tp:transport package

08 | 卡顿分析


cpu、网络、内存都有可能引起卡顿

systrace

  • sdk/platform-tools/systrace
  • 须python2.7

运行中遇到的问题

  • 提示"No module win32com"
    解决:pip2 install pypiwin32
  • 提示"No module six"
    解决:pip2 install six

使用

  • cd D:\Programs\android-sdk-windows\platform-tools\systrace
  • python systrace.py -e 设备 -l 进入录制模式,在设备上操作,命令行按下enter结束录制,并在systrace目录下生成result

查看报告

  • 蓝点:警告
  • cpu
  • 指定app
  • 绿色圆点:代表每一帧,点击绿色圆点,按M键显示加载时间
  • 函数调用
  • 任务状态:灰-休眠,蓝-可运行,绿-运行,橙-不响应
  • 常用命令:w-放大,s-缩小,m-找到下一帧,显示时间

卡顿影响因素

  • 内存问题(内存抖动,垃圾回收)
  • cpu(计算耗时)
  • render(布局复杂,overdraw)

帧分析

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

09 | 耗电量测试


应用耗电过大,导致手机过热,cpu降频。耗电量测试就是通过不同的测试场景,找出app高耗电的场景并解决

安装

  • golang
  • python 2.7
  • git clone https://github.com/google/battery-historian.git
  • go get -d -u github.com/google/battery-historian/...
  • 修改setup.go中的closureCompilerVersion="20190513"
  • go run setup.go
  • go run cmd/battery-historian/battery-historian.go

batterystats收集数据

  • 清理耗电量数据
    adb shell dumpsys batterystats --reset
    adb shell dumpsys batterystats --enable full-wake-history
  • 运行测试用例或手动操作
  • 收集数据
    1.android 7.0及以上:adb bugreport bugreport.zip
    2.android 6.0:adb bugreport > bugreport.txt
  • 上传数据
    1.打开localhost:9999
    2.把zip或txt上传

查看报告

image.png
  • 指标含义
    1.battery_level:电量
    2.plugged:充电状态及充电时长
    3.screen:屏幕是否点亮
    4.top:显示当前手机运行的app
    5.status:电池状态信息,充电、放点、未充电、已充满、未知等

10 | 健壮性测试


测试系统在出现故障时,能否自动恢复或忽略故障继续运行

操作过程

  • 对应用进行盲点
  • 网络不佳
  • 数据不通

使用工具

  • Monkey,Maxim,Charles,Appcrawler

11 | 弱网测试


弱网问题

  • 封闭环境,网速降低
    1.掉包
    2.数据无法加载
    3.消息更新不及时

弱网速度

  • 低于2G速率
  • 3G

模拟弱网

  • charles代理设置


    image.png
  • 设置本地代理


    image.png
  • 开启节流(Proxy-Throttle Setting -Enable Throttling)

名词解释

  • Bandwidth(带宽:理论网速上限)
    1.上行:数据流出,如上传
    2.下行:数据流入,如下载
    3.带宽的单位是Mbps,真实的网速要除以8,如带宽是10M,真实网速最高可达到1.25M
  • Round-trip Latency(请求往返延迟)
    1.客户端与服务器第一次往返通信的延迟,单位毫秒
  • MTU(最大传输单元)
    1.传输的TCP数据包的最大尺寸
  • Reliability(可靠性)
    1.衡量连接完全失败的可能性,如为50%,则只有50%的成功率

12 | 实战1


非功能测试(针对专项质量问题的测试)

  • 移动端性能问题(硬件相关,如cpu、mem、disk、network、gpu)
  • 移动端场景问题(场景相关,如弱网测试、兼容性测试、国际化)

常用的测试方案

  • android
    1.ddms
    2.android studio最新版本的集成工具
    3.hook
    4.代码插桩
  • IOS
    1.instruments
    2.hook
    3.代码插桩

app启动性能指标

  • 首次安装启动:会耗费较多时间初始化,如下载补丁、缓存数据
  • 冷启动:进程不存在(主要关注,不超过5秒)
  • 暖启动:进程存在,界面不存在
  • 热启动:界面对象依然存在,只是从后台切到前台
  • 首屏启动:第一屏加载完成

测试启app动性能的方法

  • logcat观察启动时间
  • 录屏拆帧
  • 注:通常杀掉进程,不清理数据

web性能

https://developers.google.com/web/tools/chrome-devtools/network/reference#timing-explanation

13 | 实战2


chrome中network的使用

  • 蓝线:dom 加载完成
  • 红线:所有资源加载完成
  • 捕获:查看加载图片
  • 根据 waterfall 排序 ,进行资源筛选
  • shift 查看资源依赖关系

chrome模拟手机

  • setting-devices,勾选手机

chromer中performance的使用

  • record button
  • screenshorts
  • Diable JavaScript samples 禁用js样例,禁用后调用关系简单很多
  • Enable advanced paint instrumentation


    image.png

appium性能获取

from appium import webdriver
from selenium.webdriver.common.by import By


class TestWebview:
    _package = "com.xueqiu.android"
    _activity = ".view.WelcomeActivityAlias"

    def test_webview(self):
        caps = dict()
        caps["platformName"] = "android"
        caps["deviceName"] = "hogwarts"
        caps["appPackage"] = self._package
        caps["appActivity"] = self._activity
        caps["noReset"] = True
        # 需要对应版本的 chromedirver ,才能在 webview 中执行 js 代码
        caps["chromedriverExecutable"] = "C:/develop/chromedriver/chromedriver2.20.exe"
        # 初始化driver
        self._driver = webdriver.Remote(
            "http://localhost:4723/wd/hub",
            caps)
        self._driver.implicitly_wait(15)
        # 进入到 webview
        self._driver.find_element(By.XPATH, "//*[@text='交易']").click()
        # 切换上下文到 webview
        webview = self._driver.contexts[-1]
        self._driver.switch_to.context(webview)
        # 执行 js 代码,获取性能数据
        all_time = self._driver.execute_script("return window.performance.timing")
        # 对数据进行二次操作
        response_time = all_time['responseEnd'] - all_time['responseStart']
        print(response_time)

使用adb shell 获取cpu的使用率

while true;do adb shell top -n 1 | grep xueqiu | awk '{print $3}';done

14 | 实战3


https://www.w3.org/TR/navigation-timing/#performancenavigation

navigation

  • TYPE_NAVIGATE = 0
  • TYPE_RELOAD = 1
  • TYPE_BACK_FORWARD = 2
  • window.performance.navigation.type 新打开页面,type的初始值是0,随着页面操作,type的值随之变化;如刷新页面,type的值变为1

使用js模拟浏览器动作

window.history.back()
window.history.forward()
window.location.reload()
window.location.href=“https://www.baidu.com/"
window.location.href  # 获取当前网址

将手机内容下载到本地

adb pull ///data/user/0/com.xueqiu.android/files/h5/modules_new/xueqiu.com ~/Desktop/xueqiu.com

查看webview网址

adb logcat | grep http
adb logcat -c 清除logcat

唤醒锁

https://developer.android.google.cn/topic/performance/vitals?hl=en

Amdahl定律

  • S:加速比
  • a:系统某部分所需时间与总时间的比例
  • k:性能提升比例


    image.png

    image.png

Amdahl特殊情况

  • 考虑k->无穷


    image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350