1 万 Star !自称“最牛叉的”负载测试工具

【导语】:k6 是一个面向开发和测试人员,适应 DevOps 时代的高性能、现代化、自称“开发者体验最好”的负载测试工具,在 GitHub上已有 10.6K Star。

简介

k6 是一个免费、开源、高性能的负载测试工具,能有效提高性能测试的生产力。它总结了Load Impact在负载和性能测试行业的多年经验,提供了简洁、方便的脚本API,支持本地和云端执行,可进行灵活的配置。

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云。更多详细的信息可以参考官网了解。

开源前哨 日常分享热门、有趣和实用的开源项目。参与维护 10万+ Star 的开源技术资源库,包括:Python、Java、C/C++、Go、JS、CSS、Node.js、PHP、.NET 等。

你可能感兴趣的:(1 万 Star !自称“最牛叉的”负载测试工具)