17.6k stars像单元测试一样做压力测试

为什么要搞压力测试

负载测试,压力测试可以衡量服务是否是一个高可用,高性能的服务。负载测试能检验在不同的工作负荷下,服务的硬件消耗和响应,从而得到不同负载情况下的性能指标。

老牌压力测试工具

可能说到压力测试,很多人会想到JMeter。Apache JMeter是一个Apache项目,可用作负载测试工具,以分析和测量各种服务的性能,重点是Web应用程序。JMeter可用作JDBC数据库连接,FTP,LDAP,Web服务,JMS,HTTP,通用TCP连接和OS本机进程的单元测试工具。下面我们讲另外一个新式的压力测试工具k6

什么是k6

K6是一款现代负载测试工具,建立在我们在负载和性能测试行业多年的经验基础上。它提供了一个干净的、可接近的脚本API、本地和云执行以及灵活的配置。

17.6k stars像单元测试一样做压力测试

K6 相对于 JMeter 的优势

因为 K6是Go编写的,相对于JAVA 编写的 JMeter 有性能上的差距,K6 可以只用较少的资源就能达到指定数量的负载。

特点

  • 在ES6 JS中编写脚本:支持模块,以帮助跨组织的代码重用
  • 用代码来配置:测试逻辑和配置选项都是在JS中,以便于版本控制
  • 自动化配置:检查(像断言)和阈值,方便灵活的CI配置!
  • 支持HTTP/1.1, HTTP/2, WebSocket和gRPC协议
  • TLS特性:客户端证书、可配置的SSL/TLS版本和密码
  • 包括:cookie、Crypto、自定义指标、编码、环境变量、JSON、HTML表单、文件、灵活的执行控制等等。
  • 内置的HAR转换器:将浏览器会话记录为.har文件,并直接转换为k6脚本
  • 灵活的指标存储和可视化:fluxdb (+Grafana), JSON或k6云
  • 云执行和分布式测试(目前只在k6云管理的基础设施上进行,计划在不久的将来在k6上进行本地分布式执行!)

GitHub数据

  • 17.6k stars
  • 306 watching
  • 918 forks

开源地址:https://github.com/grafana/k6

安装

Debian/Ubuntu

sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
sudo apt-get update
sudo apt-get install k6

Fedora/CentOS

sudo dnf install https://dl.k6.io/rpm/repo.rpm
sudo dnf install k6

MacOS

brew install k6

Windows

choco install k6
winget install k6

Docker

docker pull grafana/k6

举个例子

新建一个 test.js 文件

Get 请求 get( url, [params] )

import http from 'k6/http';
export let options = {
  vus: 100, // 指定要同时运行的虚拟用户数量
  duration: '10s', // 指定测试运行的总持续时间
};
// default 默认函数
export default function () {
  // 标头
  let params = { headers: { 'Content-Type''application/json' } };
 
  var res=http.get("https://test.k6.io",params)
}

Post 请求 Post( url, [body],[params])

import http from 'k6/http';
export let options = {
  vus: 100,
  duration: '10s',
};
// default 默认函数
export default function () {
  // json 字符串
  let json = { content: 'linhui', image: 'images' };
  // 标头
  let params = { headers: { 'Content-Type''application/json' } };
  var res = http.post("https://host/api/feedback", JSON.stringify(json), params)
  console.log(res.status);
}

执行脚本

k6 run test.js
17.6k stars像单元测试一样做压力测试

batch 批处理,顺序不能保证

import http from 'k6/http';
export let options = {
  vus: 1, 
  duration: '10s'
};
export default function () {
  let get = {
    method: 'GET',
    url: 'https://host/get',
  };
  let get1 = {
    method: 'GET',
    url: 'https://host/get',
  };
  let post = {
    method: 'POST',
    url: 'https://host/post',
    body: {
      hello: 'world!',
    },
    params: {
      headers: { 'Content-Type''application/json' },
    },
  };
  let res = http.batch([req1, req2, req3]);
}

常见指标

名称 描述
Counter 计数器,对值进行累加
Gauge 最小值、最大值和最后一个值。
Rate 百分比
Trend 最小值、最大值、平均值和百分位数的统计数据指标

K6 始终都会收集的指标

 

名称 类型 描述
vue Gauge 当前活动的虚拟用户数
vue_max Gauge 虚拟用户的最大数量
iterations Counter 脚本中的函数被执行的次数
data_received Counter 接收到的数据量大小
data_sent Counter 发送的数据量大小
iteration_duration Trend 完成默认/主函数的一次完整迭代所花费的时间。
checks Rate checks 项的成功率

更多功能广大网友可以继续挖掘。

微信公众号:[开源日记],分享10k+Start的优质开源项目。

      

原文始发于微信公众号(开源日记):17.6k stars像单元测试一样做压力测试

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/49865.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!