3. k6 脚本基础语法:JavaScript ES6 语法回顾、k6 内置模块与第一个压测脚本
本章是 k6 脚本开发的起点。你将回顾编写 k6 脚本必需的 JavaScript ES6 语法,掌握 k6 最核心的内置模块(http、check、sleep、group),并完成第一个可运行的压测脚本。所有后续的复杂编排、事件触发和巡检逻辑都建立在本章基础之上。
3.1 JavaScript ES6 语法快速回顾
k6 脚本运行在 Go 语言编写的 JavaScript 运行时中,支持 ES6 标准的大部分特性。以下是你编写脚本时最常用的语法点:
| 语法特性 | 说明 | k6 脚本示例 |
|---|---|---|
| 箭头函数 | 简洁的函数定义,不绑定 this |
const add = (a, b) => a + b; |
| 模板字符串 | 使用反引号嵌入变量和表达式 | const url = `https://api.example.com/users/${id}`; |
| 解构赋值 | 从对象或数组中提取值 | const { status, body } = http.get(url); |
| let / const | 块级作用域变量声明 | const baseUrl = 'http://test.k6.io'; |
| 模块导入 | 使用 import 引入 k6 内置模块 |
import http from 'k6/http'; |
| 默认参数 | 函数参数设置默认值 | function log(msg = 'default') { ... } |
💡 提示:k6 不支持 DOM API、
window、document 等浏览器对象。你的脚本运行在服务端压测环境中,只使用纯逻辑和网络请求。
3.2 k6 核心内置模块
k6 提供了多个内置模块,其中 http、check、sleep、group 是编写压测脚本的基石。下表总结了它们的作用和常用方法:
| 模块 | 导入方式 | 核心方法 / 用途 |
|---|---|---|
| http | import http from 'k6/http'; |
http.get(url, [params])、http.post(url, body, [params])、http.put()、http.del()、http.batch() |
| check | import { check } from 'k6'; |
check(res, { 'status is 200': (r) => r.status === 200 }),用于断言响应结果 |
| sleep | import { sleep } from 'k6'; |
sleep(1),暂停 VU 执行指定秒数,模拟用户思考时间 |
| group | import { group } from 'k6'; |
group('用户登录流程', () => { ... }),对请求进行逻辑分组,便于报告聚合 |
📌 关键点:
check 不会终止脚本执行,它只记录通过/失败次数。失败时脚本继续运行,但会在报告中标记。如果需要失败时停止,需结合 fail() 函数。
3.3 第一个压测脚本:逐行解析
下面是一个完整的 k6 脚本,它访问测试网站首页,验证响应状态码,并模拟用户等待。我们将逐行分析其结构。
import http from 'k6/http';
import { check, sleep, group } from 'k6';
export const options = {
vus: 10,
duration: '30s',
};
export default function () {
group('访问首页', () => {
const res = http.get('https://test.k6.io');
check(res, {
'首页状态码为 200': (r) => r.status === 200,
'响应时间 < 500ms': (r) => r.timings.duration < 500,
});
sleep(1);
});
group('访问新闻页', () => {
const res = http.get('https://test.k6.io/news');
check(res, {
'新闻页状态码为 200': (r) => r.status === 200,
});
sleep(2);
});
}
脚本结构说明:
- 导入模块:第 1-2 行导入
http、check、sleep、group。 - 配置选项:第 4-7 行定义
options对象,设置 10 个虚拟用户(VU)持续运行 30 秒。 - 默认函数:第 9 行
export default function ()是每个 VU 循环执行的入口。 - 分组:使用
group()将请求按业务场景分组,报告中会分别统计。 - HTTP 请求:
http.get()发送 GET 请求,返回响应对象res。 - 检查点:
check()对响应进行断言,第一个参数是响应对象,第二个参数是检查项对象。 - 思考时间:
sleep(1)暂停 1 秒,模拟真实用户操作间隔。
⚠️ 常见错误:忘记在
check 中使用箭头函数返回布尔值。例如 check(res, { 'status is 200': r.status === 200 }) 是错误的,必须写成 (r) => r.status === 200。
3.4 运行你的第一个脚本
将上述脚本保存为 first-test.js,在终端中执行以下命令:
k6 run first-test.js
运行后,终端会输出实时指标,包括请求数、延迟分布、检查通过率等。下图展示了脚本的执行流程:
3.5 常用检查模式与参数
check 支持同时检查多个条件,也可以对响应体、头部、JSON 字段进行断言。以下是一些常用模式:
import http from 'k6/http';
import { check } from 'k6';
export default function () {
const res = http.get('https://test.k6.io');
check(res, {
'状态码为 200': (r) => r.status === 200,
'响应体包含 "k6"': (r) => r.body.includes('k6'),
'Content-Type 为 text/html': (r) => r.headers['Content-Type'] === 'text/html; charset=utf-8',
'响应时间 < 1000ms': (r) => r.timings.duration < 1000,
});
}
| 检查目标 | 表达式示例 | 说明 |
|---|---|---|
| HTTP 状态码 | r.status === 200 |
验证请求是否成功 |
| 响应体内容 | r.body.includes('success') |
验证返回数据包含特定字符串 |
| 响应头 | r.headers['Content-Type'] === 'application/json' |
验证响应格式 |
| 响应时间 | r.timings.duration < 500 |
验证性能阈值(单位毫秒) |
| JSON 字段 | JSON.parse(r.body).status === 'ok' |
解析 JSON 后验证字段值 |
💡 最佳实践:每个
check 的标签名应使用清晰的中文或英文描述,例如 '首页加载成功',这样在报告中可以快速定位失败项。
3.6 本章小结
通过本章学习,你已经掌握了:
- k6 脚本中常用的 ES6 语法(箭头函数、模板字符串、解构赋值等)。
- 四个核心内置模块
http、check、sleep、group的导入与使用方法。 - 编写并运行了第一个完整的压测脚本,理解了
options、default函数、分组和检查点的协作关系。 - 多种
check断言模式,能够对状态码、响应体、头部和响应时间进行验证。