You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 14:52:19