HelloWorld k6 使用指南
本指南用最直白的方式带你从零上手k6的HelloWorld:覆盖安装、编写第一份脚本、运行本地与云端测试、查看关键指标与日志、设置阈值与场景、常见调优与在CI中集成的实操步骤,文末提供常见故障排查、示例脚本、CI集成模板可直接复用及调优贴士。

先把概念讲清楚:k6 是什么、HelloWorld 为何重要
把 k6 想象成一个可以「模仿很多人工同时访问你服务」的电动机器:你给它一个脚本,它按脚本发起请求并记录每一个响应的时间和结果。HelloWorld 的意义不只是跑通第一个请求,而是建立一套可重复、可观测、可持续的测压流程。学会 HelloWorld,你就掌握了最小闭环:脚本 -> 运行 -> 观察 -> 调整。
核心概念(用最简单的话说明)
- VU(虚拟用户):模拟并发用户的数量。
- Iteration(迭代):每个 VU 执行脚本的一次完整流程。
- Duration / Stages:持续时间或分阶段的负载变化。
- Checks:断言,用来判断响应是否符合期望。
- Thresholds:质量门槛,失败则测试判为失败(CI 用途)。
- Metrics:内置(http_req_duration 等)与自定义指标。
如何安装 k6(快速上手)
k6 支持多平台,下面是常见安装方式,按你系统选一种即可。
- macOS(Homebrew):brew install k6
- Linux(Deb/Ubuntu):添加官方仓库后 apt install k6,或直接下载二进制。
- Windows(Scoop/Chocolatey):scoop install k6 或 choco install k6
- Docker:docker run -i loadimpact/k6 run – 用于容器化或 CI 环境
编写第一个 HelloWorld 脚本(一步一步)
k6 的脚本本质上是 JavaScript(ES6 风格),主函数名为 default。下面是最基础的示例,先看代码再解释。
import http from 'k6/http';
import { sleep, check } from 'k6';
export let options = {
vus: 5,
duration: '10s',
thresholds: {
'http_req_duration': ['p(95)<500'] // 95% 请求小于 500ms
}
};
export default function () {
let res = http.get('https://test.k6.io');
check(res, { 'status is 200': (r) => r.status === 200 });
sleep(1);
}
解释:
- import:引入 http、sleep、check 等模块。
- options:配置负载(此处 5 个 VU,持续 10 秒)与阈值。
- default:每个 VU 重复执行的函数,通常包含请求与等待。
运行脚本
在命令行中运行:
k6 run hello.js
你会看到实时的控制台输出,包括 http_reqs、vus、data_received、http_req_duration 等。
常见 CLI 选项与输出说明
把常用选项和它们的含义放在一个表格里,方便查阅:
| 选项 | 用途 |
| –vus / vus | 并发虚拟用户数 |
| –duration / duration | 测试持续时间,如 30s、1m |
| –iterations | 总迭代次数,适合固定请求数测试 |
| –out | 输出后端(influxdb、json 等) |
| –summary-export | 导出测试摘要到 JSON 文件 |
从 HelloWorld 扩展到实战脚本
好,HelloWorld 能跑了,接下来考虑真实场景:登录、鉴权、参数化、并发场景切换、逐步加压(ramp-up/ramp-down)。
例子:带登录与参数化的脚本骨架
import http from 'k6/http';
import { check } from 'k6';
export let options = {
stages: [
{ duration: '30s', target: 50 }, // ramp-up to 50 vus
{ duration: '1m', target: 50 }, // sustain
{ duration: '30s', target: 0 }, // ramp-down
],
thresholds: { 'http_req_failed': ['rate<0.01'] }
};
export default function () {
let login = http.post('https://api.example.com/login', { user: 'a', pass: 'b' });
check(login, { 'login OK': (r) => r.status === 200 });
let token = login.json('token');
let res = http.get('https://api.example.com/data', { headers: { Authorization: `Bearer ${token}` } });
check(res, { 'data ok': (r) => r.status === 200 });
}
指标与自定义指标(让数据更有用)
内置指标能满足大多数场景,但有时需要记录业务指标,例如“某接口返回特定值的次数”。这时使用自定义指标。
- Counter:计数器,用于累加事件。
- Trend:记录分布(如响应时间分布),可计算 p90、p95。
- Gauge:即时值(如队列深度)。
import { Counter, Trend } from 'k6/metrics';
let errors = new Counter('my_errors');
let latency = new Trend('my_latency');
export default function () {
let r = http.get('https://...');
if (r.status !== 200) errors.add(1);
latency.add(r.timings.duration);
}
在 CI 中使用 k6(给持续集成一把梯子)
思路其实很直接:把 k6 当作一个可执行的测试步骤,失败时返回非 0,成功则继续。关键点是把结果导出,便于在流水线中判断。
- 使用
k6 run --summary-export=summary.json导出 JSON 摘要。 - 在脚本中设置 thresholds,超过阈值时 k6 返回非 0,CI 任务失败。
- 如果需要长期可视化,把数据输出到 InfluxDB,再用 Grafana 展示。
可视化与持久化输出
常见组合是 k6 -> InfluxDB -> Grafana。另一个轻量做法是把 summary 导出为 JSON 或 CSV,供后续解析。
调试与常见问题(带解决建议)
- 连接失败 / DNS 解析慢:确认网络环境,必要时在脚本中使用 hosts 或在被测环境使用稳定的 DNS。
- 本机无法达到期望并发:检查 ulimit、端口耗尽(TIME_WAIT)、CPU 与网络带宽限制。
- 测试环境与生产不一致:尽量在容量相近的环境跑测试,或使用 k6 cloud 分布式能力。
- 误用浏览器特性:k6 不是真实浏览器,某些 JS 渲染或浏览器 API 不支持,要用 API 层面脚本。
性能调优小贴士(实用且容易被忽视)
- 在本地测试前,先用很小的 VU、短时长跑通脚本,确认逻辑无误再扩容。
- 用
http.batch()合并并发请求,模拟资源并行加载。 - 把非关键的日志与大体积响应体过滤或不记录,避免 IO 成为瓶颈。
- 对外部依赖(第三方 API)使用 mock,专注测试自家服务。
- 为长期监控配置阈值:比如 p95、错误率、请求失败率等,接入告警。
典型场景与选型参考
下面是一组快速参考,帮助你在不同场景下选用 k6 的模式:
- 短突发压力测试:使用高 VU 短时 duration 或 iterations。
- 稳定持续负载:使用 stages 或 constant-arrival-rate 场景。
- 合规阈值检查(CI):在 options 中设置 thresholds 并在流水线中检测返回码。
小表格:常见输出后端对比
| 后端 | 适合场景 |
| influxdb | 长期存储、Grafana 可视化 |
| JSON 文件 | CI 报告、单次导出分析 |
| k6 cloud | 分布式大规模测试与托管可视化 |
实践小案例:把 HelloWorld 扩成可复用模板
把常见逻辑抽成模块:请求模块、验证模块(checks)、辅助函数(getAuthToken)、配置模块(env、options)。这样团队成员只需按模板填入业务 URL 与断言即可复用。
常见误区再强调几条
- 不要把 k6 的结果直接当作 SLA 的最终结论,测试结果需要结合监控(CPU、内存、GC、数据库性能)来看。
- 不要只看平均值,p90、p95 更能反映用户体验。
- 不要在生产流量上直接做高压测试,没有充足保护与沟通。
好了,既然把基本概念、示例、调优与 CI 实操都讲了,你可以从那段最简 HelloWorld 开始,逐步把认证、参数化、阈值、输出接入进来。边跑边看数据,遇到瓶颈先定位到是哪一层(网络、应用、数据库),然后再去针对性优化。若要进一步把结果做成长期可观测的指标,接入 InfluxDB + Grafana 或使用 k6 cloud 会省很多事。去写你的第一个脚本吧,运行一次、观察一次、改进一次,就像调乐器那样,慢慢就能弹出顺口的曲子来。