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
相关产品推荐
相关产品推荐

