基于PageSpeed Insights的JMeter客户端自动化:如何将<URL>_<metric>格式的指标结果传入汇总报告并设置为JMeter标签?
嘿,刚好我之前做过类似的需求,给你分享下在JMeter里实现这个目标的最优路径,亲测靠谱!
URL_metric变量设为JMeter标签并在报告中统计 1. 先搞定数据提取:从PageSpeed拿到指标和URL
首先你得用HTTP请求采样器调用PageSpeed的接口(其实用官方JSON API比爬网页更靠谱,返回结构清晰,解析更简单),比如调用https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=你的目标URL&strategy=mobile(桌面端把strategy改成desktop即可)。
接下来用JSON提取器提取你需要的核心指标:比如FCP、LCP、CLS这些,同时可以直接用JMeter内置的${samplerUrl}变量获取当前采样器的请求URL,或者从响应里提取原始目标URL。
2. 用JSR223 PostProcessor生成自定义子样本
这是实现需求的关键一步!因为要把每个URL_metric组合变成独立的样本条目,才能在汇总报告里单独统计。
添加一个JSR223 PostProcessor到HTTP请求采样器下面,选择Groovy作为脚本语言(Groovy性能比其他脚本语言更优),然后贴入类似下面的代码:
// 清理原始URL,去掉查询参数让标签更简洁 def rawUrl = sampler.getUrl().toString() def baseUrl = rawUrl.split("\\?")[0] // 映射指标名称和对应的提取变量(要和你JSON提取器的变量名对应) def metricMap = [ "First Contentful Paint (FCP)": vars.get("fcp_value"), "Largest Contentful Paint (LCP)": vars.get("lcp_value"), "Cumulative Layout Shift (CLS)": vars.get("cls_value"), "Speed Index": vars.get("speed_index"), "Time to Interactive": vars.get("tti_value"), "Total Blocking Time": vars.get("tbt_value") ] // 遍历每个指标,生成独立子样本 metricMap.each { metricName, metricVal -> if (metricVal && metricVal != "NaN") { // 跳过空值或无效指标 // 创建新的子样本对象 def subSample = new org.apache.jmeter.samplers.SampleResult() // 设置样本标签为你需要的`URL_metric`格式 subSample.setSampleLabel("${baseUrl}_${metricName}") // 标记样本为成功状态 subSample.setSuccessful(true) // 处理指标值:CLS是小数,乘以1000转成整数毫秒(JMeter时间字段为long型) def processedValue = metricName.contains("CLS") ? (Double.parseDouble(metricVal) * 1000).toLong() : metricVal.toLong() subSample.setTime(processedValue) // 设置响应内容,方便调试查看指标原始值 subSample.setResponseData("Metric: ${metricName}, Raw Value: ${metricVal}", "UTF-8") // 将子样本添加到主采样结果中 prev.addSubResult(subSample) } }
注意:代码里的
fcp_value、lcp_value等变量名,要和你JSON提取器中设置的变量名完全对应哦!
3. 配置报告视图显示子样本
打开你的Summary Report(汇总报告)或Aggregate Report(聚合报告),点击右上角的齿轮图标(配置按钮),在弹出的选项里勾选Include subresults,这样所有子样本就会显示在报告列表里了——每一行就是一个URL_metric组合,你能直接看到这个指标的平均值、中位数、90%线等统计数据,完全符合你的需求!
4. 几个小优化建议
- 如果URL里有特殊字符(比如
:/?=),可以用baseUrl = org.apache.commons.lang3.StringUtils.replaceChars(baseUrl, ":/?=", "_")替换成下划线,让标签更规范易读。 - 可以把指标列表放到CSV文件里,用CSV Data Set Config读取,这样新增指标不用改代码,直接在CSV里加一行就行。
- 如果需要区分移动端和桌面端,可以在标签里加上后缀,比如
${baseUrl}_${metricName}_mobile,方便报告里分组查看。
内容的提问来源于stack exchange,提问作者Nadezhda T

