性能测试工具 性能测试之用例得分评价和 CPU 内存数据监控——谈谈个人看法和实践总结

浮云 · 2015年07月21日 · 最后由 水兵月 回复于 2016年11月30日 · 7110 次阅读
本帖已被设为精华帖!

一、关于项目需求——按需定制测试方案

说到性能测试的 cpu 及内存优化和异常发现,不同产品以及测试人员隶属(服务对象)不同,测试要求和测试目的是不同的,下面按个人理解分别说明下:

1、测试人员的隶属(服务对象)

(1)隶属功能测试组

  • 服务对象
    • 服务于各部门对版本上线的评估,将版本中发现的问题提交研发人员修改。
  • 特点
    • 黑盒功能测试,见不到代码也不关心代码逻辑。
    • ——依据测试策略所出的报告结果评估版本风险,给版本是否发布提供依据,提交的 bug 是依据现象和测试数据,优先级是对用户的影响和后果严重性。
    • 功能测试组的自动化/工具组,服务于黑盒功能测试。
    • ——提供解放人力的自动化脚本方案解决部分人工压力,为特定测试需求提供脚本方案/工具,产出是要交付测试流程的。
  • CPU/内存测试目标
    • 监控数据标准,及时提出优化改善意见并监控衰减;发现异常情况 bug:内存泄露,CPU 负载异常。
  • 测试方案建议
    • 监控数据采集及呈现方案附加在测试流程中,特别需求建立专项评估测试。根据版本周期长短调整测试内容,控制测试用例粒度。
注:我主要从事就是此类工作,有实践成果后文介绍。

(2)隶属于研发测试组(多见于 BSP 研发团队)

  • 服务对象
    • 服务于研发人员对修改引入风险的专项测试需求,研发人员在测试版本上的内部评估。
  • 特点
    • 自动化脚本测试,服务于开发人员的测试,根据研发对代码修改可能带来问题的猜测,组织测试方案验证,可以看到代码。
  • CPU/内存测试目标
    • 验证研发人员代码设计上的问题及模块改动带来的风险。
  • 测试方案建议
    • 根据代码逻辑及加载的资源大小加 log 获取数据,对应逻辑行为统计分析数据,需要和研发人员的沟通结论基础和代码分析基础。
注:由于本身自己未从事此类工作,只是说明下如果我做会是这个思路

二、本人关于性能测试的方案设计与实践经验——测试标准和研发人员推动力非常重要

1、测试标准

(1)性能测试标准要多部门参与制定,大多数人认可

(2)基于用户体验的标准将研发排除在外,按照:

  • 其他部门设定标准
    • —>通知研发
    • —>研发质疑标准(如果有)
    • —>竞品数据对比(说服研发或修正标准)
    • —>稳定落实到测试流程长期监控。

2、测试数据评价的监控

(1)思路:

  • 依据测试标准设计按 case 评价得分的打分体系,根据总分变化呈现性能监控,报告监控数据变化,依据数据分析重点衰减用例。

(2)打分原则:

  • Ⅰ、用例归类,按类别分权重。(评估版本相关部门参与制定权重)
  • Ⅱ、用例权重分类,按对于评估用户体验的价值分为三档。
    • 基础为 1;用户频繁常用场景 +1;用户多数在使用的测试条件 +1
    • 用例评分=(所属测试类权重/用例价值总计)* 此条用例的用例价值
  • Ⅲ、设计用例打分原则
  • Ⅳ、设计数据统计展示方式:
    • 我是采用的设计 excel 公式模板,每次贴数据自动计算,更新趋势图数据范围即可

3、性能测试用例设计及测试数据采集

(1)采集响应时间

  • 加载时间,翻页时间,开关机等,根据项目需求设计

(2)取数据方式

  • 录像数帧出数据,脚本获取时间等数据采集方式,根据数据准确性和精度要求评估

4、结果监控形式

(1)评分走势分析

  • 评分降低,重点分析衰减项,超标准则提交 bug 由研发人员分析

(2)报告反馈与推进解决

  • 测试结果报告发给所有评估版本质量的部门,多部门参与推动问题分析解决进度。

三、内存及 cpu 监控方案

1、测试方案选择

(1)测试流程内集成监控方案收集数据

  • 数据可视化展示及分析数据,形成报告产出 bug
    • ->下一个版本测试流程内回归验证修改(如有特定需求,可定制专项测试,测试版本验证)
  • 适用条件
    • 有成型测试模型和测试流程的,并且版本测试周期内测试时间充分的项目
  • 说明
    • 我这边的测试需求是系统软件版本整体的测试,也包括重点进程的测试监控,既要监控 java 层的进程也包括 Native 层的进程,还有集成 so 的 NDK 开发的应用进程。而且有成型的版本测试模型和流程,每部分测试都有指定的测试组负责。所以自己设计了监控方案集成到测试流程内,提供可视化分析方法便于交付。
  • 集成监控测试的场景例举
    • Daily Smoke 自动化脚本;MTBF 稳定性测试;新增功能性能评估;专项测试评估;稳定性压力测试评估;OOM crash 类 bug 复现数据分析等。
  • 成本开销
    • 增加分析结果,验证复现的定位分析投入。

(2)细化测试用例粒度,选择重点风险用例采集数据评估具体的操作细节。

  • 适用条件
    • 测试周期短,人力投入有限,没有长期稳定的测试流程的项目。
  • 说明
    • 没做过这类测试,未实践尝试,只是个人认为此类测试应该是这个思路。

2、我所实践的监控方案设计

(1)采集数据:

  • Ⅰ、总 CPU 和进程 cpu
    • 来源:busybox top -b -n 1
    • 选择原因:比 top 命令执行响应速度高,耗时 0.2S 左右,top -t 需要 3s 左右;并且精度到 0.1,花括号内有正在处理的进程参考
  • Ⅱ、总内存
    • 来源: /proc/meminfo
    • 取关注的项:MemFree,Buffers,Cached,Active,Inactive,Active(anon),Inactive(anon),Active(file),Inactive(file),Dirty,Writeback,Mapped,Slab,包含 CMA 模块的增加 CMA Free
  • Ⅲ、进程内存
    • 来源首选:dumpsys meminfo 进程PID
    • 获取:Native Heap Size;Native Heap Alloc;Native Heap Free;Dalvik Heap Size;Dalvik Heap Alloc;Dalvik Heap Free;Totle Pss;Dalvik Pss;Dalvik
    • 来源备选:如果 native 进程取不到则用cat /proc/进程pid/smaps|grep Pss求和取 Pss
  • Ⅳ、获取时刻显示的 Activity
    • 来源: dumpsys window w|grep mFocusedApp|busybox awk '{print $5}'|busybox tr -d '}'
  • Ⅴ、获取时刻的时间
    • 来源: date +%Y/%m/%d" "%H:%M:%S
  • Ⅵ、系统启动后运行时间
    • 来源: busybox awk -F. 'NR==1{print $1}' /proc/uptime
    • 注:用于分析执行监控的时刻及准确的获取数据间隔

(2)数据格式化输出

  • Ⅰ、总 cpu——cpu.csv
    • Loop:10,Time,Activity,usr,sys,nic,idle,io,irq,sirq,Data Time
    • 注:10 是设定的间隔,使每个 csv 可以直接取到间隔用于计算时间;Time 是开机已运行时间
  • Ⅱ、进程 cpu——cpuinfo.csv
    • Loop:10,Time,PID,%CPU,Command,avgs,Thread
    • 注:Thread 是花括号{}内的进程,avgs 是命令行后的参数,都有的情况优先取命令行参数。
  • Ⅲ、总内存——mem.csv
    • Time:10,MemFree,Buffers,Cached,Active,Inactive,Active(anon),Inactive(anon),Active(file),Inactive(file),Dirty,Writeback,Mapped,Slab
    • 注:选择在 cpu.csv 中记录 loop 是由于需要有列 loop 数据判定脚本抓取数据是不是连续正常的,而这里可以用行号计算。
  • Ⅳ、进程内存——meminfo.csv
    • Loop:10,Time,PID,Process_Name,Pss,Native_Heap(Size),Native_Heap(Alloc),Native_Heap(Free),Dalvik_Heap(Size),Dalvik_Heap(Alloc),Dalvik_Heap(Free),Dalvik_Pss,Avgs
    • 注:Avgs 是进程的命令行参数,/proc/进程 PID/cmdline 取的数据

(3)数据可视化展示——highcharts

  • Ⅰ、控制每张图的数据量
    • 显示数量在 400 以内,时间段切片显示,默认按照 1 小时,根据间隔变化调整
    • 原因:由于数据量限制一张图默认最多展示 1000 个点,加上数据点越多打开及交互响应慢
  • Ⅱ、所有图共用数据
    • 每个点显示:Activity;系统时间
  • Ⅲ、进程 CPU 数据线和内存数据线总体设计
    • 同进程跨间隔 loop 数之间 cpu 记 0;新增 PID 标红点;同一时间点同名多进程存在则横坐标累加 1/10n 标黄点,n 为同一 loop 的重复次数。
  • Ⅳ、进程 CPU 数据图
    • 按峰值降序排列显示 top5;可多选交互更新;有参数数据的查看点信息时进程同颜色展示;
  • Ⅴ、总内存图:
    • 总内存图:剩余内存=MemFree+Buffer+Cache,Active,Inactive,io=Dirty+Writeback,Mapped,Slab;
    • 剩余内存图:剩余内存,MemFree,Buffer,Cache,如有 CMA 则增加 CMAFree
    • Dirty 和 Writeback 图:Dirty 和 Writeback
    • Active 和 Inactive 图:Active,Inactive,Active(anon),Inactive(anon),Active(file),Inactive(file);
    • Mapped 和 Slab 图:Mapped,Slab
  • Ⅵ、进程内存 PSS 多选展示图:
    • 按每张图数据,进程 PSS 峰值降序排列
  • Ⅶ、单进程内存数据展示图:
    • 按进程 PSS 极值差降序排列;java 进程显示 heap 详细数据,native 进程只显示 PSS
  • Ⅷ、附加
    • 数据双横轴切换:sleep*loop 传参数的计算时间;Time 是精确每个取数据命令获取的开机已运行时间;
    • 更换图标主题和生成图片的 highcharts 功能

3、方案采取的脚本设计

(1)shell 脚本获取数据:

  • 按顺序获取
    • ->显示的 Activity
    • ->系统时间
    • ->CPU
    • ->总内存
    • ->进程内存(最大限制并发 5 子进程获取)
    • 注:监控所有进程采集数据开销大,当前优化后的逻辑也需要 6-8S 采集一次,随进程增多会增长;单进程获取可以在 1S 完成。

(2)Python 转换数据为 json:

  • 按显示模板设计生成指定形式的 json 文件,并和模板文件一起打包成 zip

(3)node-webkit 框架数据展示:

  • 由于需要加载本地 json 文件,最后选取了此框架展示,以解决浏览器本地文件读取限制问题及处理性能问题。

4、效果展示





考虑了下,还是把工具放出来吧,有想尝试的可以实际试下效果。

1.关于兼容:只是适配了乐视项目情况,是否适用所有兼容机情况没什么把握
2.关于使用前提:需要 root+busybox
3.平台说明:已打包了 windows 下的 exe;shell 脚本可以直接 push 使用不涉及平台兼容;CSVtoJson.exe 就是将 output.py 打包成了 exe;MCM 结果显示.exe 就是打包了 node-webkit 框架的 win32 版本,由于此框架本身是跨平台的,可自行解决跨平台需求。
4、如果想修改为在线版本加载 json,需要修改 Html 模板中的 json 加载部分,MCM_HTML/head/mcm.js 里 node 加载 json 的语句为在线获取。

重构 (https://testerhome.com/topics/3685

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

屏蔽理由,排版无法看。

你们的论坛运营管理会不会简单粗暴了些,对于不同帖子管理方式应该不一样,像这种分享内容丰富的帖子,说实话对于论坛来说是帮论坛拉人气的,你们要求规范是可以,但是能不能用另一种方式通知作者,别人既然能辛苦的分享内容出来,我想委婉的沟通,别人也愿意更改格式,但是你们这样处理,会不会打击别人积极性,会不会影响其他人发帖的积极性呢,很多事情不是不能做,是怎么好让别人接受的问题。。。

浮云 #44 · 2015年07月22日 Author

Sorry,昨天忙着整理思路,写成了 word。贴过来后,调整了下内容就没排版。今天重新排版了下

#3 楼 @xiaoyan 都是做测试的,平时你们都怪和其他人沟通那么难。简单点不是很好么?比如你发现程序有个 bug,你要怎样委婉的告诉开发呢?

#3 楼 @xiaoyan 打击积极性?呵呵,做一个事情要有专业性,什么专业性?就是如果要做一件事情,那么就认真负责的去做,而不是发一个文章发掉就发掉了。另外积极性是自己自发的,如果就这点事情就打击了,那么也成不了什么大事。让别人接受的最好的方式就是直接了当,如果都是好话,都是委婉的话,这个行业的人不会改变,这个行业也不会改变

#4 楼 @sandman 嗯嗯。好的~~感谢

@sandman 是个非常 nice 的人。 @xiaoyan 其实我都会主动先去找他私聊下。 主要是论坛是公众平台。我们也不是专营这个平台。需要很多时间管理的话,我们也忙不过来。严格要求自己,这是我们对论坛受众的基本要求。

@lihuazhang @monkey 第一,我没有说文章规范化不行 第二,我刚刚说的是你们想要实现论坛规范化的手段,是不是运营管理方法只有一种,这样处理会不会影响论坛发帖的活跃度,对于分享内容丰富的作者是不是该鼓励?能不能有其他方法对于这种类型的帖子?怎么一说就这么极端呢?让别人接受的最好方式就是直接了当,请问这个有哪里论证过。。。

#9 楼 @xiaoyan 极端啥?你要先明白一点,做事情要专业,要对自己有要求。如果没有要求,那么就不要做,在我看来,指出这点就是要直接了当。另外要说论证的话,测试行业我已经论证的不能再论证了。不直截了当只会让很多人误会,意识不到自己的问题。所以我们讨论问题先看源头,做事情的人专业了,我们再谈所谓的活跃度,所谓的鼓励。为什么老是要降低要求呢,我很不明白

#9 楼 @xiaoyan 感觉是你自己想的极端了。活跃度不是我们的诉求,高质量的文章同时有活跃度是我们的诉求。如何更好的分享自己的知识是门艺术。不是说,我扔出来就是了。 所以排版也是第一的要求。运营管理的方法有很多,比如之前直接删除。

从头到尾,我们没有说过 “让别人接受的最好方式就是直接了当”。我们只是说这样是最有效率的。每一个生产内容的都是开发,每一个开贴的都是用户,你指望用户和你客气么?

12楼 已删除

楼上们评论偏离文章, 差评。 文章写的很好。 赞。

快快给个打赏二维码~~

#15 楼 @apert 不错的主意哦~

#15 楼 @apert 哈哈以后每个文章都挂个~~~

我想请问一下,最后的图表是用什么工具生成的?

浮云 #29 · 2015年07月22日 Author

@watman 正文中写了所有设计框架和思路。shell 脚本获取数据 +python 处理 csv 为目标 json+highcharts 模板,用 node-webkit 框架展示

#17 楼 @monkey 可以看作者喜欢挂个人或者挂 Testerhome 的...精品帖好难求,大家都好忙

浮云 #22 · 2015年07月22日 Author

已放出工具,我也是整体设计完逻辑,按逻辑需求直接拼凑代码逻辑完成的。python,html,js,highcharts 和 node-webkit 也是没怎么深入了解直接上手搜实例参考,上手直接写。遇到 bug 和改善意见,可以在这里回复,以便进一步优化下。

#22 楼 @sandman 浮云 放到 github 上会好很多

浮云 #24 · 2015年07月22日 Author

@lihuazhang 本不想把这个工具做成开源项目,也是为了将工具和文章关联在一起,展示的是设计思路。
写这篇文章,起因主要是两点,一个是本身我在 testerhome 群里讨论过两次监控的事了,第一次也展示过我的设计思路和截图效果。第二次又开始讨论就感觉自己需要写一下了,要不每次见到性能测试相关讨论就想吐槽点什么,而结果又是反复说类似的事情,不如一次写清。
本身写出来也是为了从我现在做的事情来讨论框架思路,和设计思路。工具展示出来也是想展示成品效果,及我对数据可视化的设计。
展示出我当前设计的性能测试框架思路,也是希望在更多人的讨论中,可以扩展实际可落实到流程的想法。更多人的想法碰撞,可能会出火花的。

好文,求助的人请看此贴。

浮云 #26 · 2015年08月26日 Author

工具更新了几个问题:
1、获取 activity 的源数据格式 TV 和手机格式不同,按正向第五个取数据而不是之前的倒数取数据
mFocusedApp=AppWindowToken{425a3510 token=Token{42665e80 ActivityRecord{42665d30 u0 com.letv.leso/.activity.SearchBoardActivity}}}
mFocusedApp=AppWindowToken{2a336cc7 token=Token{18b95356 ActivityRecord{a3b7971 u0 com.android.settings/.UsbSettings t34}}}
2、在手机系统性能慢的时候,退出 app 存在虚拟机退出和进程退出之间存在时间差,” dumpsys meminfo 进程 PID “未取到数据但” cat /proc/进程 pid/smaps|grep Pss 求和取 Pss“取到了。最终处理 csv 到 json 过程有处理错误。

好文章!

受益匪浅。

orz 跪了

看来是乐视的小兄弟啊, 写的不错, 总结的也很认真.赞一个.

浮云 #31 · 2015年10月20日 Author

#30 楼 @seveniruby 哎,测试行业混迹 8 年了,从手游到安卓 TV,从 java 功能机到智能机,从功能到自动化再到性能,折腾来折腾去。这是总结在乐视实践性能优化的过程,一个人从零到搭建方案建立流程,持续调整优化改善。根本目标是控制用户体验改善和版本性能情况监控。性能优化本身不是测试一个部门搞得定的,所以致力于推动多部门间的合作。总结的就是推动的办法,及收集数据作为推动的证据。设计测试筛查方案引导研发资源投入到明显改善用户体验的点上。

如果增加一个队内存数据的进一步分析和处理,就更好了,可以提供更直接的弹药给研发

浮云 #15 · 2015年11月05日 Author

#32 楼 @zongguanxian 只考虑了测试数据抓取和引导分析数据的方向,主要目的是像过筛子一样,先过第一道筛子:
1、PSS 峰值越高可优化空间越大,PSS 峰值降序排列,可以优先看优化利益大的进程。
2、PSS 极值差越大,被怀疑内存泄露的可能性越大,极值差降序排列优先看风险最高的。
3、单进程走势图分析,观察 PSS 波动大的部分的 Activity 变化,及对应 log 时间分析操作,进一步确定导致内存波动的操作;可以针对这些操作做进一步测试和跟踪分析。

所谓大浪淘沙,得先让沙子沉下来,再取沙子来分析。

额,分享的工具不在了???

浮云 #13 · 2015年12月30日 Author

#34 楼 @alfor 重构了之前的就删了 (https://testerhome.com/topics/3685)

@sandman 你好,我现在尝试使用 python highcharts 想把获取的 cpu 画出折线图,发现 pandas_highcharts 生成的图表路径不知道怎么设置,不知道能否指导一下。QQ 872489864

浮云 #37 · 2016年02月01日 Author

#36 楼 @diao2007 没关注 pandas_highcharts,我自己是先设计好 highcharts 的 html 模板,python 只是生成数据文件,既可以生成 json 形式的数据传给 html 文本,也可以直接写 js 文件供 html 直接加载。
单纯做个图而已,写个 highcharts 模板,把数据部分参数化,由 python 生成的数据文件传入。
我的做法,无非是把自己设计的模板和最终生成的数据文件生成在指定目录下。

@sandman 你好,我是测试媛的山地(测试媛群号:418093807),我们正在策划线下沙龙活动,不知道你有没有兴趣聊一下,一起探讨一下测试技术,我 qq:461785243

浮云 #39 · 2016年04月21日 Author

#38 楼 @shandi 工作相关事情很忙,我自身工作积累偏向安卓设备端系统测试,TV,盒子等安卓设备上的系统测试的积累,侧重性能测试和脚本自动化压力方案。
看你们组织的都是偏向 app 测试和接口测试的内容,不过你们北京组织活动的地点有我不少回忆。我在中国电子大厦 B 座 4 和 5 层的 Gameloft 工作了近 5 年,后来 4 层退租了,还真不知道现在什么情况了,多年未去了。

文章棒棒的,但源码跟工具不能下载,求发一份。邮箱:an168ge@163.com

#41 楼 @sandman 好的,谢谢,我看下。

浮云 [该话题已被删除] 中提及了此贴 08月10日 23:45

赞一个

浮云 shell 管理 monkey 压力测试 中提及了此贴 12月06日 13:24
浮云 android 端取 cpu,fps,men,wifi/gprs 流量等值 中提及了此贴 07月28日 11:23
浮云 android 端监控方案分享 中提及了此贴 08月13日 01:16
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册