为什么要搞压力测试
负载测试,压力测试可以衡量服务是否是一个高可用,高性能的服务。负载测试能检验在不同的工作负荷下,服务的硬件消耗和响应,从而得到不同负载情况下的性能指标。
老牌压力测试工具
可能说到压力测试,很多人会想到
JMeter
。Apache JMeter是一个Apache项目,可用作负载测试工具,以分析和测量各种服务的性能,重点是Web应用程序。JMeter可用作JDBC数据库连接,FTP,LDAP,Web服务,JMS,HTTP,通用TCP连接和OS本机进程的单元测试工具。下面我们讲另外一个新式的压力测试工具k6
。
什么是k6
K6是一款现代负载测试工具,建立在我们在负载和性能测试行业多年的经验基础上。它提供了一个干净的、可接近的脚本API、本地和云执行以及灵活的配置。

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

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