什么是转k6? 是给谁的?? K6是为工程团队构建的用于负载test的流行开源工具. 诞生于初创公司, k6于2021年被Grafana Labs收购, 也许是因为它能够集成大量的第三方工具. 在这篇文章中, 利记手机app将阐述利记手机app使用k6的经验,以及利记手机app对如何充分利用它的看法.
表的内容
转k6的优点
- K6消耗的系统资源最少,并且具有高性能.
- 与转k6, 您将能够执行不同类型的负载test, 例如, 最大搜索test, 压力test, 或可靠性test.
- 性能监视:k6为自动化性能test提供了很好的机会. 您可以以较轻的负载运行test,以持续监视系统的性能.
转k6的局限性
- K6不像浏览器那样显示网页. 这意味着使用浏览器api的库将不兼容. 这个实现大大减少了系统资源的消耗, 虽然, 哪个工具更有生产力. 同时,k6可以用于网站和应用程序的负载test. 可以从记录的用户会话创建脚本.
- JavaScript通常不适合非常高的负载. 达到最佳性能, 该工具本身是用Go编写的,带有内置的JavaScript运行时环境,允许您轻松创建test脚本.
用k6开始负载test
在k6中,生成加载的函数是这样的:
导出默认函数(){
}
你可以在下面一个简单的脚本中看到它的使用:
从“k6/ HTTP”导入HTTP;
从' k6 '中导入{sleep};
导出默认函数(){
http.get (" http://test.k6.io’);
睡眠(1);
}
这是启动k6的方式:
转k6运行脚本.js
现在让利记手机app添加虚拟用户(vu)并设置test的持续时间:
K6执行-vus开头 10 -duration 30s脚本.js
你可以在脚本中这样做:
阶段:(
{duration: ' 2m ', target: 1000},
{duration: ' 30m ', target: 1000},
{duration: ' 30s ', target: 1500},
{duration: ' 30m ', target: 1500}
],
或者使用下面的代码:
导出let选项= {
vus开头开头:10,
持续时间:30年代”,
};

负载test中的k6虚拟用户是什么?
k6使用运行脚本的虚拟用户(vu)的概念——它们在(真)循环时本质上是并行的. 脚本是使用JavaScript编写的ES6模块(JS规范), 它允许您将大型test拆分为较小的部分,或者创建可重用的部分.
脚本至少应该包含一个默认函数——它定义了vu的入口点.
导出默认函数(){
// vu代码:在这里做事情…
}
默认函数中的代码称为“VU代码”,并且在test运行时不断重复. 外部的代码称为“初始化代码”,每个VU只运行一次.
VU代码可以执行HTTP请求, 产生一个矩阵, 并且通常执行您希望从负载test中得到的所有操作——除了几个重要的例外情况:您不能从本地文件系统上传任何内容,也不能导入任何其他模块. 所有这些都需要从初始化代码开始完成.
你可以使用选项.在负载test期间改变vu的数量.
从“k6/ HTTP”导入HTTP;
从' k6 '中导入{检查, sleep};
导出const选项= {
阶段:(
{duration: ' 30s ', target: 20},
{duration: ' 1m30s ', target: 10},
{duration: ' 20s ', target: 0},
],
};
导出默认函数(){
Const res = HTTP.get (" http://httpbin.org/”);
检查(res, { ‘状态 was 200’: (r) => r.Status == 200});
睡眠(1);
}
k6中的test场景是什么?
场景提供了优化vu和迭代的机会. 多个场景可以在一个脚本中工作, 每一个都可以独立执行不同的JavaScript功能. 每个场景都可以使用自己数量的vu和迭代模式. 场景可以配置为顺序运行或同时运行.
导出const选项= {
场景:{
example_场景: {
//要使用的执行器的名称
遗嘱执行人:“shared-迭代”,
//普通场景配置
开始时间:10年代”,
gracefulStop:“5 s”,
env: {EXAMPLEVAR: ' testing '},
标签:{example_标签: ' testing '},
/ / 遗嘱执行人-specific配置
vus开头开头:10,
迭代:200年,
maxDuration:“10”,
},
another_场景: {
/*…*/
},
},
};

k6中执行程序的类型
遗嘱执行人是k6执行引擎的主力. 每一个都以不同的方式安排vu和迭代, 您将根据您想要建模的流量类型来选择一个来test您的利记手机.
k6中执行器的类型如下:
的名字 | 价值 | 描述 |
---|---|---|
共享的迭代 | shared-迭代 | 固定数量的迭代“分布”在几个vu之间. |
每VU迭代 | per-vu-迭代 | 每个VU执行精确次数的迭代. |
执行常数的vu | constant-vus开头 | 固定数量的vu在指定的时间间隔内执行最大可能的迭代次数. |
增加VUs开头 | ramping-vus开头 | 可变数量的vu在给定的时间间隔内执行最大次数的迭代. |
持续的到达率 | constant-arrival-rate | 在指定的时间段内执行固定数量的迭代. |
增加到达率 | ramping-arrival-rate | 在指定的时间段内执行的迭代次数是可变的. |
外部控制 | 外部控制 | 使用k6的REST API或CLI (CLI)进行运行时管理和伸缩. |
还有一些常用的遗嘱执行人选项:
Option | 类型 | 描述 | 默认的 |
---|---|---|---|
遗嘱执行人(必需) | 字符串 | 可能值列表中的执行程序的名称. | - |
开始时间 | 字符串 | 从负载test开始的倒计时,在此之后,场景应该开始执行. | "0s" |
gracefulStop | 字符串 | 在强制停止迭代之前,等待迭代完成执行的时间. | "30s" |
执行 | 字符串 | 导出要执行的JS函数的名称. | “默认” |
env | object | 特定于此场景的环境变量. | {} |
标签 | object | 特定于此场景的标记. | {} |
共享的迭代
固定数量的迭代“分布”在许多vu中, 并且test在所有的迭代完成之后结束. 迭代的分布是不均匀的,一些vu将比其他vu执行更多的迭代.
Option | 类型 | 描述 | 默认的 |
---|---|---|---|
vus开头 | 整数 | 并发运行的vu数量. | 1 |
迭代 | 整数 | 所有vu执行的场景迭代的总数. | 1 |
maxDuration | 字符串 | 场景强制停止(不包括gracefulStop)之前的最大持续时间. | "10m" |
如果希望特定数量的vu执行固定的迭代总数,则使用共享迭代, 一个VU执行的迭代次数无关紧要.
在下面的例子中, 利记手机app将执行200个总迭代, 分布在10个vu之间, 最长持续时间为10秒:
从“k6/ HTTP”导入HTTP;
导出const选项= {
discardResponseBodies:没错,
场景:{
联系人:{
遗嘱执行人:“shared-迭代”,
vus开头开头:10,
迭代:200年,
maxDuration:“10”,
},
},
};
导出默认函数(){
http.get (" http://test.k6.io /联系人.php的);
}
从“k6/ HTTP”导入HTTP;
导出const选项= {
discardResponseBodies:没错,
场景:{
联系人:{
遗嘱执行人:“——共享
迭代”,
vus开头开头:10,
迭代:200年,
maxDuration:“10”,
},
},
};
导出默认函数(){
http.get (" http://test.k6.io/
联系人.php的);
}
每VU迭代
每个VU执行精确次数的迭代. 执行的迭代总数将等于vus开头*迭代.
Option | 类型 | 描述 | 默认的 |
---|---|---|---|
vus开头 | 整数 | 同时运行的vu数量 | 1 |
迭代 | 整数 | 每个VU执行的迭代次数. | 1 |
maxDuration | 字符串 | 场景强制停止(不包括gracefulStop)之前的最大持续时间. | "10m" |
如果您需要一定数量的vu来执行一定数量的迭代,请使用此执行器. 当您有固定的test数据集,希望在vu之间分割时,这可能非常有用.
在下面的例子中, 10个vu每个执行20次迭代, 共200次迭代,最大持续时间为1小时30分钟:
从“k6/ HTTP”导入HTTP;
导出const选项= {
discardResponseBodies:没错,
场景:{
联系人:{
遗嘱执行人:“per-vu-迭代”,
vus开头开头:10,
迭代:20,
maxDuration:‘1 h30m ',
},
},
};
导出默认函数(){
http.get (" http://test.k6.io /联系人.php的);
}
从“k6/ HTTP”导入HTTP;
导出const选项= {
discardResponseBodies:没错,
场景:{
联系人:{
遗嘱执行人:“per-vu -
迭代”,
vus开头开头:10,
迭代:20,
maxDuration:‘1 h30m ',
},
},
};
导出默认函数(){
http.get (" http://test.k6.io/
联系人.php的);
}
执行常数的vu
固定数量的vu在指定的时间间隔内执行最大可能的迭代次数.
Option | 类型 | 描述 | 默认的 |
---|---|---|---|
持续时间(必需) | 字符串 | 场景的总持续时间(不包括gracefulStop). | - |
vus开头 | 整数 | 并发运行的vu数量. | 1 |
如果您需要一定数量的vu才能工作一段时间,请使用此执行程序.
在本例中,10个vu将连续工作45分钟:
从“k6/ HTTP”导入HTTP;
从' k6 '中导入{sleep};
导出const选项= {
discardResponseBodies:没错,
场景:{
my_awesome_api_test: {
遗嘱执行人:“constant-vus开头”,
vus开头开头:10,
持续时间:45米,
},
},
};
导出默认函数(){
http.get (" http://test-api.k6.io/’);
睡眠(数学.随机()* 3);
}
增加VUs开头
可变数量的vu在给定的时间间隔内执行最大次数的迭代.
Option | 类型 | 描述 | 默认的 |
---|---|---|---|
阶段(必需) | 数组 | 一个对象数组,定义要增加或减少的vu的目标数量. | [ ] |
startVUs | 整数 | test开始时要运行的vu的数量. | 1 |
gracefulRampDown | 字符串 | 等待已经开始的迭代完成的时间,然后在下降过程中停止它. | "30s" |
如果需要在一定时间内增加或减少vu的数量,请使用此执行程序.
在这个例子中, 利记手机app将运行一个两步test,在5秒内从0增加到100 vu,并在5秒内返回到0 vu:
从“k6/ HTTP”导入HTTP;
导出const选项= {
discardResponseBodies:没错,
场景:{
联系人:{
遗嘱执行人:“ramping-vus开头”,
startVUs: 0,
阶段:(
{duration: ' 5s ', target: 100},
{duration: ' 5s ', target: 0},
],
gracefulRampDown:“0”,
},
},
};
导出默认函数(){
http.get (" http://test.k6.io /联系人.php的);
}
从“k6/ HTTP”导入HTTP;
导出const选项= {
discardResponseBodies:没错,
场景:{
联系人:{
遗嘱执行人:“ramping-vus开头”,
startVUs: 0,
阶段:(
{duration: ' 5s ', target: 100},
{duration: ' 5s ', target: 0},
],
gracefulRampDown:“0”,
},
},
};
导出默认函数(){
http.get (" http://test.k6.io/
联系人.php的);
}
持续的到达率
在一段时间内执行固定数量的迭代. 因为迭代执行时间可能会变化, 例如, 由于test过程中系统速度变慢, 这个执行程序将尝试通过运行额外的vu来弥补这一点, 包括可能在test中间初始化更多, 以维护配置的迭代率.
Option | 类型 | 描述 | 默认的 |
---|---|---|---|
持续时间(必需) | 字符串 | 场景的总持续时间(不包括gracefulStop) | - |
率(必需) | 整数 | 每个指定时间段内执行的迭代次数(TimeUnit) | - |
preAllocatedVUs(必需) | 整数 | 开始test前必须预分配的vu数量 | - |
timeUnit | 字符串 | 应用速率值的时间段 | "1s" |
maxVUs | 整数 | test期间允许的vu的最大数量 | - |
使用这个执行程序来维护固定数量的请求,而不会影响被test系统的性能.
在这个例子中, 利记手机app将在1分钟内保持每秒200个请求的恒定强度, 这将允许k6动态调度多达100 vu:
从“k6/ HTTP”导入HTTP;
导出const选项= {
discardResponseBodies:没错,
场景:{
联系人:{
遗嘱执行人:“constant-arrival-rate”,
rate: 200, // 200 RPS,因为timeUnit是默认的1
持续时间:1米,
preAllocatedVUs: 50,
maxVUs: 100,
},
},
};
导出默认函数(){
http.get (" http://test.k6.io /联系人.php的);
}
从“k6/ HTTP”导入HTTP;
导出const选项= {
discardResponseBodies:没错,
场景:{
联系人:{
遗嘱执行人:“constant-arrival -
率”,
速率:200,// 200 RPS, since
timeUnit默认为1秒
持续时间:1米,
preAllocatedVUs: 50,
maxVUs: 100,
},
},
};
导出默认函数(){
http.get (" http://test.k6.io/
联系人.php的);
}
增加到达率
在一段时间内执行的迭代次数是可变的. k6将尝试动态改变vu的数量,以达到给定的迭代频率.
Option | 类型 | 描述 | 默认的 |
---|---|---|---|
阶段(必需) | 数组 | 一组对象,指示要增加或减少的目标迭代次数. | [ ] |
preAllocatedVUs(必需) | 整数 | 开始test前必须预分配的vu数量. | - |
start率 | 整数 | 每个指定时间段执行的迭代次数(TimeUnit) | 0 |
timeUnit | 字符串 | 应用start率和s标签e目标值的一段时间. | "1s" |
maxVUs | 整数 | 在test运行期间允许的vu的最大数量 | - |
使用这个执行人, 如果有必要,test不受被测系统性能的影响, 并且您希望在一定的时间内增加或减少迭代的数量
在这个例子中, 利记手机app将运行一个每秒请求数可变的test, 从50, 增加到200, 然后在1分钟内回到0:
从“k6/ HTTP”导入HTTP;
导出const选项= {
discardResponseBodies:没错,
场景:{
联系人:{
遗嘱执行人:“ramping-arrival-rate”,
start率: 50,
timeUnit:“1”,
preAllocatedVUs: 50,
maxVUs: 100,
阶段:(
{target: 200, duration: ' 30s '},
{target: 0, duration: ' 30s '},
],
},
},
};
导出默认函数(){
http.get (" http://test.k6.io /联系人.php的);
}
从“k6/ HTTP”导入HTTP;
导出const选项= {
discardResponseBodies:没错,
场景:{
联系人:{
遗嘱执行人:“ramping-arrival -
率”,
start率: 50,
timeUnit:“1”,
preAllocatedVUs: 50,
maxVUs: 100,
阶段:(
{目标:200,持续时间:
’30s’ },
{target: 0, duration: ' 30s '},
],
},
},
};
导出默认函数(){
http.get (" http://test.k6.io/
联系人.php的);
}
外部控制
在test期间通过k6 REST API或命令行接口进行控制和扩展.
Option | 类型 | 描述 | 默认的 |
---|---|---|---|
持续时间(必需) | 字符串 | test的总持续时间. | - |
vus开头 | 整数 | 并发运行的vu数量. | - |
maxVUs | 整数 | test期间允许的vu的最大数量 | - |
如果您想在test执行期间控制vu的数量,请使用此执行程序. 这是k6云中唯一不支持的执行程序, 它只能在k6启动时在本地使用(转k6云 是一个基于订阅的利记手机,请参阅利记手机app的文章”test云利记手机的特性”).
在这个例子中, 利记手机app将运行一个运行时间控制的test,从10 vu到最多50 vu,总持续时间为10分钟:
从“k6/ HTTP”导入HTTP;
导出const选项= {
discardResponseBodies:没错,
场景:{
联系人:{
遗嘱执行人:“外部控制”,
vus开头开头:10,
maxVUs: 50,
持续时间:10米,
},
},
};
导出默认函数(){
http.get (" http://test.k6.io /联系人.php的);
}
从“k6/ HTTP”导入HTTP;
导出const选项= {
discardResponseBodies:没错,
场景:{
联系人:{
遗嘱执行人:“外部-
的控制,
vus开头开头:10,
maxVUs: 50,
持续时间:10米,
},
},
};
导出默认函数(){
http.get (" http://test.k6.io/
联系人.php的);
}
GracefulStop
GracefulStop选项可用于所有类型的执行程序,除了 外部控制,并允许用户指定强制中断之前的等待时间. 缺省值是30秒.
注意,尽管示例中的test的总持续时间是10秒, 由于优雅的stop,实际的执行时间是13秒, 这给VU额外的3秒来完成正在执行的迭代. 目前有23个迭代没有完成并被中断.
的类似选项存在 ramping-vus开头 它是优雅的rampdown. 它定义了在分阶段定义的减速期间,k6在vu返回到池之前必须等待任何当前迭代完成的时间.
从“k6/ HTTP”导入HTTP;
导出const选项= {
discardResponseBodies:没错,
场景:{
联系人:{
遗嘱执行人:“constant-vus开头”,
vus开头开头:100,
持续时间:“10”,
gracefulStop:“3 s”,
},
},
};
导出默认函数(){
const延迟= 数学.地板(数学.R和om () * 5) + 1;
http.get (" http://httpbin.test.k6.io /延期/ ${延迟}”);
}
从“k6/ HTTP”导入HTTP;
导出const选项= {
discardResponseBodies:没错,
场景:{
联系人:{
遗嘱执行人:“constant-vus开头”,
vus开头开头:100,
持续时间:“10”,
gracefulStop:“3 s”,
},
},
};
导出默认函数(){
const延迟=
数学.地板(数学.随机()* 5)
+ 1;
http.get (" http://httpbin.test.
k6.io /延期/ ${延迟}”);
}
运行这个脚本会得到如下结果:
运行(13.0), 000/100 vu, 349个完整迭代和23个中断迭代
✓接触 [======================================] 执行100年的vu 10年代
运行(13.0), 000/100 vu, 349个完整迭代和23个中断迭代
✓接触 [==================
====================] 100 VUs 10s
在转k6指标
内置的指标
指标名称 | 类型 | 描述 |
---|---|---|
vus开头 | 计 | 当前活跃的虚拟用户数 |
vus开头_max | 计 | test中vu的最大可能数量(vu的资源提前分配,以确保在负载级别增加时性能不会受到影响) |
迭代 | 计数器 | 迭代计数器. vu在test中执行脚本的次数(默认函数). |
iteration_duration | 趋势 | 完成函数一次完整迭代所需的时间. |
dropped_迭代 | 计数器 | 由于缺少vu(到达率执行程序)或缺少时间(由于基于迭代的执行程序中的maxDuration过期)而无法启动的迭代次数. |
data_received | 计数器 | 接收的数据量 |
data_sent | 计数器 | 发送的数据量 |
检查 | 率 | 检查成功次数 |
http_reqs | 计数器 | k6总共生成了多少HTTP请求. |
http_req_blocked | 趋势 | 在发起请求之前,阻塞(等待空闲TCP连接插槽)所花费的时间. 浮动 |
http_req_connecting | 趋势 | 与远程主机建立TCP连接所花费的时间. 浮动 |
http_req_tls_h和shaking | 趋势 | 与远程主机协商TLS会话所花费的时间 |
http_req_sending | 趋势 | 向远程主机发送数据所花费的时间. 浮动 |
http_req_waiting | 趋势 | 等待远程主机响应所花费的时间(“到第一个字节的时间”,或“TTFB”). 浮动 |
http_req_receiving | 趋势 | 从远程主机接收响应数据所花费的时间. 浮动 |
http_req_duration | 趋势 | 总请求时间. 它等于 http_re_sending + http_ru_waiting + http_ru_receiving(我.e. 在没有初始DNS查找/连接时间的情况下,远程利记手机器处理请求和响应所需的时间). 浮动 |
http_req_failed(≥v0.31) | 率 | 根据setResponseCallback的失败请求数. |
为了讲清楚, setResponseCallback是一个函数,必须在另一个函数完成执行之后执行(因此得名). 您可以使用setResponseCallback函数来确定响应是成功还是失败.
类型的指标
在test结束时值为0(0)的计数器和计是一个异常:它们将不会输出到stdout摘要.
您可以使用Response获取有关特定请求的信息.时间对象:
- 阻塞= http_req_blocked;
- 连接= http_req_connecting;
- tls_h和shaking = http_req_tls_h和shaking;
- 发送= http_req_sending;
- 等待= http_req_waiting;
- 接收= http_req_receiving;
- 时间= http_req_duration.
从“k6/ HTTP”导入HTTP;
导出默认函数(){
Const res = HTTP.get (" http://httpbin.org”);
控制台.log(' Response time was ' + String(res .)).计时.持续时间)+“ms”);
}
自定义指标
您还可以创建自己的指标,这些指标将在负载test结束时显示.
在下面的例子中, 一个名为“wait_time”的趋势类型度量将被创建, 在代码中哪些将被引用 my趋势 变量.
从“k6/ HTTP”导入HTTP;
import {趋势} from ' k6/metrics ';
const my趋势 = new 趋势(' waiting_time ');
导出默认函数(){
Const r = HTTP.get (" http://httpbin.org”);
my趋势.添加(右.计时.等);
控制台.日志(my趋势.的名字); // waiting_time
}
在k6报告结果
k6中的默认结果报告
默认情况下, 在每次负荷试验结束时, K6将包含test结果概览的摘要报告打印到标准输出. 它包括所有内置和可配置指标和设置的聚合值, 阈值, 组, 并检查. 如果这还不够, K6还支持将指标传输到一个或多个外部工具, 如InfluxDB, 卡夫卡, StatsD, 等. 原始结果也可以发送到云利记手机,并以CSV或JSON文件的形式导出,以便稍后处理.

从k6 v0开始.30.0,您可以完全定制输出并将其重定向到一个文件.
的 没有摘要 指示器禁用报告. h和leSummary () 回调允许您在test结束时完全定制汇总,并以任何所需的格式导出汇总报告数据, 比如JSON, CSV, XML (JUnit / xUnit, 等.)、HTML、三种等.
标准输出包括最小值.地中海,.、max和百分位数表示多个值. 在标准输出中,它们是这样打印的:
http_req_duration…….: avg = 143.14分钟= 112女士.地中海87毫秒= 136.03女士max = 1.18s p(90)=164.2ms p(95)=177.75ms
你可以使用 summary趋势Stats 选项来更改统计信息输出. 您还可以配置时间值的显示,以固定的时间为单位(秒), 的毫秒或微秒) summaryTimeUnit 选择:
转k6运行-summary-trend-stats = " min, avg,地中海,p(99)、p (99.女士-summary-time-unit = 9),马克斯,数“脚本.js
转k6运行-summary-trend-stats = " min, avg,地中海,p (99), p(99.女士-summary-time-unit = 9),马克斯,数“脚本.js
将负载test汇总导出到k6中的其他平台
如果test结束时的标准输出不够, 您可以在其他平台上集成和可视化k6指标. 使用out标志将结果发送到外部输出.
K6运行完statsd脚本.js
你也可以通过多次使用out标志同时向多个输出发送指标:
目前可用的内置输出包括Amazon 云Watch, Apache卡夫卡, 云, CSV, Datadog, Grafana 云 /普罗米修斯, InfluxDB, JSON, Netdata, New Relic, 普罗米修斯, StatsD.
h和leSummary ()回调
在转k6 v0.30.0,有 h和leSummary (), 一种以JSON格式导出汇总数据的新方法, 以及许多其他格式, 如CSV, XML, HTML, 三种, 等. 利记手机app建议使用h和leSummary ()代替旧函数, -summary-export.
控件可以完全定制最终报表 h和leSummary () 函数. K6会在test结束时调用它. 除了在test结束时配置摘要之外, 您可以将数据转换成各种格式并保存到文件中, 或者将生成的报告发送到远程利记手机器.
检查
检查不会停止test执行. 而不是, 它们保存检查的结果(true/false),并允许您继续执行脚本. 您可以在下面看到一个多重检查的例子.
从“k6/ HTTP”导入HTTP;
导出默认函数(){
Const res = HTTP.get (" http://test.k6.io/’);
检查(res, {
‘is 状态 200’: (r) => r.状态= = = 200,
‘body size is 11,105 bytes’: (r) => r.body.长度= = 11105,
});
}
阈值
阈值是一个通过/失败标准,用于指定test系统的性能期望. 阈值分析性能指标并确定最终的test结果(通过/失败). 一些例子可能包括:
- 文本中的错误数不超过1%.
- 95%请求的响应时间应该小于200 ms.
- 99%的请求的响应时间应该小于400 ms.
下面的示例包含一个定义两个阈值的场景:错误率(http_read_failed度量)和95%的响应持续时间(http_req_duration度量).
从“k6/ HTTP”导入HTTP;
导出const选项= {
阈值:{
http_req_failed: [‘rate<0., // HTTP错误应该小于1%
http_req_duration: [‘p(95)<200’], // 95% of requests should be below 200ms
},
};
导出默认函数(){
http.get (" http://test-api.k6.io /公共/鳄鱼/ 1 / ');
}
如果超过任何阈值, 一个小的绿色复选标记旁边的度量名称将成为一个红十字, k6会生成一个非零的退出码.
✓http_req_duration ..............: avg = 151.06女士分钟= 151.06女士地中海= 151.06女士max = 151.06 p女士(90)= 151.06 p女士(95)= 151.06ms
{expected_response:true}.06女士分钟= 151.06女士地中海= 151.06女士max = 151.06 p女士(90)= 151.06 p女士(95)= 151.06ms
✓http_req_failed ................: 0.00% ✓ 0 ✗ 1
组
组用于根据公共逻辑组织场景. 组可以嵌套. 对于每个集团()函数, K6生成一个集团_duration度量值,其中包含组功能的总执行时间. 当一个被标记的资源(检查, 查询, 或自定义度量)在组中执行, K6使用当前组名设置一个标记组.
从k6中导入{集团};
导出默认函数(){
组('访问利记手机app页',函数(){
// …
});
组('添加几个产品到购物车',函数(){
// …
});
组('访问登录页面',函数(){
// …
});
Group (' authenticate ', 函数 () {)
// …
});
Group (' 检查out process ', 函数 () {)
// …
});
}
标签在转k6
标签是一种简单而有效的方法,可以对k6对象进行分类,以便后续过滤结果.
K6提供两种类型的标记:用户定义的标记, 在编写脚本时添加的, 和系统的标签, 由k6自动分配.
k6中的系统标签
自动创建的标签包括:
标签 | 描述 |
---|---|
原型 | 使用的协议(例如,HTTP/1.1) |
sub原型 | 子协议(由web sockets使用) |
状态 | HTTP状态码(例如,200,404等).) |
方法 | HTTP方法名(e.g. GET、POST、等等.)或gRPC的RPC方法 |
url | HTTP请求的URL |
的名字 | HTTP请求的名字 |
集团 | 完整组路径 |
检查 | 检查名称 |
错误 | 带有HTTP以外的错误消息的字符串(例如,网络或DNS错误) |
错误_code | 对于不同的错误类型是唯一的数字 |
tls_version | TLS版本 |
场景 | 在其中发出度量的场景的名称 |
利记手机 | gRPC的RPC利记手机名称 |
自定义标记
自定义标记允许对k6对象进行分类. 可以对检查、阈值和查询进行标记.
从“k6/ HTTP”导入HTTP;
import {趋势} from ' k6/metrics ';
从' k6 '中导入{检查};
const my趋势 = new 趋势(' my_trend ');
导出默认函数(){
//添加标签请求度量数据
Const res = HTTP.get (" http://httpbin.org/’,{
标签:{
my_标签:“我是一个标签”,
},
});
//添加标签检查
检查(res, { ‘状态 is 200’: (r) => r.状态 === 200}, {my_标签:“我是一个标签”});
//添加标签自定义度量
my趋势.add (res.计时.连接,{my_标签:“我是一个标签”});
}
从“k6/ HTTP”导入HTTP;
import {趋势} from ' k6/metrics ';
从' k6 '中导入{检查};
const my趋势 = new 趋势(' my_trend ');
导出默认函数(){
//添加标签请求度量数据
Const res = HTTP.get (" http://httpbin.org/’,{
标签:{
my_标签:“我是一个标签”,
},
});
//添加标签检查
检查(res, { ‘状态 is 200’: (r) => r.状态 === 200}, {my_标签:“我是一个标签”});
//添加标签自定义度量
my趋势.add (res.计时. 连接,{my_标签:“我是一个标签”});
}
使用k6中的内置命令对test进行动态控制
内置的k6命令 “暂停”, “简历”, “规模”, “统计数据” 和 “状态” 可以用来控制正在运行的test的行为吗. 基本上, 您要做的是在一个终端窗口中启动k6test,然后从另一个终端窗口(当然也可以是编程式执行——一个批处理作业或其他)发出k6命令来控制正在运行的test. 下面是一些例子:
状态:

暂停:

简历:

规模:
该命令允许您在test过程中增加或减少负载级别(vu的数量).

k6中的vus开头-max是多少?
VU参数有两个:vus开头和vus开头-max. 第一个是test中当前活动vu的实际数量. 它是你用来上升和下降负载水平的工具. 第二个值(vus开头-max)是当前值 限制 你可以激活多少vu. 如果你尝试将vus开头扩展到高于vus开头-max的水平,会发生以下情况:

VUs -max参数的存在是因为创建新的vu是一项开销很大的操作:您需要预留大量内存并初始化大量数据结构. 在test执行期间初始化大量的新vu可能会对负载test本身产生负面影响(暂停一段时间或影响测量的可靠性).
如果它是简单的任意改变vu数字在test期间, 当开始test时,用户可能会遇到少量vu,然后将其扩展到显著增加的问题. 所以k6试图让用户不断意识到这个问题, 同时提供灵活性, 是有vus开头-max参数,你需要设置之前,你设置vus开头参数. It also gives users more control; Increasing vus开头-max means that k6 will immediately start allocating memory 等 for the extra VUs.
用户可以决定k6什么时候应该在分配和配置上花费CPU资源, 以及什么时候应该使用CPU来实际生成负载test流量并执行准确的测量.
下面是一个例子,利记手机app在test期间将VUs -max从10增加到50 VUs, 一般不推荐哪一种, 但在低负荷水平下,没有明显的放缓:

如何在k6中配置vus开头-max?
最好设置vus开头-max一次, 在启动时, 并将其设置得足够高,这样您就不需要在运行时增加它. 的 第二个最好的 事情, 如果你需要在运行时增加vus开头-max, 是暂停test吗, 增加vus开头-max, 然后再继续. 这样,当k6忙于创建新的vu时,不会发生任何重要的事情.
你也可以像利记手机app在上面的截图中所做的那样,在test运行时改变vus开头-max, 不用先暂停. 如果您这样做,请为不稳定的test结果或test交通中的临时问题做好准备.
如何在k6中远程控制test?
在一个终端窗口中启动k6, 从同一台机器上的另一个窗口进行控制似乎并不那么“遥远”, 但是您可以从任何地方控制k6实例, 只要你能和正在运行的机器沟通.
这里的幕后发生的事情是,原来的k6进程启动了一个HTTP利记手机器, 公开一个REST API localhost: 6565. 使用这个API,您可以看到和控制不同的执行方面,比如vu的数量, 马克斯VUs开头, 暂停或继续test, 组列表, 设置和获取设置数据等等.
默认情况下, 转k6规模 和其他命令将假设您想要与k6进程对话,它正在其API利记手机器上运行 localhost: 6565,但你可以使用 ——/地址 命令行选项指定API利记手机器的绑定地址/端口.g. K6执行-address 1.2.3.4:5678暂停myscript.js)及你要控制的k6的位置(K6刻度-地址1.2.3.4:5678 vus开头开头50).
获得地位
卷曲-X得到\
http://localhost: 6565 / v1 /状态\
- h的application / json内容类型:
更新状态
curl -X PATCH \
http://localhost: 6565 / v1 /状态\
-H ' Content-类型: application/json ' \
-d ‘{
"数据":{
"属性":{
“暂停”:没错,
“vus开头开头”:1,
“vus开头-max”:1
},
“id”:“默认”,
“类型”:“状态”
}
}’
PATCH功能允许暂停/恢复当前test,并设置test过程中的vus开头个数和vus开头-max个数.
指标列表
卷曲-X得到\
http://localhost: 6565/v1/metrics \
- h的application / json内容类型:
这个端点将为您提供当前时间内的所有指标. 您可以在上面看到关于所有可用指标以及如何创建新指标的更多细节.
得到度量
当前时间关于特定度量的详细信息.
卷曲-X得到\
http://localhost: 6565 / v1 /标准/ http_req_receiving \
- h的application / json内容类型:
卷曲-X得到\
http://localhost: 6565 / v1 /标准/ http_req_receiving \
- h的application / json内容类型:
组列表
列表组返回test中可用的所有组.
卷曲-X得到\
http://localhost: 6565 / v1 /组\
- h的application / json内容类型:
获得集团
这个端点返回一个具有指定ID的组.
卷曲-X得到\
http://localhost: 6565 / v1 /组/ b0470a9324a4ae563b04e9ac49fbc9cf \
- h的application / json内容类型:
卷曲-X得到\
http://localhost: 6565/v1/集团 /b0470a9324a4ae563b04e9ac 49fbc9cf \
- h的application / json内容类型:
设置数据
这个端点 返回JSON编码的当前设置.
卷曲-X得到\
http://localhost: 6565 / v1 /设置\
- h的application / json内容类型:
运行安装程序
这个端点执行安装步骤并返回结果.
curl -X POST \
http://localhost: 6565 / v1 /设置\
- h的application / json内容类型:
更新设置
这个指标分析JSON请求的主体,并将结果设置为当前设置.
curl -X PUT \
http://localhost: 6565 / v1 /设置\
-H ' Content-类型: application/json ' \
-d ‘{
"数据":{
"属性":{
"数据":{
“a”: 1,
“b”: 2
}
},
“id”:“默认”,
“类型”:“setupData”
}
}’
停止test
curl -X PATCH \
http://localhost: 6565 / v1 /状态\
-H ' Content-类型: application/json ' \
-d ‘{
"数据":{
“类型”:“地位”,
“id”:“默认”,
"属性":{
“停止”:真的
}
}
}’