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

k6中检查失败时如何保存响应体?能否留存失败断言的响应信息?

k6检查失败时的响应体记录方案

嘿,我来帮你搞定这两个k6的实用问题,都是压测时经常遇到的需求!

1. 检查失败时保存响应体到文件

k6本身没有内置的直接写文件API,但可以用官方的k6/x/file扩展模块来实现。要注意的是,在虚拟用户(VU)里写文件时,建议用追加模式避免并发写入冲突,而且尽量别频繁写文件,不然可能影响压测性能。

给你一个贴合你提供的示例的实现:

import http from 'k6/http';
import { check } from 'k6';
import file from 'k6/x/file';

// 封装写入错误日志的函数
function AppendErrorLog(filename, content) {
  // 以追加模式打开文件,加上时间戳方便排查
  file.appendString(filename, `${new Date().toISOString()} - 响应体:\n${content}\n\n`);
}

export default function () {
  const rc_code = 200;
  const res = http.get('https://test-api.k6.io/public/crocodiles/1/');
  
  // 检查响应码,失败就调用写入函数
  check(res, {
    '响应码正确': (r) => r.status === rc_code,
  }) || AppendErrorLog('error_logs.txt', res.body);
}

运行这个脚本的时候,需要加上--include-module参数引入文件模块,比如:

k6 run --include-module github.com/grafana/k6/x/file@v0.0.2 your-script.js

要是不想用扩展模块,还可以把失败的响应信息先存到共享数组里(用k6/execution的shared对象),等测试结束后在teardown阶段统一写入文件,这种方式在高并发场景下更高效,能减少IO开销。

2. 留存所有检查失败的响应体与响应码

必须支持!而且有更高效的做法——先把所有失败的请求数据收集起来,最后统一导出,比单条写入靠谱多了。给你一个完整的示例,能同时记录响应码、响应体和请求详情:

import http from 'k6/http';
import { check } from 'k6';
import { shared } from 'k6/execution';
import file from 'k6/x/file';

// 初始化共享数组,用来存所有失败请求的数据
export function setup() {
  shared.failedRequests = [];
}

export default function () {
  const rc_code = 200;
  const url = 'https://test-api.k6.io/public/crocodiles/1/';
  const res = http.get(url);
  
  const checkPassed = check(res, {
    '响应码正确': (r) => r.status === rc_code,
  });

  // 检查失败的话,把详细信息存进共享数组
  if (!checkPassed) {
    shared.failedRequests.push({
      timestamp: new Date().toISOString(),
      requestUrl: url,
      statusCode: res.status,
      responseBody: res.body,
      // 还可以加请求耗时、请求头等字段,按需扩展
    });
  }
}

// 测试结束后,把所有失败数据写入文件
export function teardown() {
  if (shared.failedRequests.length > 0) {
    // 转成格式化的JSON,方便后续分析
    file.writeString('all_failed_requests.json', JSON.stringify(shared.failedRequests, null, 2));
    console.log(`搞定!已经把 ${shared.failedRequests.length} 条失败请求记录到 all_failed_requests.json 里了`);
  }
}

这种方式的好处很多:

  • 减少VU运行时的IO操作,不会拖慢压测速度
  • 所有失败数据集中管理,后续分析起来更方便
  • 可以灵活加字段,比如请求耗时、请求头这些,按需调整

另外,要是你用k6 Cloud或者有日志系统,也可以把失败信息输出到控制台,然后用日志工具(比如ELK、Promtail)来留存和分析,也是个不错的选择。

内容的提问来源于stack exchange,提问作者user4845183

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:39:46