弹簧
Benchpress是e2e性能测试的一个框架. 见 这里有一个示例项目。 。 。 .
此套件的来源主要为 角质 复发. 请提交问题 和拉请求反对的回波.
许可证:麻省理工学院
为什么?
有所谓的"微分基准" 基本上在浏览器中使用一站表来测量时间
(例如通过) performance.now()) (中文(简体) ). 这种方法仅限于时间,有时还包括记忆
(Chrome 有特殊旗帜),作为度量. 它不允许衡量:
- 渲染时间:例如浏览器花在布局或油漆元素上的时间。 例如,这可以用来 测试样式表变化的性能影响.
- 垃圾收集:例如浏览器暂停了脚本执行多长时间,收集了多少内存. 它可以用来稳定脚本执行时间,因为垃圾收集时间通常非常长 无法预料 这些数据还可用于衡量和改进应用程序的内存使用, 由于垃圾收集量会直接影响垃圾收集时间.
- 区分脚本执行时间和等待时间: 例如, 仅测量客户端花费的时间 在复杂的用户交互中,忽略后端呼叫.
- fps 以表示滚动和动画的平滑性.
现代浏览器的DevTools中已经存在这类数据. 但是,没有标准的方法可以 以自动化方式使用这些工具来测量网络应用性能,尤其是不跨平台.
Benchpress试图填补这一空白,即允许以自动化方式访问各种性能度量.
如何运作
Benchpress使用webdriver来读取浏览器的所谓"性能日志". 这里面有各种有趣的东西 数据,例如当一个脚本开始/修改执行时,gc开始/修改,浏览器将一些东西画到屏幕上,.
由于浏览器不同,长凳press有使这些事件正常化的插件.
特征
- 提供一个循环( 也叫“ Sampler ”) , 多次执行基准
- 自动等待/检测到浏览器为"温暖"
- 记者们为储存结果提供了一个正常的方式:
- 控制台记者
- 文件记录员
- Google 大查询记者(即将到来)
- 支持微观基准并通过
console.time()编号 :console.timeEnd()console.time()编号 :console.timeEnd()在 DevTools 中标出时间线, 这样才有意义 在微观基准中用它们来直观和理解它们,无论有没有板凳压.- 在板凳上运行微观基准 杠杆已经存在的记者, 采样机 和自动热身功能 板凳压.
支持的浏览器
- 所有平台的色调
- 移动Safari(iOS)
- Firefox (工作正在进行)
如何写出基准
由测试中的应用程序在长凳上设定基准 和基准驱动器。 测试中的应用程序是 实际应用由html/css/js构成,应当作为测试. 基准驱动程序是一个与 测试中的应用.
简单的基准
假设我们想测量脚本执行时间 以及渲染时间 用复杂的 html 字符串填充容器元素.
测试中的应用可能是这样的:
index.html:
<button id="reset" onclick="reset()">Reset</button>
<button id="fill" onclick="fill()">fill innerHTML</button>
<div id="container"></div>
<script>
var container = document.getElementById('container');
var complexHtmlString = '...'; // TODO
function reset() { container.innerHTML = ''; }
function fill() {
container.innerHTML = complexHtmlString;
}
</script>
一个基准驱动程序可能像这样:
// A runner contains the shared configuration
// and can be shared across multiple tests.
var runner = new Runner(...);
driver.get('http://myserver/index.html');
var resetBtn = driver.findElement(By.id('reset'));
var fillBtn = driver.findElement(By.id('fill'));
runner.sample({
id: 'fillElement',
// Prepare is optional...
prepare: () {
resetBtn.click();
},
execute: () {
fillBtn.click();
// Note: if fillBtn would use some asynchronous code,
// we would need to wait here for its end.
}
});
浏览器中的测量
如果测试中的应用愿意,它可以自行测量. 举个例子.
index.html:
<button id="measure" onclick="measure()">Measure document.createElement</button>
<script>
function measure() {
console.time('createElement*10000');
for (var i=0; i<10000; i++) {
document.createElement('div');
}
console.timeEnd('createElement*10000');
}
</script>
当 measure 按钮被点击,它标记了时间表并创建了一万个元素.
它使用特殊的名字 createElement*10000 告诉法官
被测量的时间是一万个来创建Element的电话,而这个长椅应该
以平均价计.
一个测试驱动器 看起来像这样:
driver.get('.../index.html');
var measureBtn = driver.findElement(By.id('measure'));
runner.sample({
id: 'createElement test',
microMetrics: {
'createElement': 'time to create an element (ms)'
},
execute: () {
measureBtn.click();
}
});
在研究"德夫图斯"时间线时,我们也看到一个标记:

自定义不使用量表 console.time
也可以测量浏览器内的任何"用户度量"
通过设置数字值 window 对象。 例如:
bootstrap(App)
.then(() => {
window.timeToBootstrap = Date.now() - performance.timing.navigationStart;
});
这个用户度量的测试驱动程序可写入如下:
describe('home page load', function() {
it('should log load time for a 2G connection', done => {
runner.sample({
execute: () => {
browser.get(`http://localhost:8080`);
},
userMetrics: {
timeToBootstrap: 'The time in milliseconds to bootstrap'
},
providers: [
{provide: RegressionSlopeValidator.METRIC, useValue: 'timeToBootstrap'}
]
}).then(done);
});
});
使用这个策略,板凳 将等待到指定的财产名称,
timeToBootstrap 在这种情况下,定义是: window 对象
在测试中的应用程序中.
平滑度量仪
Benchpress还可以测量卷轴和动画的"平滑". 为了做到这一点,以下的一套度量衡可以通过板凳平面收集:
frameTime.mean: 平均帧时间以毫秒计(目标:16.6ms for 60fps)frameTime.worst: 最差的帧时间( ms)frameTime.best: 最佳帧时间(毫秒)frameTime.smooth: 撞击60fps的帧百分比
要收集这些度量衡,需要执行 console.time('frameCapture') 财务报告和审定财务报表 console.timeEnd('frameCapture') 在您的基准应用程序中,或者通过网络驱动程序在您的基准驱动器中。 以上提到的衡量标准将仅在这两通电话之间收集,建议将时间/时间结束电话尽可能地紧贴在您想要评价的行动周围,以便获得准确的测量.
此外,还需要另外一名供应商通过测试收集这些指标:
benchpress.sample(providers: [{provide: bp.Options.CAPTURE_FRAMES, useValue: true}], ... )
请求量表
Benchpress还可以记录发送的请求数量并计算自此收到的"编码"字节 窗口。性能.piming.navigation Start数字 :
receivedData: 自上次导航开始以来收到的字节数requestCount: 自上次导航开始以来发出的请求数量
要收集这些指标,您需要以下相应的额外提供者:
benchpress.sample(providers: [
{provide: bp.Options.RECEIVED_DATA, useValue: true},
{provide: bp.Options.REQUEST_COUNT, useValue: true}
], ... )
最佳做法
-
使用正常环境
-
使用相对比较
- 相对比较较不易随时间变化,有助于解释基准结果
- 例如,将使用ui框架编写的示例与手编码示例进行比较,并跟踪比例
-
承诺后承诺范围
- 运行基准需要一些时间。 在每一次犯罪之前运行它们通常太慢了.
- 当检测到某一承诺范围的回归时,请使用分节来查找有问题的承诺
-
在新窗口中重复多次基准
- 在新窗口中多次运行相同的基准, 然后取每个基准运行的最低平均值
-
谨慎使用武力gc
- 强迫 gc 可以扭曲脚本执行时间和 gcTime 数字, 但可能需要获得稳定的gc时间/克量数
-
为每次测试打开新窗口
- 浏览器(如chrome)可能会将JIT统计保留在页面重载上,并视之前装入的内容不同而不同地优化页面
详细概览

定义:
- 有效样本:代表世界的样本,应当以良好方式进行测量.
- 完整样本:迄今收集的所有计量值样本
组件 :
-
运行者
- 包含默认配置
- 为每个样本调用创建一个新的注射器,通过它创建所有其他组件
-
样本
- 获取测量数据
- 立即向记者计量数值
- 循环直到验证器能够从完整的样本中提取出有效的样本(见下文).
- 向记者报告有效的样本和完整的样本
-
度量衡
- 从浏览器中获取测量值
- 例如,读取性能日志、 DOM 值、 JavaScript 值
-
验证器
- 从所有测量值的完整样本中提取一个有效的样本.
- 例如,等待有10个样本并将其作为有效样本(包括取暖时间)
- 例如,等待计量的回归坡度
scriptTime通过最后10个度量值为%\0,即:scriptTime度数不再减少
-
记者
- 报告测量值、有效样本和完整样本到后端
- 例如,向控制台打印的记者,向Google BigQuery报告值的记者,.
-
Web 驱动程序
- 对已使用的网络驱动程序客户端进行抽象
- 每个网络驱动器客户端执行一次 例如,一个用于硒-webdriver Node.js模块,Dart Async Webdriver,Dart同步网络driver,.
-
Web 驱动程序扩展
- 使用 WebDriverAdapter 执行在 WebDriver 协议中标准化的其他方法
- 提供强制 gc 等功能,以规范格式读出性能日志
- 每个浏览器一个执行,例如Chrome一个执行,Safari移动一个执行,Firefox一个执行