k6/execution
k6/execution
模块提供了获取测试脚本内当前测试执行状态信息的能力。你可以在脚本中读取测试执行期间的执行状态,并根据当前状态更改脚本逻辑。
k6/execution
通过以下属性提供测试执行信息
import exec from 'k6/execution';
export const options = {
scenarios: {
myscenario: {
// this will be the returned name
executor: 'shared-iterations',
maxDuration: '30m',
},
},
};
export default function () {
console.log(exec.scenario.name); // myscenario
}
ℹ️ 标识符
所有唯一标识符都是从零(迭代)或一(VU ID)开始顺序生成的。在分布式/云测试运行中,全测试范围内的迭代次数和 VU 标识符在不同实例之间仍然是唯一的,尽管在序列中可能存在间隙,例如某些实例执行迭代比其他实例更快,或者在测试中期分配了更多 VU。
实例 (instance)
实例(instance)对象提供与负载生成器实例相关的信息。你可以将其视为当前正在运行的 k6 进程,如果你在本地机器上运行 k6,这很可能是一个单独的进程。当在云/分布式测试中运行多个负载生成器实例时,以下属性的值可能因实例而异。
属性 | 类型 | 描述 |
---|---|---|
iterationsInterrupted | 整数 | 当前实例中过早中断的迭代次数。 |
iterationsCompleted | 整数 | 当前实例中已完成的迭代次数。 |
vusActive | 整数 | 活动 VU 的数量。 |
vusInitialized | 整数 | 当前已初始化 VU 的数量。 |
currentTestRunDuration | 浮点数 | 当前测试运行开始至今经过的时间(毫秒)。 |
场景 (scenario)
关于当前运行的场景 (scenario) 的元信息和执行详情。
属性 | 类型 | 描述 |
---|---|---|
name | 字符串 | 正在运行场景的指定名称。 |
executor | 字符串 | 正在运行的执行器 (Executor) 类型名称。 |
startTime | 整数 | 场景开始时的 Unix 时间戳(毫秒)。 |
progress | 浮点数 | 场景进度的百分比,范围为 0 到 1。 |
iterationInInstance | 整数 | 在当前实例的场景中,当前迭代的唯一且基于零的顺序编号。 |
iterationInTest | 整数 | 场景中当前迭代的唯一且基于零的顺序编号。它在所有 k6 执行模式(本地、云和分布式/分段测试运行)中都是唯一的。然而,虽然每个实例在云/分布式测试中会获得不重叠的索引值,但它们可能以不同的速度迭代这些值,因此这些值在不同实例之间不会是顺序的。 |
测试 (test)
控制测试执行。
属性 | 类型 | 描述 |
---|---|---|
abort([String]) | 函数 | 它会中断测试运行并返回退出代码 108 ,可选的字符串参数可以提供错误消息。中断测试不会阻止 teardown() 函数的执行。 |
fail([String]) | 函数 | 它会使测试运行失败并返回退出代码 110 ,可选的字符串参数可以提供错误消息。使测试失败不会中断测试执行,允许迭代正常完成。 |
options | Object | 它返回一个对象,其中包含所有测试选项作为属性。选项值根据优先级顺序进行整合,并在使用了快捷方式时进行派生。对于未定义相关选项的属性,它返回 null 。 |
VU
关于当前 VU 的元信息和执行详情。
属性 | 类型 | 描述 |
---|---|---|
iterationInInstance | 整数 | 此 VU 在当前实例中的迭代标识符。这仅对于当前 VU 和此实例唯一(如果存在多个实例)。如果给定 VU 在多个场景之间被重用,则此标识符会持续累积。 |
iterationInScenario | 整数 | 此 VU 在当前场景中的迭代标识符。这仅对于当前 VU 和其正在执行的场景唯一。 |
idInInstance | 整数 | VU 在实例中的标识符。在多个实例之间不唯一。 |
idInTest | 整数 | VU 的全局唯一(在整个测试运行中)标识符。 |
metrics.tags | 对象 | 提供控制 VU 标签 (Tags) 的映射。标签将包含在 VU 发出的每个指标中,并且在 VU 存在期间,标签的状态会在同一场景的不同迭代中保持。请参阅下面的示例了解如何使用它。 |
metrics.metadata | 对象 | 提供控制 VU 元数据 (Metadata) 的映射。元数据将包含在 VU 发出的每个指标中,并且在 VU 存在期间,元数据的状态会在同一场景的不同迭代中保持。请参阅下面的示例了解如何使用它。 |
允许设置与系统标签具有相同键的标签,但这需要注意以避免意外结果。覆盖系统标签不会抛出错误,但在大多数情况下实际上不会按预期更改发出的指标值。例如,尝试设置 url
标签值在调用 http.get()
时不会导致标签值改变,因为标签值是由 HTTP 请求本身决定的。然而,它会将标签 url
添加到由 check()
或 metric.add()
发出的指标样本中,这可能不是期望的行为。另一方面,设置 name
标签会按预期工作,因为 http.*
方法已经支持此功能,以便实现URL 分组功能。
并非所有类型都可以用作标签值:k6 支持字符串、数字和布尔类型。在内部,tags
对象将标签作为 String
键值对处理,因此所有类型都将被隐式转换为字符串。如果使用了不允许的类型(例如 Object 或 Array),并且设置了 throw
选项,则会抛出异常。否则,只会打印警告,标签值将被丢弃。
示例和用例
获取一次性唯一数据
这是数据参数化的常见用例,你可以阅读使用 scenario.iterationInTest
和 vu.idInTest
的示例。
操作计时
scenario
对象的 startTime
属性可用于操作计时。
import exec from 'k6/execution';
export default function () {
// do some long operations
// ...
console.log(`step1: scenario ran for ${new Date() - new Date(exec.scenario.startTime)}ms`);
// some more long operations
//...
console.log(`step2: scenario ran for ${new Date() - new Date(exec.scenario.startTime)}ms`);
}
脚本命名
name
属性可用于根据当前运行的脚本执行逻辑。
提示:如果你需要在脚本中运行多个场景,可以使用
exec
选项实现类似的目标
import exec from 'k6/execution';
export const options = {
scenarios: {
'the-first': {
// ...
},
'the-second': {
// ...
},
},
};
export default function () {
if (exec.scenario.name === 'the-first') {
// do some logic during this scenario
} else {
// do some other logic in the others
}
}
测试中止
在初始化期间可以中止
import exec from 'k6/execution';
exec.test.abort();
以及在 default
函数内部
import exec from 'k6/execution';
export default function () {
// Note that you can abort with a specific message too
exec.test.abort('this is the reason');
}
export function teardown() {
console.log('teardown will still be called after test.abort()');
}
测试失败
execution.test.fail
函数支持受控的测试失败报告,而不会中断测试执行。调用此方法时,会将整个测试运行标记为失败,同时允许所有迭代正常完成。测试将以代码 110
退出,使外部系统可以检测到失败。这为类似于功能测试的场景提供了优雅的错误处理。
import http from 'k6/http';
import exec from 'k6/execution';
export const options = {
iterations: 10,
};
export default function () {
http.get('https://quickpizza.grafana.com');
if (exec.vu.iterationInInstance === 3) {
exec.test.fail(`iteration ${exec.vu.iterationInInstance}: marked the test as failed`);
}
console.log(`iteration ${exec.vu.iterationInInstance} executed`);
}
获取测试选项
获取合并和派生选项的值
import exec from 'k6/execution';
export const options = {
stages: [
{ duration: '5s', target: 100 },
{ duration: '5s', target: 50 },
],
};
export default function () {
console.log(exec.test.options.paused); // null
console.log(exec.test.options.scenarios.default.stages[0].target); // 100
}
标签 (Tags)
vu.metrics.tags
属性可用于获取或设置 VU 的标签。
import http from 'k6/http';
import exec from 'k6/execution';
export default function () {
exec.vu.metrics.tags['mytag'] = 'value1';
exec.vu.metrics.tags['mytag2'] = 2;
// the metrics these HTTP requests emit will get tagged with `mytag` and `mytag2`:
http.batch(['https://test.k6.io', 'https://quickpizza.grafana.com']);
}
也可以使用 vu.tags
(不带 metrics
),但建议使用更具上下文特异性的变体,前者已被弃用。
元数据
vu.metrics.metadata
属性可用于获取或设置 VU 的元数据。它类似于 tags
,但可用于高基数数据。它也不能在阈值中使用,并且很可能由每个输出进行不同的处理。
import http from 'k6/http';
import exec from 'k6/execution';
export default function () {
exec.vu.metrics.metadata['trace_id'] = 'somecoolide';
// the metrics these HTTP requests emit will get the metadata `trace_id`:
http.batch(['https://test.k6.io', 'https://quickpizza.grafana.com']);
delete exec.vu.metrics.metadata['trace_id']; // this will unset it
// which will make the metrics these requests to not have the metadata `trace_id` set on them.
http.batch(['https://test.k6.io', 'https://quickpizza.grafana.com']);
}