菜单
开源

k6/execution

k6/execution 模块提供了获取测试脚本内当前测试执行状态信息的能力。你可以在脚本中读取测试执行期间的执行状态,并根据当前状态更改脚本逻辑。

k6/execution 通过以下属性提供测试执行信息

JavaScript
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,可选的字符串参数可以提供错误消息。使测试失败不会中断测试执行,允许迭代正常完成。
optionsObject它返回一个对象,其中包含所有测试选项作为属性。选项值根据优先级顺序进行整合,并在使用了快捷方式时进行派生。对于未定义相关选项的属性,它返回 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 存在期间,元数据的状态会在同一场景的不同迭代中保持。请参阅下面的示例了解如何使用它。

示例和用例

获取一次性唯一数据

这是数据参数化的常见用例,你可以阅读使用 scenario.iterationInTestvu.idInTest示例

操作计时

scenario 对象的 startTime 属性可用于操作计时。

JavaScript
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 选项实现类似的目标

JavaScript
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
  }
}

测试中止

在初始化期间可以中止

JavaScript
import exec from 'k6/execution';
exec.test.abort();

以及在 default 函数内部

JavaScript
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 退出,使外部系统可以检测到失败。这为类似于功能测试的场景提供了优雅的错误处理。

JavaScript
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`);
}

获取测试选项

获取合并和派生选项的值

JavaScript
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 的标签

JavaScript
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,但可用于高基数数据。它也不能在阈值中使用,并且很可能由每个输出进行不同的处理。

JavaScript
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']);
}