K6多场景测试:如何在handleSummary中获取测试起止时间?
问题原因
K6的虚拟用户(VU)运行环境与主进程完全隔离,你在default函数中声明的startTime是单个VU的本地变量,主进程中的handleSummary函数无法访问VU内部的变量,因此会出现undefined的情况。
解决方案
方法一:利用K6内置的测试启动时间戳(最简便)
K6的k6/execution模块提供了exec.test.startTime,表示整个测试的启动时间戳,你可以在init阶段(全局代码区)获取这个值,该值在主进程和所有VU中共享,handleSummary可直接访问:
import exec from 'k6/execution'; // 在init阶段获取测试启动时间,全局共享 const testStartTime = exec.test.startTime; export default function () { // 你的多场景测试逻辑... } export async function handleSummary(data) { // 测试结束时间 = 启动时间 + 测试总持续时间 const testEndTime = testStartTime + data.metrics.test_run_duration.values.total; console.log("Start Time", new Date(testStartTime)); console.log("End Time", new Date(testEndTime)); // 这里添加导出测试摘要到Elastic的逻辑 // 比如将startTime、endTime和data中的指标数据组合后发送到Elastic }
方法二:用自定义指标记录最早的场景启动时间
如果需要的是第一个场景的启动时间而非整个测试的启动时间,可以通过自定义指标收集所有VU的场景启动时间,再在handleSummary中取最小值:
import { Trend } from 'k6/metrics'; import exec from 'k6/execution'; // 自定义趋势指标,用于收集所有VU的场景启动时间 const scenarioStartTimes = new Trend('scenario_start_time'); export default function () { // 记录当前VU的场景启动时间 scenarioStartTimes.add(exec.scenario.startTime); // 你的多场景测试逻辑... } export async function handleSummary(data) { // 从指标中获取最早的场景启动时间 const earliestScenarioStartTime = data.metrics.scenario_start_time.values.min; // 测试结束时间仍用启动时间+总持续时间计算 const testEndTime = earliestScenarioStartTime + data.metrics.test_run_duration.values.total; console.log("First Scenario Start Time", new Date(earliestScenarioStartTime)); console.log("Test End Time", new Date(testEndTime)); // 导出到Elastic的逻辑... }
补充说明
test_run_duration是K6内置指标,记录整个测试的总持续时间(单位:毫秒),其values.total字段就是测试从启动到结束的时长。- 如果需要每个场景的单独开始/结束时间,可以结合
exec.scenario.name在自定义指标中按场景分组记录,后续在handleSummary中拆分处理。
内容的提问来源于stack exchange,提问作者sg2000
相关产品推荐
相关产品推荐

