K6 性能测试教程:常用功能 - HTTP 请求,指标和检查

这篇文章详细介绍了 K6 中的 HTTP 请求(http request)功能,解析了常用的性能指标和检查功能。通过 HTTP 请求模拟用户行为,了解性能指标以评估系统响应。文章还深入讲解了如何配置和执行检查,确保性能符合预期标准。无论您是初学者还是经验丰富的性能测试专业人员,这篇教程将为您提供实用知识,助您充分发挥 K6 的性能测试潜力。点击链接,开启高效性能测试之旅! 

K6 常用功能

HTTP Requests

使用 K6 进行性能测试的第一步就是定义要测试的 HTTP 请求。

GET 请求例子

使用 k6 new 命令创建的 demo 测试脚本中,已经包含了一个简单的 GET 方法 HTTP 请求:

import http from 'k6/http';
import { sleep } from 'k6';
 
export default function() {
  http.get('https://test.k6.io');
  sleep(1);
}
POST 请求例子

这个 POST 请求例子展示一些复杂的场景的应用(带有电子邮件/密码身份验证负载的 POST 请求)

import http from 'k6/http';
 
export default function () {
  const url = 'http://test.k6.io/login';
  const payload = JSON.stringify({
    email: 'aaa',
    password: 'bbb',
  });
 
  const params = {
    headers: {
      'Content-Type': 'application/json',
    },
  };
 
  http.post(url, payload, params);
}

以上内容参考自 K6 官方文档

支持的 HTTP 方法

K6 提供的 HTTP 模块能处理各种 HTTP 请求和方法。以下是支持的 HTTP 方法列表:

方法作用
batch()并行发出多个 HTTP 请求(例如浏览器往往会这样做)。
del()发出 HTTP DELETE 请求。
get()发出 HTTP GET 请求。
head()发出 HTTP HEAD 请求。
options()发出 HTTP OPTIONS 请求。
patch()发出 HTTP PATCH 请求。
post()发出 HTTP POST 请求。
put()发出 HTTP PUT 请求。
request()发出任何类型的 HTTP 请求。
HTTP 请求标签

K6 允许为每个 HTTP 请求添加标签,结合标签和分组,可以很方便的在测试结果中更好地组织,分组请求和过滤结果组织分析。

以下为支持的标签列表:

标签作用
name请求名称。默认为请求的 URL
method请求方法(GET、POST、PUT 等)
url默认为请求的 URL。
expected_response默认情况下,200 到 399 之间的响应状态为 true。使用 setResponseCallback 更改默认行为。
group当请求在组内运行时,标记值是组名称。默认为空。
scenario当请求在场景内运行时,标记值是场景名称。默认为 default。
status响应状态

HTTP 请求使用 tag 和 group 标签的例子会在后续的 demo 中展示。

大家也可以参考官方的例子:https://grafana.com/docs/k6/latest/using-k6/http-requests/

Metrics 指标

指标用于衡量系统在测试条件下的性能。默认情况下,k6 会自动收集内置指标。除了内置指标,您还可以创建自定义指标。

指标一般分为四大类:

  1. 1. 计数器(Counters):对值求和。

  2. 2. 计量器(Gauges):跟踪最小、最大和最新的值。

  3. 3. 比率(Rates):跟踪非零值发生的频率。

  4. 4. 趋势(Trends):计算多个值的统计信息(如均值、模式或百分位数)。

要使测试断言符合需求标准,可以根据性能测试要求的指标条件编写阈值(表达式的具体内容取决于指标类型)。

为了后续进行筛选指标,可以使用标签和分组,这样可以更好地组织测试结果。

测试结果输出文件可以以各种摘要和细粒度格式导出指标,具体信息请参阅结果输出文档。(后面测试结果输出文档会详细介绍这一部分)

K6 内置指标

每个 k6 测试执行都会发出内置和自定义指标。每个支持的协议也有其特定的指标。

标准内置指标

无论测试使用什么协议,k6 始终收集以下指标:

指标名称指标分类指标描述
vusGauge当前活跃虚拟用户数
vus_maxGauge最大可能虚拟用户数(VU 资源已预先分配,以避免扩大负载时影响性能)
iterations 迭代CounterVU 执行 JS 脚本(default 函数)的总次数。
iteration_durationTrend完成一次完整迭代的时间,包括在 setup 和 teardown 中花费的时间。要计算特定场景的迭代函数的持续时间,请尝试此解决方法
dropped_iterationsCounter由于缺少 VU(对于到达率执行程序)或时间不足(基于迭代的执行程序中的 maxDuration 已过期)而未启动的迭代次数。关于删除迭代
data_receivedCounter接收到的数据量。此示例介绍如何跟踪单个 URL 的数据。
data_sentCounter发送的数据量。跟踪单个 URL 的数据以跟踪单个 URL 的数据。
checksRate设置的检查成功率。

指标分类分别为:计数器(Counter)、计量器(Gauges)、比率(Rates)、趋势(Trends)

HTTP 特定的内置指标

HTTP 特定的内置指标是仅在 HTTP 请求期间才会生成和收集的指标。其他类型的请求(例如 WebSocket)不会生成这些指标。

注意:对于所有 http_req_* 指标,时间戳在请求结束时发出。换句话说,时间戳发生在 k6 收到响应正文末尾或请求超时时。

下表列出了 HTTP 特定的内置指标:

指标名称指标分类指标描述
http_reqsCounterk6 总共生成了多少个 HTTP 请求。
http_req_blockedTrend在发起请求之前阻塞(等待空闲 TCP 连接槽)所花费的时间。float类型
http_req_connectingTrend与远程主机建立 TCP 连接所花费的时间。float类型
http_req_tls_handshakingTrend与远程主机握手 TLS 会话所花费的时间
http_req_sendingTrend向远程主机发送数据所花费的时间。float类型
http_req_waitingTrend等待远程主机响应所花费的时间(也称为“第一个字节的时间”或“TTFB”)。float类型
http_req_receivingTrend从远程主机接收响应数据所花费的时间。float类型
http_req_durationTrend请求的总时间。它等于 http_req_sending + http_req_waiting + http_req_receiving(即远程服务器处理请求和响应所需的时间,没有初始 DNS 查找/连接时间)。float类型
http_req_failedRate根据 setResponseCallback 的失败请求率。

指标分类分别为:计数器(Counter)、计量器(Gauges)、比率(Rates)、趋势(Trends)

其他内置指标

K6 内置指标除了标准内置指标和 HTTP 特定的内置指标外,还有其他内置指标:

  • • Browser metrics 浏览器指标:https://grafana.com/docs/k6/latest/using-k6/metrics/reference/#browser

  • • Built-in WebSocket metrics 内置 WebSocket 指标:https://grafana.com/docs/k6/latest/using-k6/metrics/reference/#websockets

  • • Built-in gRPC metrics 内置 gRPC 指标:https://grafana.com/docs/k6/latest/using-k6/metrics/reference/#grpc

自定义指标

除了系统内建的指标之外,您还可以创建自定义指标。例如,您可以计算与业务逻辑相关的指标,或者利用 Response.timings 对象为特定的一组端点创建指标。

每种指标类型都有一个构造函数,用于生成自定义指标。该构造函数会生成一个声明类型的指标对象。每种类型都有一个 add 方法,用于记录指标测量值。

注意:必须在 init 上下文中创建自定义指标。这会限制内存并确保 K6 可以验证所有阈值是否评估了定义的指标。

自定义指标 demo 示例

以下示例演示如何创建等待时间的自定义趋势指标:

项目文件中的 demo_custom_metrics.js 文件已经包含了这个 demo 示例,可以直接运行查看结果。

1.从导入 k6/metrics 模块引入 Trend 构造函数
import { Trend } from 'k6/metrics';

等待时间趋势指标属于趋势(Trends)指标,所以需要从 k6/metrics 模块引入 Trend 构造函数。

2.在 init 上下文中构造一个新的自定义度量 Trend 对象
const myTrend = new Trend('waiting_time');

在 init 上下文中构造一个新的自定义度量 Trend 对象,脚本中的对象为 myTrend,其指标在结果输出中显示为 waiting_time

3.在脚本中使用 add 方法记录指标测量值
export default function() {
  const res = http.get('https://test.k6.io');
  myTrend.add(res.timings.waiting);
}

在脚本中使用 add 方法记录指标测量值,这里使用了 res.timings.waiting,即等待时间。

4.demo_custom_metrics.js 自定义指标完整代码
import http from 'k6/http';
import { Trend } from 'k6/metrics';
 
const myTrend = new Trend('waiting_time');
 
export default function () {
  const res = http.get('https://httpbin.test.k6.io');
  myTrend.add(res.timings.waiting);
  console.log(myTrend.name); // waiting_time
}
5.运行 demo_custom_metrics.js 并查看自动化趋势指标
k6 run demo_custom_metrics.js

运行结果如下:

可以看到,自定义指标 waiting_time 已经在结果输出中显示出来了。

更多关于自定义指标的内容,请参考官方文档:https://k6.io/docs/using-k6/metrics/#custom-metrics

Checks 检查

这里也可以理解为断言,即对测试结果进行验证。

检查用来检验不同测试中的具体测试条件是否正确相应,和我们常规在做其他类型测试时也会对测试结果进行验证,以确保系统是否以期望的内容作出响应。

例如,一个验证可以确保 POST 请求的响应状态为 201,或者响应体的大小是否符合预期。

检查类似于许多测试框架中称为断言的概念,但是K6 在验证失败并不会中止测试或以失败状态结束。相反,k6 会在测试继续运行时追踪失败验证的比率

每个检查都创建一个速率指标。要使检查中止或导致测试失败,可以将其与阈值结合使用。

下面会介绍如何使用不同类型的检查,以及如何在测试结果中查看检查结果。

1.检查 HTTP 响应状态

K6 的检查非常适用于与 HTTP 请求相关的响应断言。

示例,以下代码片段来检查 HTTP 响应代码为 200:

import { check } from 'k6';
import http from 'k6/http';
 
 
export default function () {
  const res = http.get('https://httpbin.test.k6.io');
  check(res, {
    'HTTP response code is status 200': (r) => r.status === 200,
  });
}

运行该脚本,可以看到如下结果:

当脚本包含检查时,摘要报告会显示通过了多少测试检查。

在此示例中,请注意检查“HTTP response code is status 200”在调用时是 100% 成功的。

2.检查 HTTP 响应体

除了检查 HTTP 响应状态外,还可以检查 HTTP 响应体。

示例,以下代码片段来检查 HTTP 响应体大小为 9591 bytes:

import { check } from 'k6';
import http from 'k6/http';
 
 
export default function () {
  const res = http.get('https://httpbin.test.k6.io');
  check(res, {
    'HTTP response body size is 9591 bytes': (r) => r.body.length == 9591,
  });
}

运行该脚本,可以看到如下结果:

当脚本包含检查时,摘要报告会显示通过了多少测试检查。

在此示例中,请注意检查“HTTP response body size is 9591 bytes”在调用时是 100% 成功的。

3.添加多个检查

有时候我们在一个测试脚本中需要添加多个检查,那可以直接在单个 check() 语句中添加多个检查,如下面脚本所示:

import { check } from 'k6';
import http from 'k6/http';
 
 
export default function () {
  const res = http.get('https://httpbin.test.k6.io');
  check(res, {
    'HTTP response code is status 200': (r) => r.status === 200,
    'HTTP response body size is 9591 bytes': (r) => r.body.length == 9591,
  });
}

运行该脚本,可以看到如下结果:

在此示例中,两个检查都是正常通过的(调用是 100% 成功的)。

注意:当检查失败时,脚本将继续成功执行,并且不会返回“失败”退出状态。如果您需要根据检查结果使整个测试失败,则必须将检查与阈值结合起来。这在特定环境中特别有用,例如将 k6 集成到 CI 管道中或在安排性能测试时接收警报。

参考文档

 行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群:1150305204,里面有各种测试开发资料和技术可以一起交流哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/322968.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是技术架构?架构和框架之间的区别是什么?怎样去做好架构设计?(一)

什么是技术架构?架构和框架之间的区别是什么?怎样去做好架构设计?(一)。 在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。在不同的书籍上, 不同的作者, 对于架构的定义也不统一, 角度不同, 定义不同。 一、架构是什么 Linux 有架构,MySQL 有架构,J…

基于dinoV2分类模型修改

前言 dinoV2已经发布有一段时间了,faecbook豪言直接说前面的结构我们都不需要进行修改,只需要修改最后的全连接层就可以达到一个很好的效果。我们激动的揣摸了下自己激动的小手已经迫不及待了,这里我使用dinoV2进行了实验,来分享…

7.3 数据库的基本查询

数据库的基本查询 1. 提要2. 简单查询3. 高级查询3.1 数据分页_limit3.2 排序_order by3.3 查询去重_distinct 4. 条件查询 1. 提要 2. 简单查询 3. 高级查询 3.1 数据分页_limit 3.2 排序_order by 3.3 查询去重_distinct 4. 条件查询

“与辉同行”首秀金额过亿,一个东方甄选拆出无数个董宇辉?

董宇辉又爆了! 小作文风波后,董宇辉不仅摇身一变成东方甄选新股东,还自立门户成立了新直播间“与辉同行”。 首秀当天在抖音平台正式开播,首秀就创下了惊人的成绩:直播间人气高达1.2亿,销售额超过1.1亿&a…

MongoDB Compass 的教程

第一步:建立连接 点击Save&Connect 增加数据库: 填写数据库名字和文档名字并点击Create Database 删除文档: 创建文档: 插入文档数据 {Id:1001,name:"cyl",age:21} 插入成功: 更改原有数据 删除原有数据…

【LeetCode】202. 快乐数(简单)——代码随想录算法训练营Day06

题目链接:202. 快乐数 题目描述 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终…

Multimodal Contrastive Training for Visual Representation Learning

parameterize the image encoder as f i q _{iq} iq​ query feature q i i _{ii} ii​,key feature k i i _{ii} ii​ parameterize the textual encoder as f c q ( ⋅ ; Θ q , Φ c q ) f_{cq}(; Θ_q, Φ_{cq}) fcq​(⋅;Θq​,Φcq​),momentum …

西贝柳斯音乐记谱软件Avid Sibelius Ultimate 2023中文激活版

Avid Sibelius(西贝柳斯终极解锁版) 是一款记谱软件,从有抱负的作曲家和词曲作者到教师和学生,任何人都可以快速轻松地开始创作和分享音乐。对于那些还不熟悉使用符号软件的人来说,直观的界面将引导您完成整个过程。磁性布局可防止对象相互碰…

API可视化编排如何实现

企业随着前后端分离架构、微服务架构、中台战略、产业互联互通的实施必将产生大量的各种协议的API服务,API将成为企业的数字化资产且API会越来越多, API服务之间的相互调用和依赖情况也随之越来越多和复杂。业务系统与业务系统之间、关联企业之间的API都…

【mars3d】 graphic.bindPopup(inthtml).openPopup()无需单击小车,即可在地图上自动激活弹窗的效果。

实现效果:new mars3d.graphic.FixedRoute({无需单击小车,即可在地图上实现默认打开弹窗的激活效果。↓↓↓↓↓↓↓↓ 相关链接说明: 1.popup的示例完全开源,可参考:功能示例(Vue版) | Mars3D三维可视化平台 | 火星科…

谷粒商城篇章8 ---- P236-P247 ---- 购物车【分布式高级篇五】

目录 1 环境搭建 1.1 新建购物车服务模块gulimall-cart 1.2 购物车服务相关配置 1.2.1 pom.xml 1.2.2 yml配置 1.2.2.1 application.yml配置 1.2.2.2 bootstrap.yml配置 1.2.3 主类 1.3 SwitchHosts增加配置 1.4 网关配置 1.5 整合SpringSession 1.5.1 session数据…

如何使用LightPicture+cpolar搭建个人云图床随时随地公网访问

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进,功能也越来越多,而手机…

selenium 做 Web 自动化,鼠标当然也要自动化!

我们在做 Web 自动化的时候,有时候页面的元素不需要我们点击,值需要把鼠标移动上去就能展示各种信息。这个时候我们可以通过操作鼠标来实现,接下来我们来讲一下使用 selenium 做 Web 自动化的时候如何来操作鼠标。鼠标操作,我们可…

接口自动化测试难点:数据库验证解决方案

接口自动化中的数据库验证:确保数据的一致性和准确性 接口自动化测试是现代软件开发中不可或缺的一环,而数据库验证则是确保接口返回数据与数据库中的数据一致性的重要步骤。本文将介绍接口自动化中的数据库验证的原理、步骤以及示例代码,帮…

Nodejs基础3之fs模块的文件重命名和移动、文件的删除、文件夹操作、查看资源状态、fs路径

Nodejs基础二 fs模块文件重命名和移动文件的重命名文件的移动同步重命名和移动 文件的删除使用unlink进行删除unlink异步删除unlinkSync同步删除 使用rm进行删除rm异步删除rmSync同步删除 文件夹操作创建文件夹递归创建文件夹 读取文件夹删除文件夹rmdir删除文件夹删除递归文件…

K8s-Pod资源(二)node调度策略、node亲和性、污点与容忍度

目录 node调度策略nodeName和nodeSelector 指定nodeName 指定nodeSelector node亲和性 node节点亲和性 硬亲和性 软亲和性 污点与容忍度 本文主要介绍了在pod中,与node相关的调度策略,亲和性,污点与容忍度等的内容 node调度策略node…

一文速学-selenium高阶性能优化技巧

一文速学-selenium高阶性能优化技巧 前言 最近写的挺多自动化办公的selenium程序没有做优化,执行效率不高,启动浏览器又慢但是又可能出现其他不可控的因素,总结来说虽然放心运行但是又没那么好用,项目是写完了最后还是需要优化结…

内部软件产品数据治理平台(流程设计里,选择触发事件报错)

内部软件产品数据治理平台(流程设计里,选择触发事件报错) 页面报错如下 通过查看dp后台日志发现缺少表字段,表名称(TL_EVENT_SHADOW),需要新增字段即可 PROJECT_ID varchar(200) DEFAULT NULL COMMENT ‘对象所属项目ID’, SPACE_ID varchar(20) DEFAULT ‘0’ C…

黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(5)登录认证

指路(1)(2)(3)(4)👇 黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(1)准备工作、部门管理_tlias智能学习辅助系统的需求分析-CS…