【腾讯TMQ】Google 是如何做 Chrome 浏览器的性能测试的?

作者:翟翌华

导语

近期研究了一下chrome的强大的性能测试工具telemetry,收获颇丰,现简单介绍一下telemetry的测试框架。telemetry中的很多方法都正在逐步的引入到自研的桌面QQ浏览器性能自动化测试系统中。

一、概述

Telemetry是一套chrome的性能测试框架,它使用远程调试协议,可实现网页操作的自动化测试,以及获取测试过程中的性能打点数据,生成性能数据报表。Telemetry支持多个平台,windows, mac, linux, chrome OS, android,即一个用例可以同时在所有支持的平台上运行。

Telemetry尽管是一个性能测试框架,但是已经集成了大量测试用例,例如blink, V8的性能,smooth流畅度,内存,power耗电,冷启热启性能,webrtc,绘图性能,gpu性能,线程性能等等。

telemetry下载地址:https://storage.googleapis.com/chromium-telemetry/snapshots/telemetry.zip

下面以PC端chrome浏览器为例,将telemetry使用的与chrome之间的基本的通信协议进行讲解。

二、运行环境

PC上telemetry需要python2.7环境,需要安装psutil和pywin32两个python库。

由于命令中不能有空行,这里将telemetry解压到chrome同一目录:

执行telemetry下的run_benchmark脚本:python run_benchmark --browser=exact --browser-executable="..\Application\chrome.exe"即可看到帮助:

结果如下:

每个benchmark就是一个测试用例集,比如执行冷启动用例集的命令如下:

python run_benchmark --browser=exact --browser-executable="..\Application\chrome.exe" --use-live-sites --pageset-repeat=1 startup2.cold.blank_page

三、远程调试协议

    Chrome Developer Tools是用HTML,Javascript,CSS编写的chrome开发者工具,而 Remote debugging protocol 远程调试协议就是它用来与浏览器页面(pages)交互和调试的协议通道,然后采用websocket再来与每个页面通信。

3.1协议启动

运行chrome时增加--remote-debugging-port=9528参数,即在9528端口打开远程调试通信协议。

可在chrome的快捷方式上增加参数:

也可以命令行方式开启:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9528

然后本机访问127.0.0.1:9528,就可以看到打开的页面信息:

3.2操作标签

http://127.0.0.1:9528/json可以获取标签页的详细信息,以json格式返回:

新建标签页命令如下:

http://127.0.0.1:9528/json/new

http://127.0.0.1:9528/json/new?http://www.baidu.com

激活和删除标签页:

http://127.0.0.1:9528/json/activate/855adeea-b0d2-4d1e-8a0e-f8305154e482

http://127.0.0.1:9528/json/close/855adeea-b0d2-4d1e-8a0e-f8305154e482

3.3Websocket操作页面

每个标签页都有一个webSocketDebuggerUrl,与之连接后可以对页面进行多种操作。

如下脚本为一个示例,chrome浏览器打开后运行脚本,websocket与页面建立连接后:

1)通过{'method': 'Page.navigate', 'params': {'url': 'http://www.jd.com'}}请求,访问url。

2)通过_runtime.Evaluate,执行js命令window.performance.timing监控网页加载完成事件,网页加载完成后获取网页加载速度,类似在F12 devtools上的console执行js命令:

3)通过{'method': 'Input.synthesizeScrollGesture', 'params': {'x': 100, ‘y': 400, 'xDistance': 0, 'yDistance': -400, 'preventFling': True,}}将页面向下滚动。

由于需要telemetry的库函数,下面的python文件放在\telemetry\src\tools\perf目录即可。

所有与页面相关的method定义见devtools_protocol_dispatcher.cc文件,这里推荐一个chrome代码在线查看的链接:https://cs.chromium.org/。

devtools_protocol_dispatcher.cc文件的链接是:

https://cs.chromium.org/chromium/src/out/Debug/gen/content/browser/devtools/protocol/devtools_protocol_dispatcher.cc?q=devtools_protocol_dispatcher.cc&sq=package:chromium&dr

使用远程调试协议和websocket可以很轻松的实现chrome的自动化测试。

这里说明一下,对于使用chrome内核的浏览器:QQ浏览器,猎豹和360极速浏览器来说,上述的脚本同样适用。

四、性能数据采集方法

除了上节介绍的_runtime.Evaluate方法执行js命令获取性能数据外,chrome提供了tracing功能,能够启动chrome输出预先打点的性能统计点数据。

下面以冷启动脚本为例,

python run_benchmark --browser=exact --browser-executable="..\Application\chrome.exe" --use-live-sites --pageset-repeat=1 startup2.cold.blank_page

4.1启动trace

冷启动测试脚本启动chrome时增加了--trace-config-file=.\chrome-trace-config.json参数,其中chrome-trace-config.json内容为:

{"trace_config":{"included_categories": ["blink.user_timing", "startup"], "record_mode": "record-as-much-as-possible"}}

included_categories表示哪几类的性能打点log需要记录,每个测试用例都是不一样的,冷启动只对startup的性能数据比较关心。

当然,如果不是启动性能数据采集,可以在脚本执行过程中启动,启动的websocket命令为:{'method': 'Tracing.start', 'params': {'options': ‘**’, 'transferMode': 'ReturnAsStream' }},options内容可参考上述chrome-trace-config.json。

4.2停止trace,收集数据

脚本Websocket发送{'method': 'Tracing.end'}后即开始从chrome获取性能数据,在接受到chrome的{'method': ‘Tracing.tracingComplete’}消息后即表示性能数据传输完毕,详情可以查看文件\telemetry\src\third_party\catapult\telemetry\telemetry\internal\backends\chrome_inspector\tracing_backend.py中的StopTracing函数。

收集到的性能数据格式为(这里只列了一部分):

{'name': 'Startup.BrowserWindowDisplay', 'tts': 260159, 'args': {'Temperature': 4}, 'pid': 2408, 'ts': 179874136371L, 'cat': 'startup', 'tid': 10808, 'ph': 'S', 'id': '0x0'}, {'name': 'Startup.BrowserWindowDisplay', 'tts': 260160, 'args': {'Temperature': 4}, 'pid': 2408, 'ts': 179874680885L, 'cat': 'startup', 'tid': 10808, 'ph': 'F', 'id': '0x0'}

4.3计算性能参数

最终结果为:

每个时间都是从性能打点中计算得到的,比如window_display_time就是Startup.BrowserWindowDisplay两个时间点的差想减所得。

4.4Chrome中性能数据打点方法

下面显示了代码中对Startup.BrowserWindowDisplay性能输出起始时间的地方,在window窗口显示完毕的函数中输出进程启动时间和当前窗口显示的时间,这两个时间差就是从进程启动到窗口显示共消耗的时间。

大家也可以使用现有接口,自己定义需要统计性能的点输出。

五、总结

chrome的性能测试工具telemetry功能如此强大,我们正在逐步的将telemetry中可用的功能移植到我们QQ浏览器的性能自动化测试框架中,目前已经把远程调试协议移植进来,用来自动化操作和获取js命令的返回值。其他的性能测试用例,如gpu,绘图性能用例正在移植中。

大家在做性能测试时,都是通过何种渠道和方式获取到细化后的性能指标的?

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰同学骚年

.NET Core微服务之基于Apollo实现统一配置中心

  在微服务架构环境中,项目中配置文件比较繁杂,而且不同环境的不同配置修改相对频繁,每次发布都需要对应修改配置,如果配置出现错误,需要重新打包发布,时间成本较高...

1333
来自专栏Laoqi's Linux运维专列

Linux防火墙-netfilter应用

iptables filter表小案例 : nat表应用 A机器两块网卡ens33(192.168.133.130)、ens37(192.168.100.1),...

3096
来自专栏张善友的专栏

Windows Server 2003网络负载均衡的实现

       在现行的许多网络应用中,有时一台服务器往往不能满足客户端的要求,此时只能通过增加服务器来解决问题。   那么,有没有一个办法或者技术来解决此类问题...

1926
来自专栏张善友的专栏

Windows 7社区发布活动 -- Windows 7兼容性概述

今天在深圳的Windows 7社区发布活动讲了Session 2 -- Windows 7兼容性概述。今天参会的人员达到60多个,大家也非常积极的讨论。我的Se...

1686
来自专栏运维前线

Gitlab安装使用及汉化配置

一、GitLab简介 GitHub是2008年由Ruby on Rails编写而成,与业界闻名的Github类似;但要将代码上传到GitHub上面,而且将项目设...

1.3K5
来自专栏瓜大三哥

AXI BRAM Controller和Block memory generator(BMG)

AXI BRAM Controller ? 这个块RAM在AXI interconnect被作为AXI Endpoint的从核并且作为系统主设备与局部块RAM通...

2635
来自专栏程序猿

Burp Suite第十八节: 使用Burp Suite测试Web Services服务

从这一节开始,我们进入了Burp的综合使用。通过一系列的使用场景的简单学习,逐渐熟悉Burp在渗透测试中,如何结合其他的工具,组合使用,提高工作...

3726
来自专栏简书专栏

Python爬虫-小测验

(1)读取给定的dangdang.html页面内容,注:编码为gbk(5分) (2)获取页面中所有图书的名称,价格,作者,出版社及图书图片的url地址(20分...

702
来自专栏杨建荣的学习笔记

假期前的数据库检查脚本之主备关系(r11笔记第46天)

快过年了,很多系统都要进入最后的检查和复验阶段,一方面在节假日前,提前发现问题总比过节的时候发现要好。另一方面如果出现故障的时候能及时进行处理,这个时候我们就需...

27410
来自专栏Python中文社区

Phantomjs的正确打开方式

專 欄 ❈ 作者:nmask 博客地址: https://thief.one/ ❈ 前段时间分析了Selenium+Phantomjs的使用方法以及性能优化问...

26910

扫码关注云+社区