k6脚本如何编写以测试XML上传接口

12次阅读

xml上传不必须用multipart/form-data,但多数老系统或政务/金融接口要求该格式;k6需手动构造boundary、header和body,body为ArrayBuffer类型;验证需检查响应体业务字段而非仅状态码并发时XML内容应动态生成以避免重复。

k6脚本如何编写以测试XML上传接口

XML上传必须用 multipart/form-data 吗?

不是必须,但绝大多数 XML 上传接口(尤其是老系统或政务/金融类)要求 Content-Type: multipart/form-data,因为文件需作为二进制 part 提交。如果后端明确支持 application/xmltext/xml 直接 POST 原始 XML 字符串,k6 可跳过 form 构建——但这种情况较少,先默认按 multipart 处理。

k6 中如何构造带 XML 文件的 multipart 请求?

k6 的 http.request() 不支持自动序列化 multipart,必须手动拼接 boundary、header 和 body。关键点:

  • boundary 需随机生成(如用 crypto.randomUUID()),且不能出现在 XML 内容中
  • XML 文件 part 的 Content-Disposition 必须含 name="file"(或后端约定的字段名)和 filename="xxx.xml"
  • XML 内容前需两个换行(rnrn),结尾需以 --{boundary}-- 结束
  • 整个 body 是 ArrayBuffer 类型,不能传字符串——要用 new TextEncoder().encode(str)
import http from 'k6/http'; import { crypto } from 'k6';  export default function () {   const xmlContent = `12399.9`;   const boundary = `----k6-${crypto.randomUUID()}`;   const dashBoundary = `--${boundary}`;   const body = [     dashBoundary,     'Content-Disposition: form-data; name="file"; filename="data.xml"',     'Content-Type: application/xml',     '',     xmlContent,     dashBoundary + '--',     ''   ].join('rn');    const params = {     headers: {       'Content-Type': `multipart/form-data; boundary=${boundary}`,     },   };    http.post('https://api.example.com/upload', new TextEncoder().encode(body), params); }

如何验证 XML 上传是否真正生效?

仅看 HTTP 状态码 200 不够。常见陷阱:

  • 后端返回 200 但实际把 XML 当纯文本存了,没解析——需检查响应体是否含 "status": "success" 或类似业务字段
  • XML 编码不一致(如 UTF-8 vs GBK)导致解析失败,响应可能返回 400 或静默丢弃——建议在脚本中固定用 UTF-8 编码生成 body,并确认后端文档
  • 未设置 filename 或字段名错(如传 name="xml" 但后端期待 name="upload"),会导致后端收不到文件——抓包对比真实请求最可靠

并发上传时 XML 内容需要动态生成吗?

需要。静态 XML 在高并发下容易触发后端幂等校验或重复拒绝。推荐方式:

  • __ENV.TEST_ID__VU + __ITER 拼出唯一
  • 时间戳嵌入 XML:${date.now()}
  • 避免在 XML 中硬编码敏感字段(如 Token),应从环境变量注入

边界情况容易被忽略:当 XML 含特殊字符(如 &)时,若手动生成字符串未转义,会破坏 XML 结构;此时应优先用模板字符串拼接,而非从外部读取未清洗的原始内容。

text=ZqhQzanResources