场景
场景可以详细配置 VUs 和迭代调度。通过场景,您可以在负载测试中模拟不同的工作负载或流量模式。
使用场景的好处包括
- 更轻松、更灵活的测试组织。您可以在同一个脚本中声明多个场景,每个场景都可以独立执行不同的 JavaScript 函数。
- 模拟更真实的流量。每个场景都可以使用不同的 VU 和迭代调度模式,这由专门构建的执行器支持。
- 并行或顺序工作负载。场景相互独立并并行运行,但可以通过仔细设置每个场景的
startTime
属性来使其看起来是顺序的。 - 细粒度结果分析。可以为每个场景设置不同的环境变量和指标标签。
配置场景
要配置场景,请在 options
对象中使用 scenarios
键。您可以为场景指定任何名称,只要脚本中的每个场景名称是唯一的即可。
场景名称会出现在结果摘要、标签等中。
export const options = {
scenarios: {
example_scenario: {
// name of the executor to use
executor: 'shared-iterations',
// common scenario configuration
startTime: '10s',
gracefulStop: '5s',
env: { EXAMPLEVAR: 'testing' },
tags: { example_tag: 'testing' },
// executor-specific configuration
vus: 10,
iterations: 200,
maxDuration: '10s',
},
another_scenario: {
/*...*/
},
},
};
场景执行器
对于每个 k6 场景,VU 工作负载由一个执行器调度。执行器配置测试运行多长时间,流量是保持不变还是变化,以及工作负载是按 VUs 建模还是按到达率建模(即开放或封闭模型)。
您的场景对象必须使用预定义的执行器名称之一来定义 executor
属性。您选择的执行器决定了 k6 如何模拟负载。可用的执行器包括
按迭代次数。
shared-iterations
(共享迭代) 在 VUs 之间共享迭代。per-vu-iterations
(按 VU 迭代) 让每个 VU 运行配置的迭代次数。
按 VU 数量。
constant-VUs
(固定 VU 数) 以固定数量发送 VUs。ramping-vus
(递增 VU 数) 根据您配置的阶段递增 VU 数量。
按迭代率。
constant-arrival-rate
(固定到达率) 以固定速率开始迭代。ramping-arrival-rate
(递增到达率) 根据您配置的阶段递增迭代率。
除了通用场景选项外,每个执行器对象还有针对其工作负载的附加选项。有关完整列表,请参阅执行器。
场景选项
选项 | 类型 | 描述 | 默认值 |
---|---|---|---|
executor(必需) ️ | string | 唯一的执行器名称。请参阅执行器部分的可能值列表。 | - |
startTime | string | 自测试开始以来的时间偏移量,此时该场景应开始执行。 | "0s" |
gracefulStop | string | 在强制停止迭代之前等待其完成执行的时间。要了解更多信息,请阅读平滑停止。 | "30s" |
exec | string | 要执行的导出 JS 函数名称。 | "default" |
env | object | 此场景特有的环境变量。 | {} |
tags | object | 此场景特有的标签。 | {} |
options | object | 附加选项包括浏览器选项。 | {} |
场景示例
此脚本结合了两个带顺序的场景
shared_iter_scenario
立即开始。十个 VU 尝试尽快使用 100 次迭代(有些 VU 可能比其他 VU 使用更多迭代)。per_vu_scenario
在 10 秒后开始。在这种情况下,每个 VU 运行十次迭代。
哪个场景花费时间更长?您可以运行测试来发现。您还可以为一个或两个场景添加 maxDuration
属性。
import http from 'k6/http';
export const options = {
scenarios: {
shared_iter_scenario: {
executor: 'shared-iterations',
vus: 10,
iterations: 100,
startTime: '0s',
},
per_vu_scenario: {
executor: 'per-vu-iterations',
vus: 10,
iterations: 10,
startTime: '10s',
},
},
};
export default function () {
http.get('https://test.k6.io/');
}
如果您运行带有场景的脚本,k6 输出会包含每个场景的高级信息。例如,如果您运行上面的脚本,k6 run scenario-example.js
,则 k6 会按如下方式报告场景
execution: local
script: scenario-example.js
output: -
scenarios: (100.00%) 2 scenarios, 20 max VUs, 10m40s max duration (incl. grace
ful stop):
* shared_iter_scenario: 100 iterations shared among 10 VUs (maxDurati
on: 10m0s, gracefulStop: 30s)
* per_vu_scenario: 10 iterations for each of 10 VUs (maxDuration: 10m
0s, startTime: 10s, gracefulStop: 30s)
完整的输出包括汇总指标,就像任何默认的测试结束摘要一样
/\ Grafana /‾‾/
/\ / \ |\ __ / /
/ \/ \ | |/ / / ‾‾\
/ \ | ( | (‾) |
/ __________ \ |_|\_\ \_____/
execution: local
script: scenario-example.js
output: -
scenarios: (100.00%) 2 scenarios, 20 max VUs, 10m40s max duration (incl. grace
ful stop):
* shared_iter_scenario: 100 iterations shared among 10 VUs (maxDurati
on: 10m0s, gracefulStop: 30s)
* per_vu_scenario: 10 iterations for each of 10 VUs (maxDuration: 10m
0s, startTime: 10s, gracefulStop: 30s)
█ TOTAL RESULTS
HTTP
http_req_blocked........................................................: avg=24.59ms min=1µs med=4µs max=263.64ms p(90)=22.48ms p(95)=245.04ms
http_req_connecting.....................................................: avg=11.36ms min=0s med=0s max=120.45ms p(90)=10.76ms p(95)=115.19ms
http_req_duration.......................................................: avg=115.25ms min=108.25ms med=115.66ms max=170.62ms p(90)=119.59ms p(95)=121.13ms
{ expected_response:true }............................................: avg=115.25ms min=108.25ms med=115.66ms max=170.62ms p(90)=119.59ms p(95)=121.13ms
http_req_failed.........................................................: 0.00% 0 out of 200
http_req_receiving......................................................: avg=214.61µs min=15µs med=73.5µs max=4.57ms p(90)=253.4µs p(95)=1.08ms
http_req_sending........................................................: avg=17.79µs min=3µs med=12µs max=669µs p(90)=22µs p(95)=25µs
http_req_tls_handshaking................................................: avg=12.01ms min=0s med=0s max=126.23ms p(90)=11.49ms p(95)=120.04ms
http_req_waiting........................................................: avg=115.02ms min=107.7ms med=115.33ms max=170.59ms p(90)=119.54ms p(95)=121.04ms
http_reqs...............................................................: 200 17.489795/s
EXECUTION
iteration_duration......................................................: avg=140.07ms min=108.3ms med=116.14ms max=383.32ms p(90)=187.14ms p(95)=363.64ms
iterations..............................................................: 200 17.489795/s
vus.....................................................................: 10 min=0 max=10
vus_max.................................................................: 20 min=20 max=20
NETWORK
data_received...........................................................: 2.4 MB 209 kB/s
data_sent...............................................................: 26 kB 2.3 kB/s
█ SCENARIO: per_vu_scenario
HTTP
http_req_blocked...................................: avg=23.52ms min=1µs med=4µs max=244.87ms p(90)=22.39ms p(95)=234.84ms
http_req_connecting................................: avg=11.45ms min=0s med=0s max=120.45ms p(90)=10.84ms p(95)=115.81ms
http_req_duration..................................: avg=114.86ms min=108.25ms med=115.74ms max=123.17ms p(90)=120.08ms p(95)=121.13ms
http_req_failed....................................: 0.00% 0 out of 100
http_req_receiving.................................: avg=195.59µs min=15µs med=73.5µs max=4.57ms p(90)=247.5µs p(95)=875.99µs
http_req_sending...................................: avg=20.8µs min=3µs med=12µs max=669µs p(90)=22.1µs p(95)=27.09µs
http_req_tls_handshaking...........................: avg=12.06ms min=0s med=0s max=126.23ms p(90)=11.49ms p(95)=120.61ms
http_req_waiting...................................: avg=114.64ms min=107.78ms med=115.38ms max=123.07ms p(90)=120.04ms p(95)=121.04ms
http_reqs..........................................: 100 8.744897/s
EXECUTION
iteration_duration.................................: avg=138.53ms min=108.3ms med=116.22ms max=363.71ms p(90)=144.44ms p(95)=353.48ms
iterations.........................................: 100 8.744897/s
NETWORK
data_received......................................: 1.2 MB 104 kB/s
data_sent..........................................: 13 kB 1.1 kB/s
█ SCENARIO: shared_iter_scenario
HTTP
http_req_blocked...................................: avg=25.66ms min=1µs med=4µs max=263.64ms p(90)=24.98ms p(95)=256.16ms
http_req_connecting................................: avg=11.27ms min=0s med=0s max=115.37ms p(90)=10.76ms p(95)=115.15ms
http_req_duration..................................: avg=115.65ms min=108.38ms med=115.61ms max=170.62ms p(90)=119.11ms p(95)=120.91ms
http_req_failed....................................: 0.00% 0 out of 100
http_req_receiving.................................: avg=233.63µs min=22µs med=73.5µs max=4.22ms p(90)=324.6µs p(95)=1.11ms
http_req_sending...................................: avg=14.77µs min=3µs med=12µs max=128µs p(90)=20µs p(95)=22µs
http_req_tls_handshaking...........................: avg=11.96ms min=0s med=0s max=124.34ms p(90)=11.64ms p(95)=118.98ms
http_req_waiting...................................: avg=115.4ms min=107.7ms med=115.33ms max=170.59ms p(90)=118.94ms p(95)=120.85ms
http_reqs..........................................: 100 8.744897/s
EXECUTION
iteration_duration.................................: avg=141.6ms min=108.46ms med=116.09ms max=383.32ms p(90)=189.98ms p(95)=375.24ms
iterations.........................................: 100 8.744897/s
NETWORK
data_received......................................: 1.2 MB 104 kB/s
data_sent..........................................: 13 kB 1.1 kB/s
running (00m12.8s), 00/20 VUs, 200 complete and 0 interrupted iterations
shared_iter_scenario ✓ [ 100% ] 10 VUs 00m02.7s/10m0s 100/100 shared iters
per_vu_scenario ✓ [ 100% ] 10 VUs 00m02.8s/10m0s 100/100 iters, 10 per V