1 万 Star !自称“最牛叉的”负载测试工具
【导语】:k6 是一个面向开发和测试人员,适应 DevOps 时代的高性能、现代化、自称“开发者体验最好”的负载测试工具,在 GitHub上已有 10.6K Star。
简介
k6 是一个免费、开源、高性能的负载测试工具,能有效提高性能测试的生产力。它总结了Load Impact在负载和性能测试行业的多年经验,提供了简洁、方便的脚本API,支持本地和云端执行,可进行灵活的配置。
k6 自称是“开发者体验最好”的负载测试工具。
(k6 官网截图)
k6 支持以下功能特性:
1、 使用基于ES6语法的编写脚本:支持模块化,以便更好地实现代码复用
2、 所有的东西都是代码:为了版本控制更友好,测试逻辑和配置选项都在JS脚本中
3、 友好:检查和阈值的存在,使得持续化配置构建更加容易
4、 支持HTTP1、HTTP2、WebSocket和gRPC协议
5、 支持TLS:配置客户端证书、SSL/TLS版本以及加密套件
6、 内置支持了很多特性:Cookies、加密、自定义指标、编码、环境变量、JSON、HTML表单等
7、 内置HAR转换器:将浏览器搜集的网络信息har文件直接转换为k6脚本
项目源码地址是:
https://github.com/loadimpact/k6
安装
Mac环境使用Homebrew:
brew install k6
Windows环境,直接下载msi文件安装即可:
https://dl.bintray.com/loadimpact/windows/k6-v0.29.0-amd64.msi
Linux环境:
如果是基于Debian的Linux系统,使用以下命令:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 379CE192D401AB61
echo "deb https://dl.bintray.com/loadimpact/deb stable main" | sudo tee -a /etc/apt/sources.list
sudo apt-get update
sudo apt-get install k6
如果是Fedora或CentOS系统,使用以下命令:
wget https://bintray.com/loadimpact/rpm/rpm -O bintray-loadimpact-rpm.repo
sudo mv bintray-loadimpact-rpm.repo /etc/yum.repos.d/
sudo dnf install k6 # use yum instead of dnf for older distros
Docker:
docker pull loadimpact/k6
也可以在这个地址下载软件压缩包,解压即可使用:
https://github.com/loadimpact/k6/releases
简单使用
k6执行脚本的时候使用了虚拟用户(VU)的概念,在循环中并发执行。脚本使用JavaScript编写,利用模块的概念组织脚本,可以将较大的测试分解为更小、可重用的代码,从而更方便地扩展测试。脚本必须包含一个导出的默认函数,它定义了VU的入口点,作用和其他语言中的main函数类似,一个简单的脚本如下:
import http from "k6/http";
export default function() {
let response = http.get("https://test-api.k6.io");
};
将上述脚本保存为script.js文件,使用k6执行命令如下:
k6 run script.js
k6也可以用来执行远程脚本,如:
k6 run github.com/loadimpact/k6/samples/http_2.js
k6能解析一些关于github和cdnjs URL的信息,以上命令相当于:
k6 run raw.githubusercontent.com/loadimpact/k6/master/samples/http_2.js
以下是来自官网的一个例子,js脚本如下:
执行结果如下:
从结果能看到该HTTP请求过程的一些统计数据,比如发送、收到的数据大小,发送、接收数据消耗的时间等。完整的执行过程如下:
脚本选项和执行控制
k6使用了VU的概念,可以用来进行性能测试,那么怎么控制虚拟用户数、并发时间呢?
默认情况下,如果未指定任何选项,k6仅使用1个VU运行脚本,并且仅进行1次迭代。在负载测试中,我们需要一些方法来执行VU的数量。
1、 命令行选项,指定10个VU:
k6 run --vus 10 script.js
也可以简写为-u,少敲了3个按键:
k6 run -u 10 script.js
2、 设置环境变量K6_VUS,还是指定10个VU,K6_VUS=10
3、 脚本中使用options变量指定:
export let options = {
vus: 30,
};
export default function() { /* ... do whatever ... */ }
4、全局设置。k6有一个配置主文件夹,在${HOME}/.config/loadimpact/k6,其中的config.json可以设置全局VU数量。
以上是指定设置VU数量的方法,还需要一些方法来设置VU运行时间。
1、使用--duration/-d选项设置执行时间(也可以通过K6_DURATION环境变量、脚本options变量、config.json配置文件来设置)。当指定参数为0时,脚本会一直持续运行,直到我们手动停止。以下命令表示执行30秒:
k6 run --duration 30s script.js
2、使用--iterations/ -i选项设置迭代次数(也可以通过K6_ITERATIONS环境变量、脚本options变量、config.json配置文件来设置)。当迭代总数达到指定数量时,k6停止执行。以下命令表示每个VU只会进行一次迭代:
k6 run --iterations 10 --vus 10 script.js
3、 对于更复杂的情况,可以指定执行阶段的参数,它们通常是duration,target-VUs成对的组合。这些参数可以控制k6在指定期间VU的线性上升、下降或保持。使用--stage/ -s设置这些组合(也可以通过K6_STAGES环境变量、脚本options变量、config.json配置文件来设置)。以下使用options变量,表示k6将在3分钟内将5个VU线性增加到10个,并在接下来的5分钟内保持10个VU持续运行,然后在接下来10分钟内将VU线性增加到35个,最后在1分半钟内逐渐降低到0个:
export let options = {
vus: 5,
stages: [
{ duration: "3m", target: 10 },
{ duration: "5m", target: 10 },
{ duration: "10m", target: 35 },
{ duration: "1m30s", target: 0 },
]
};
其他高级特性
k6有一个检查和阈值的概念,检查有点类似于断言,但是检查不会中断脚本的执行,只是单纯地存储通过或失败的结果,脚本能持续运行;而阈值是全局通过或失败的标准,可以验证结果指标是否在指定范围内,若不在阈值范围内,脚本将以失败的结果结束运行,阈值非常适合于持续集成测试;k6还可以将脚本运行结果输出到外部存储,如输出到InfluxDB,Kafka,k6云。更多详细的信息可以参考官网了解。
- EOF -
更多优秀开源项目(点击下方图片可跳转)
如果觉得本文介绍的开源项目不错,欢迎转发推荐给更多人。
分享、点赞和在看
支持我们分享更多优秀开源项目,谢谢!