k6 基础

k6 用 JavaScript 描述负载:默认导出函数是一次迭代,options 定义虚拟用户与阶段,check 与 threshold 内建;单二进制运行,便于 CI 集成。

软件测试速查开发更新于 2026-10-13

k6 是什么

k6(Grafana k6)是开源负载测试工具:用 JavaScript 描述负载,默认导出函数就是一次迭代,options 中定义虚拟用户、时长与阶段;单二进制运行、无需安装 Node 环境,天然适合本地调试与 CI 集成。压测结论以分位数和趋势为准,攒好自己的性能基线,发版前后才有据可依。

基本信息

脚本语言JavaScript(ES6 模块),无需 Node 依赖
运行方式单二进制:k6 run script.js,本地、CI、云均可
并发模型VU(虚拟用户)独立执行迭代,各自拥有 JS 运行时
常用配置options:vus、duration、stages、scenarios、thresholds
结果输出终端汇总加 JSON/CSV 导出,可接 Grafana、Prometheus
执行形态本地 k6 run、CI 流水线集成或 Grafana Cloud k6 托管执行

最小可用脚本

最小可用脚本
import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  vus: 20, duration: '1m',
  thresholds: { http_req_duration: ['p(95)<500'] }
};

export default function () {
  const res = http.get('https://example.com/api/ping');
  check(res, { 'status is 200': (r) => r.status === 200 });
  sleep(1);
}

典型使用场景

  • 接口基线与回归:发版前跑核心接口,对比 p95 与错误率。
  • 容量评估:用阶梯 stages 找吞吐拐点,为扩容提供依据。
  • CI 冒烟压测:小规模短时长接入流水线,拦住明显性能退化。
  • 瓶颈复现与验证:按线上流量模型复现问题,验证修复效果。
  • SLO 守护:把性能目标写进 thresholds,回归时自动判定通过与失败。
  • 新人培训:用小脚本理解虚拟用户、迭代与断言三件事的关系。

关键指标怎么读

指标含义关注点
http_req_duration请求耗时分布(p95/p99)看分位不看均值,均值会被尖峰掩盖
http_req_failed请求失败率非零先查原因,别急着加并发
http_req_waiting等待响应首字节时间(TTFB)区分服务端慢还是网络慢的入手点
vus / vus_max当前与峰值虚拟用户配合阶段曲线识别拐点
iterations完成的迭代总数结合时长换算实际吞吐
checks断言通过率失败即用例未达标,先修脚本或服务
每个 VU 是独立 JS 运行环境;跨迭代共享状态要通过共享模块或显式建模,不能依赖全局变量隐式传递。
别在共享环境直接全速压测:先小规模探路,确认对上下游的影响面再放量。
两次数值要可比:脚本、数据与运行条件保持一致,否则结果没有对照意义。
脚本即代码:k6 脚本纳入版本管理,与接口定义同步评审,避免压测口径过时。

易错点

  • 每次迭代新建连接或数据随机不可复现:固定参数与数据种子,结果才可比。
  • CI 里直接跑全量长时压测:挤占流水线时间,改为小规模冒烟档。
  • 只看平均响应时间:均值掩盖尖峰,重点看 p95/p99 与错误率。
  • 压测数据不隔离:多轮互相干扰,结论失真。
  • thresholds 缺失:跑完只有数字没有判据,回归时容易无人跟进。
  • 压测机自身先饱和:带宽或端口耗尽,测到的不是被测系统的真实上限。

数据来源与参考

  • k6 官方文档(k6.io/docs)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌