概述

k6是一个以开发人员为中心,免费和开源的负载测试工具,旨在使性能测试具有生产力和令人愉悦的体验。

使用k6,能够及早发现性能下降和问题,从而使您能够构建弹性系统和强大的应用程序。

  • 具有开发人员友好API的CLI工具。

  • JavaScript ES2015 / ES6中的脚本编写-支持本地和远程模块

  • 自动化友好的负载测试

  • 漂亮的测试报告

官网

Load testing for engineering teams | Grafana k6

官网使用指南 :Running k6

下载安装

windows系统安装下载k6:windows系统安装下载k6_Mr. G K的博客-CSDN博客

运行

执行脚本的只需要在输入:k6 run+脚本名。如下图:

执行完成后会在界面给出测试结果:

将测试结果保存到指定的位置:

HTTP请求

k6可以使用JavaScript进行快速的编写脚本,对有前端经验的同学特别友好。我用sublime工具编写javaScript语言。

sublime下载安装:sublime下载及安装 - 简书

sublime激活注册码+中文语言包安装:2021年Sublime Text3最新激活注册码+中文语言包安装分享适用最新版(亲测可用)-云海天教程

GET请求

k6请求方式和其他工具的接口请求方式并无太大差别,只需要导入"import http from 'k6/http';",按照js的语法依次传入URL、header即可。

无headers,demo如下:

import http from 'k6/http';import { sleep } from 'k6';//脚本默认入口,至少要有一个,类似于java中的main()方法//以下的代码会在测试运行期间一遍又一遍地运行,而在外面的代码则是初始化代码export default function () {http.get('http://test.k6.io');sleep(1);}

有headers,demo如下:

import http from 'k6/http';export default function(){var url = 'http://test.k6.io';var params = {headers: {'Content-Type':'application/json','user-token':'Uu5OY6I_SpOtIXMQjnIqxZEXWvcPtSSQcMqhFSzdtFNCPejTIyNi4tCw=='},};http.get(url,params);}

POST请求

post请求如下图所示,依次传入URL,传参,header即可。

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

DEL请求

del请求如下图所示,依次传入URL,header即可。

import http from 'k6/http';const url = 'https://httpbin.test.k6.io/delete';export default function () {let params = { headers: { 'X-MyHeader': 'k6test' } };http.del(url, null, params);}

PUT请求

put请求如下图所示,依次传入URL,传参,header即可。

import http from 'k6/http';const url = 'https://httpbin.test.k6.io/put';export default function () {const headers = { 'Content-Type': 'application/json' };const data = { name: 'Bert' };let res = http.put(url, JSON.stringify(data), { headers: headers });console.log(JSON.parse(res.body).json.name);}

断言设置

k6的断言导入check()后即可,而且一个check()可以添加多个断言。

import http from 'k6/http';import {check} from 'k6';export default function () {var url = 'http://test.k6.io';var params = {headers: {'Content-Type':'application/json','user-token':'Uu5OY6I_SpOtIXMQjnIqxZEXWvcPtSSQcMqhFSzdtFJcmZPoBbnk1EA22mRjuN6XwNUcZwNpNCPejTIyNi4tCw=='},};let res = http.get(url,params);//检查点,返回状态码是否为200check(res,{'is status 200':(r) => r.status === 200,});}}

设置并发

k6中有两种设置并发、运行时间的方法。

第一种是在命令行内:

第二种是在脚本内:

import http from 'k6/http';export let options = {//持续运行时间duration:'1m',//并发数vus:10,//每秒并发多少rps:100,};

k6还有支持更多的条件设置,请阅读官网文档。

cookie设置

k6有多种的cookie的写法,如图是能够快速入手的写法:

http.get('https://test.k6.io',{cookies:{my_cookie:'HLzBf667Ea',},});

测试结果

vus :当前的虚拟用户数

vus_max:虚拟用户的最大数量(已预先分配VU资源,以确保在扩大负载级别时性能不会受到影响)

iterations:测试中的VU执行JS脚本(default函数)的总次数。

iteration_duration:完成默认/主函数的完整迭代所花费的时间。

data_received:接收到的数据量

data_sent:发送的数据量

其他操作

在k6执行测试任务时,我们可以再次打开一个新的命令窗口来控制测试的暂停测试等操作:

k6 pause 暂停测试执行,暂停所有VU

k6 resume 取消暂k6,导致所有活动的VU恢复执行

k6 scale 更改活动VU的数量(或允许的最大VU数量)

k6 stats 报告当前已收集的统计信息

k6 status 报告测试的一般状态

结果可视化

k6.io可以在本地运行测试并将结果流式传输到k6 Cloud

需要结果流式传输到k6 Cloud时,在执行k6命令的机器上运行本地测试,并将结果上传到k6
Cloud。然后,能在Web上实时可视化和分析结果。

Step 1 本地登录k6 Cloud

在官网(Cloud load testing SaaS for engineering teams | k6 Cloud)注册账号后,在本地登录到k6 Cloud,非付费用户最多支持50个虚拟用户并发,并仅支持同时运行一个测试。

注册登录如下图:

登录完成后,点自己的账户信息,在弹出来的菜单栏选择API token,然后将token复制到粘贴板,如下图:

然后在命令行运行以下脚本:

k6 login cloud --token aeadfac95c7d7(这里换成你自己的Token)ae11a1c82c

登录成功后会看到如下信息:

Step 2 运行测试并上传结果

写好要测试的脚本后,使用以下命令将k6结果发送到k6 Cloud:

k6 run --out cloud script.js

Step 3 查看可视化结果

运行成功的话,控制台将显示一个URL,复制此URL并将其粘贴到浏览器的地址栏中,就可以可视化测试结果。

需要注意的是,一旦脚本开始运行,就可以使用控制台输出的地址访问了,结果是实时传送到K6 cloud的,待脚本执行完毕后,云端才会显示为完成状态,执行过程中云端页面会不断刷新新的结果。
如果你的脚本有输出语句的话,那么很快控制台里面脚本初始化生成的URL就被输出语句刷上去了,因此在脚本刚运行的时候就要把URL保存好,避免找不到地址。

可视化报告如下图:

测试类型(来自官网Introduction)

tips:教程参考官网:Introduction

每种测试类型都旨在为您提供有关系统的不同见解。

冒烟测试的作用是验证您的系统可以处理最小的负载,而不会出现任何问题。

负载测试主要涉及根据并发用户或每秒请求数评估系统性能。

压力测试和峰值测试与评估系统极限以及在极端条件下的稳定性有关。

浸泡测试可以告诉您长时间内系统的可靠性和性能。


要了解的重要一点是,每个测试都可以使用相同的测试脚本执行。您可以编写一个脚本并使用它执行所有上述测试。唯一更改的是测试配置,逻辑保持不变。


冒烟测试
冒烟测试是常规负载测试,配置为最小负载。在每次编写新脚本或修改现有脚本时都进行冒烟测试,以进行完整性检查。

运行烟雾测试以:

验证测试脚本没有错误。
验证系统在最小负载下没有引发任何错误。

import http from 'k6/http';
import { check, group, sleep, fail } from 'k6';export let options = {vus: 1, // 1 user looping for 1 minuteduration: '1m',thresholds: {http_req_duration: ['p(99)<1500'], // 99% of requests must complete below 1.5s},
};const BASE_URL = 'https://test-api.k6.io';
const USERNAME = 'TestUser';
const PASSWORD = 'SuperCroc2020';export default () => {let loginRes = http.post(`${BASE_URL}/auth/token/login/`, {username: USERNAME,password: PASSWORD,});check(loginRes, {'logged in successfully': (resp) => resp.json('access') !== '',});let authHeaders = {headers: {Authorization: `Bearer ${loginRes.json('access')}`,},};let myObjects = http.get(`${BASE_URL}/my/crocodiles/`, authHeaders).json();check(myObjects, { 'retrieved crocodiles': (obj) => obj.length > 0 });sleep(1);
};

负载测试

什么是负载测试?
负载测试是一种性能测试,用于确定系统在正常和峰值条件下的行为。
负载测试用于确保许多用户同时访问该应用程序时其性能令人满意。

假设在高峰时段平均看到60个并发用户,而100个用户。
在正常时间和高峰时间都达到性能目标可能很重要,因此建议在配置负载测试时考虑到高负载-在这种情况下为100个用户。

给出负载测试的参数如下,脚本其余部分不变,沿用冒烟测试部分

export let options = {stages: [{ duration: '5m', target: 100 }, // simulate ramp-up of traffic from 1 to 100 users over 5 minutes.{ duration: '10m', target: 100 }, // stay at 100 users for 10 minutes{ duration: '5m', target: 0 }, // ramp-down to 0 users],//用户数从0开始,然后逐渐增加到标称值,并在该标称值上保留很长时间thresholds: {http_req_duration: ['p(99)<1500'], // 99% of requests must complete below 1.5s'logged in successfully': ['p(99)<1500'], // 99% of requests must complete below 1.5s},
};

模拟正常的一天,配置如下,其余脚本不变:

export let options = {stages: [{ duration: '5m', target: 60 }, // simulate ramp-up of traffic from 1 to 60 users over 5 minutes.{ duration: '10m', target: 60 }, // stay at 60 users for 10 minutes{ duration: '3m', target: 100 }, // ramp-up to 100 users over 3 minutes (peak hour starts){ duration: '2m', target: 100 }, // stay at 100 users for short amount of time (peak hour){ duration: '3m', target: 60 }, // ramp-down to 60 users over 3 minutes (peak hour ends){ duration: '10m', target: 60 }, // continue at 60 for additional 10 minutes{ duration: '5m', target: 0 }, // ramp-down to 0 users],//在一天中的大部分时间内保持60个用户的使用状态,并在高峰时段运行时增加到100个用户,//然后再降低到正常负载thresholds: {http_req_duration: ['p(99)<1500'], // 99% of requests must complete below 1.5s},
};

如果系统在负载测试下崩溃,则意味着负载测试已转变为压力测试

压力测试

压力测试是一种负载测试,用于确定系统的限制。该测试的目的是验证系统在极端条件下的稳定性和可靠性。
压力测试应该分多个步骤进行配置,每个步骤都会增加系统的并发负载。

import http from 'k6/http';
import { sleep } from 'k6';export let options = {stages: [{ duration: '2m', target: 100 }, // below normal load{ duration: '5m', target: 100 },{ duration: '2m', target: 200 }, // normal load{ duration: '5m', target: 200 },{ duration: '2m', target: 300 }, // around the breaking point{ duration: '5m', target: 300 },{ duration: '2m', target: 400 }, // beyond the breaking point{ duration: '5m', target: 400 },{ duration: '10m', target: 0 }, // scale down. Recovery stage.],
};
//每2分钟增加100个用户的负载,并在此级别保持5分钟。
//最后,还包括一个恢复阶段,在该阶段,系统逐渐将负载降低到0export default function () {const BASE_URL = 'https://test-api.k6.io'; // make sure this is not productionlet responses = http.batch([['GET',`${BASE_URL}/public/crocodiles/1/`,null,{ tags: { name: 'PublicCrocs' } },],['GET',`${BASE_URL}/public/crocodiles/2/`,null,{ tags: { name: 'PublicCrocs' } },],['GET',`${BASE_URL}/public/crocodiles/3/`,null,{ tags: { name: 'PublicCrocs' } },],['GET',`${BASE_URL}/public/crocodiles/4/`,null,{ tags: { name: 'PublicCrocs' } },],]);sleep(1);
}

峰值测试

峰值测试是压力测试的一种变体,但它不会逐渐增加负载,而是会在很短的时间范围内达到峰值负载。

原文链接:https://blog.csdn.net/weixin_45729075/article/details/115374812

给出峰值测试的参数如下,脚本其余部分不变,沿用压力测试部分

export let options = {stages: [{ duration: '10s', target: 100 }, // below normal load{ duration: '1m', target: 100 },{ duration: '10s', target: 1400 }, // spike to 1400 users{ duration: '3m', target: 1400 }, // stay at 1400 for 3 minutes{ duration: '10s', target: 100 }, // scale down. Recovery stage.{ duration: '3m', target: 100 },{ duration: '10s', target: 0 },],
};
//测试从低负载的1分钟开始,然后快速上升到非常高的负载,然后是低负载的恢复期

浸泡测试

负载测试主要与性能评估而言,压力测试涉及在极端条件下系统稳定,浸泡测试则侧重在长时间涉及可靠性。

浸泡测试的持续时间应以小时为单位。建议从1小时的测试开始,一旦成功,则将其扩展到几个小时。有些错误与时间有关,与执行的请求总数无关。

浸泡测试可帮助您发现长时间内出现的错误和可靠性问题。许多复杂的系统都有这种性质的错误。

标准负载测试成功后,应该执行浸泡测试,并且在执行压力测试时发现系统稳定。

浸泡测试是构建可靠系统的最后一步。

import http from 'k6/http';
import { sleep } from 'k6';export let options = {stages: [{ duration: '2m', target: 400 }, // ramp up to 400 users{ duration: '3h56m', target: 400 }, // stay at 400 for ~4 hours{ duration: '2m', target: 0 }, // scale down. (optional)],
};const API_BASE_URL = 'https://test-api.k6.io';export default function () {http.batch([['GET', `${API_BASE_URL}/public/crocodiles/1/`],['GET', `${API_BASE_URL}/public/crocodiles/2/`],['GET', `${API_BASE_URL}/public/crocodiles/3/`],['GET', `${API_BASE_URL}/public/crocodiles/4/`],]);sleep(1);
}

用户流测试

在以下示例中,您将看到四个连续的HTTP请求发送到API,以登录,获取用户配置文件,更新用户配置文件并最终注销。每个请求都有其独特的特征,接受一些参数,最后返回一个response,并根据一组规则进行检查。在每次请求和响应之后,我们也会暂停,以使API能够保持正常运行而不会被淹没。在脚本的开头,我们还添加了一组用于控制脚本的选项。
如您所见,这是一个相当正常但简单的用户流程,它试图模仿使用我们的移动应用程序或网站时的用户行为。为了简单起见,仅显示了四个请求,但是您可以轻松添加其他请求以具有更真实的用户体验。这样,您可以在应用程序或平台中测试用户导航的流程。这一点将k6与大多数当前可用的负载测试工具区分开来,因为它可以用于测试现实的用户流,而不仅仅是依赖锤击一组端点。

import http from 'k6/http';
import { check, sleep } from 'k6';let options = {vus: 1000,duration: '600s',
};
const SLEEP_DURATION = 0.1;export default function () {let body = JSON.stringify({username: 'user_' + __ITER,password: 'PASSWORD',});let params = {headers: {'Content-Type': 'application/json',},tags: {name: 'login', // first request},};group('simple user journey', (_) => {// Login requestlet login_response = http.post('http://api.yourplatform.com/v2/login',body,params,);check(login_response, {'is status 200': (r) => r.status === 200,'is api key present': (r) => r.json().hasOwnProperty('api_key'),});params.headers['api-key'] = login_response.json()['api_key'];sleep(SLEEP_DURATION);// Get user profile requestparams.tags.name = 'get-user-profile';let user_profile_response = http.get('http://api.yourplatform.com/v2/users/user_' + __ITER + '/profile',params,);sleep(SLEEP_DURATION);// Update user profile requestbody = JSON.string({first_name: 'user_' + __ITER,});params.tags.name = 'update-user-profile';let update_profile_response = http.post('http://api.yourplatform.com/v2/users/user_' + __ITER + '/profile',body,params,);sleep(SLEEP_DURATION);// Logout requestparams.tags.name = 'logout';let logout_response = http.get('http://api.yourplatform.com/v2/logout',params,);sleep(SLEEP_DURATION);});
}

k6性能测试工具,并生成可视化报告相关推荐

  1. 报表工具如何生成 word 报告?

    1. 报表工具中直接排版 2. 通过 API 将报表插入到 word 在报表工具中直接排版实现 word 报告 这种方式的好处在于可以让数据动态变化,图表设计更加灵活,不会因为数据不同,还要重复修改文 ...

  2. 推荐一款免费报表工具,一键自动生成分析报告

    混迹职场多年,你是否曾经惊叹别人是如何做到在短时间内完成海量的交付件,并且PPT里面的文字和图表对得整整齐齐,甚至于一个像素都不差,在翻页的时候,除了局部的内容不一样,你竟然感觉不到其他部分有任何变化 ...

  3. 用Python自动生成数据分析报告!

    来源:林骥 你好,我是林骥. 很多时候,我们需要做一些重复性的工作,比如说,每个月制作类似的数据分析报告,整个框架是基本固定的,此时,我们可以采用 Python 来自动生成数据分析报告,把更多的时间和 ...

  4. 用Python自动生成数据分析报告

    公众号后台回复"图书",了解更多号主新书内容 作者:林骥 来源:林骥 很多时候,我们需要做一些重复性的工作,比如说,每个月制作类似的数据分析报告,整个框架是基本固定的,此时,我们可 ...

  5. PerfDog性能测试工具调研报告

    PerfDog性能测试工具调研报告 当前iOS性能测试工具少,且每个工具或多或少存在弊端和缺陷,阻碍性能测试的正常进行和效率提升,今天带来一款移动全平台性能测试分析专业工具PerfDog性能狗,这款工 ...

  6. processing文本可视化_推荐7个数据可视化工具,让你的信息快速生成可视化

    现在我们对可视化信息的需求越来越高,可视化信息比传统的文本信息更吸引眼球,方便阅读,加深记忆,因此也可以更快地被人们传播出去.近年来涌现出了许多数据可视化工具.有哪些值得使用呢?下面与大家分享九大数据 ...

  7. 推荐九个数据可视化工具,快速生成可视化信息

    现在我们对可视化信息的需求越来越高,可视化信息比传统的文本信息更吸引眼球,方便阅读,加深记忆,因此也可以更快地被人们传播出去.近年来涌现出了许多数据可视化工具.有哪些值得使用呢?下面与大家分享九大数据 ...

  8. 推荐7个数据可视化工具,让你的信息快速生成可视化

    现在我们对可视化信息的需求越来越高,可视化信息比传统的文本信息更吸引眼球,方便阅读,加深记忆,因此也可以更快地被人们传播出去.近年来涌现出了许多数据可视化工具.有哪些值得使用呢?下面与大家分享九大数据 ...

  9. python性能测试可视化_locust安装及其简单使用----基于python的性能测试工具

    1.已安装python3.6 ,安装步骤略 pip安装: pip install locust 检查locust是否安装成功 locust --help 2.安装 pyzmq If you inten ...

最新文章

  1. 商淘多b2b2c商城系统怎么在个人电脑上安装_社交电商系统开发是否有价值?
  2. 添加流程_艾多美手机商城苹果ios系统的主屏幕添加流程
  3. Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等
  4. WEB前端开发的思考与感悟
  5. 【论文解读】ICLR 2021丨当梯度提升遇到图神经网络,“鱼和熊掌”皆可兼得
  6. Ubuntu 和 Centos 的一点差别
  7. 敏捷项目管理过程改进
  8. layui弹出层html,layui-弹出层
  9. Ajax表格控件实现
  10. java写 excel
  11. android ble 发送指令,Android – 如何通过蓝牙低能耗(BLE)链接发送数据?
  12. Linux下硬盘分区的最佳方案
  13. 把mdb文件导入SQL Server 软件的解决方法
  14. Linux系统封装及配置
  15. Git —— 4、团队协作机制及GitHub操作
  16. matlab中工作空间的作用,MATLAB的工作空间
  17. 抖音直播伴侣显示服务器问题,抖音直播伴侣窗口怎么设置?调整窗口的方法了解一下...
  18. 【Linux编程】UVC摄像头采集与显示(V4L2编程)
  19. 少儿编程培训发展的重要趋势
  20. 送5本新出版的《剑指offer》

热门文章

  1. 微信红包金额分配的算法
  2. Android使用WebView无法显示网页
  3. Push to origin/master was rejected异常解决办法
  4. python 数学公式_python的数学算法函数及公式用法
  5. 杂谈——如何合并两个有序链表(时间复杂度为O(n))
  6. 视频编解码之常见GOP结构
  7. python具体学什么-python主要用于什么开发
  8. 拷贝原站点有用文章(合并页)
  9. 非监督神经网络的wake-sleep算法
  10. 如何搭建一个自己的图床