k6 环境变量与执行上下文
(Grafana k6 登堂入室, Part 12)
发表于 2026-03
环境变量
测试脚本经常需要根据不同的环境做微调——比如测试地址、认证信息、并发数等。与其为每个环境写一份脚本,不如用环境变量来参数化。
向脚本传递环境变量
k6 通过全局对象 __ENV 暴露环境变量:
import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
const res = http.get(`http://${__ENV.MY_HOSTNAME}/`);
sleep(1);
}
推荐用 -e 参数传入:
k6 run -e MY_HOSTNAME=test.k6.io script.js
也可以通过系统环境变量传入:
MY_HOSTNAME=test.k6.io k6 run script.js
有一点要注意:-e 参数只是向脚本传值,不会配置 k6 选项。比如 -e K6_ITERATIONS=120 并不会设置迭代次数。要通过环境变量配置选项,得用 K6_ 前缀的系统环境变量:
K6_VUS=10 K6_DURATION=10s k6 run script.js
这样 k6 才会把 K6_VUS 和 K6_DURATION 识别为选项参数。
之前在「选项」那篇文章里提到过优先级:默认值 < 配置文件 < 脚本中的 options < 环境变量 < 命令行参数。如果想确保用最高优先级,直接用 CLI 参数:
k6 run -e MY_HOSTNAME=test.k6.io --duration 10s --vus 10 script.js
执行上下文变量
有些场景下,你需要在脚本中获取当前的运行状态——比如当前是第几个 VU、第几次迭代、测试跑了多久。k6 的 k6/execution 模块提供了这些信息。
k6/execution 模块
这个模块通过三个属性暴露执行上下文:
| 属性 | 包含的信息 |
|---|---|
instance |
当前 k6 实例的全局信息 |
scenario |
当前场景的信息 |
vu |
当前 VU 和迭代的信息 |
来看一个完整的例子,把所有上下文变量都打印出来:
import exec from 'k6/execution';
export default function () {
console.log(`Execution context
Instance info
-------------
Vus active: ${exec.instance.vusActive}
Iterations completed: ${exec.instance.iterationsCompleted}
Iterations interrupted: ${exec.instance.iterationsInterrupted}
Initialized vus: ${exec.instance.vusInitialized}
Time passed from start of run(ms): ${exec.instance.currentTestRunDuration}
Scenario info
-------------
Name of the running scenario: ${exec.scenario.name}
Executor type: ${exec.scenario.executor}
Scenario start timestamp: ${exec.scenario.startTime}
Percentage complete: ${exec.scenario.progress}
Iteration in instance: ${exec.scenario.iterationInInstance}
Iteration in test: ${exec.scenario.iterationInTest}
VU info
-------
Iteration id: ${exec.vu.iterationInInstance}
Iteration in scenario: ${exec.vu.iterationInScenario}
VU ID in instance: ${exec.vu.idInInstance}
VU ID in test: ${exec.vu.idInTest}
VU tags: ${exec.vu.tags}`);
}
典型用法
一个常见的场景是让不同的 VU 使用不同的测试数据。比如模拟不同用户登录:
import http from 'k6/http';
import exec from 'k6/execution';
const users = open('./users.json');
export default function () {
const user = JSON.parse(users)[exec.vu.idInTest - 1];
const payload = JSON.stringify({
email: user.email,
password: user.password,
});
const params = { headers: { 'Content-Type': 'application/json' } };
http.post('http://test.k6.io/login', payload, params);
}
__VU 和 __ITER
k6 还提供了两个旧版的全局变量 __VU 和 __ITER,分别表示当前 VU 编号(从 1 开始)和当前迭代编号(从 0 开始)。功能上和 exec.vu.idInTest、exec.vu.iterationInInstance 类似,但 k6/execution 模块提供的信息更丰富,推荐优先使用。
import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
http.get('http://test.k6.io');
console.log(`VU: ${__VU} - ITER: ${__ITER}`);
sleep(1);
}
lyyyuna 沪ICP备2025110782号-1