GitHub Actions中k6执行报错:tv4未定义的解决方法
Postman转k6脚本后tv4未定义报错及JSON Schema验证解决方案
问题背景
将Postman集合转换为k6负载测试脚本后执行出现以下报错:
time="2023-12-21T12:36:12Z" level=error msg="ReferenceError: tv4 is not defined at file:///github/workspace/k6-script.js:86:21(1) at test (file:///github/workspace/libs/shim/core.js:504:6(15)) at post (file:///github/workspace/k6-script.js:85:14(61)) at executePostrequest (file:///github/workspace/libs/shim/core.js:1253:11(22)) at executeRequest (file:///github/workspace/libs/shim/core.js:1034:25(108)) at file:///github/workspace/libs/shim/core.js:314:30(27) at file:///github/workspace/k6-script.js:38:19(39) " executor=constant-vus scenario=default source=stacktrace
报错原因是Postman集合中使用了tv4进行JSON Schema验证,但k6运行环境默认不内置tv4库,且自动转换的脚本未处理该依赖。原Postman验证代码示例:
pm.test("Schema validation", function(){ var result = tv4.validateResult(pm.response.json(),schema); if(!result.valid){ console.log(result) } pm.expect(result.valid).to.be.true; })
解决方案
1. 快速解决报错
如果负载测试中不需要保留Schema验证逻辑,直接删除Postman集合中的tv4验证代码,重新转换为k6脚本即可。
2. 在k6中实现tv4 JSON Schema验证
若需要保留Schema验证,需手动适配k6环境:
步骤1:引入tv4库
k6支持通过npm导入第三方库,先安装tv4:
npm install tv4
然后在k6脚本顶部导入:
import tv4 from 'tv4'; import { check } from 'k6';
步骤2:替换Postman验证代码为k6兼容写法
k6使用check函数做断言,替代Postman的pm.test,示例代码:
export default function () { // 发送请求 let response = http.post('https://your-api-endpoint', JSON.stringify(requestBody), { headers: { 'Content-Type': 'application/json' }, }); // 定义JSON Schema const schema = { type: 'object', properties: { code: { type: 'number' }, data: { type: 'object' }, msg: { type: 'string' } }, required: ['code', 'msg'] }; // 执行Schema验证 check(response, { '响应符合JSON Schema': () => tv4.validate(response.json(), schema) }); // 可选:输出验证错误详情 if (!tv4.validate(response.json(), schema)) { console.error('Schema验证失败:', tv4.error); } }
步骤3:适配自动转换的k6脚本
如果是通过工具自动转换的脚本,找到生成的pm.test相关代码块,替换为上述k6的check逻辑,并确保tv4已导入。
内容的提问来源于stack exchange,提问作者Priyanka Lawale
相关产品推荐
相关产品推荐

