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

运行后,终端会输出实时指标,包括请求数、延迟分布、检查通过率等。下图展示了脚本的执行流程:

k6 脚本执行流程(第一个压测脚本) 导入内置模块 配置 options (VU/时长) default 函数(VU 循环) group("业务场景") http.get → check → sleep 循环执行 执行说明 • 每个 VU 独立运行 default 函数 • group 嵌套在 default 内部 • check 失败不影响循环继续

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 断言模式,能够对状态码、响应体、头部和响应时间进行验证。