lyyyuna 的小花园

动静中之动, by

RSS

k6 环境变量与执行上下文

发表于 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_VUSK6_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.idInTestexec.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