基于k6和python进行自动化性能测试

news/2024/4/28 1:23:14/文章来源:https://blog.csdn.net/2301_81967703/article/details/137118016

摘要:在性能测试中,达到相应的性能指标对于一个软件来说十分重要,在本文中,将介绍一种现代化性能测试工具k6。

  1. import http from 'k6/http';

  2. import { sleep } from 'k6';

  3. export default function () {

  4. http.get('https://test-api.com');

  5. sleep(1);

  6. }

当我们开发完成一个应用程序时,往往需要对其进行性能测试,以帮助我们更好的优化程序以及发现程序中的一些bug。在性能测试中,达到相应的性能指标对于一个软件来说十分重要,在本文中,将介绍一种现代化性能测试工具k6。

k6是一个开源工具,基于JavaScript可以编写k6的测试脚本,测试Web应用程序以及API的性能,支持HTTP等多种协议,可以很好地模拟各种高负载场景,充分验证程序稳定性和性能。k6支持Linux、MacOS等多个平台,通过k6官网根据提示即可在各个平台快速安装k6,终端输入k6 version出现如下显示说明安装成功。

以下是一个简单的k6测试脚本,通过k6的HTTP API模拟Get请求,并且休眠一秒钟:K

  1. import http from 'k6/http';

  2. import { sleep } from 'k6';

  3. export default function () {

  4. http.get('https://test-api.com');

  5. sleep(1);

  6. }

通过执行下面这行代码,运行脚本,即可对服务完成测试。

k6 run test-script.js

k6提供了丰富的功能,以下是k6常用的一些API,具体可以参考官网文档介绍:

  1. - http.get(url, [options]):发送GET请求。

  2. - http.post(url, body, [options]):发送POST请求。

  3. - check(res, checks):检查响应是否符合预期。

  4. - group(name, func):将一组请求分组并统计性能指标。

  5. - sleep(duration):休眠指定的时间。

k6的测试结果包括以下一些指标,可以根据这些指标,更好的优化程序。

  1. - VUs:虚拟用户的数量。

  2. - Iterations:迭代次数。

  3. - RPS:每秒钟的请求数。

  4. - Duration:测试持续时间。

  5. - Data Sent/Received:发送和接收的数据量。

  6. - Checks:检查的数量。

  7. - Status codes:响应状态码的数量。

  8. - Errors:错误的数量。

  9. - Latency distribution:延迟分布。

通过Python和k6你可以更加高效的完成符合自己要求的自动化测试,Python可以提供非常多的工具库,用来收集处理k6返回的结果。 我们可以编写以下k6测试脚本,并且通过Python去执行它,相关注释我已经标注出来,在handleSummary函数中,我们可以通过metrics来获取各种测试信息,具体如代码所示,可以参考官网关于metrics的介绍,同时自定义环境变量的使用也十分方便,可以参考代码中的使用方式。

  1. import http from 'k6/http';

  2. import { check, sleep} from 'k6';

  3. import {Rate} from 'k6/metrics';

  4. export default function() {

  5. #post请求所需要的body体

  6. let requestBody = {

  7. "xxx":[

  8. "xxxxx"

  9. ],

  10. "xxxx": __ENV.MyVar # MyVar为自定义的环境变量,可以通过__ENV调用,在执行脚本时可直接通过MyVar=xxx传值

  11. };

  12. #url

  13. const url = 'http://example.com';

  14. const payload = JSON.stringify(requestBody);

  15. const params = {

  16. headers: {

  17. 'Content-Type': 'application/json',

  18. },

  19. timeout: '100s' #每个请求的超时时间

  20. };

  21. let res = http.post(url, payload, params);

  22. #检测结果是否是200OK

  23. check(res, { 'status is 200': (r) => r.status === 200 });

  24. }

  25. export function handleSummary(data) {

  26. #通过data.metrics中的字段可以获取你想要的一些信息,例如每个请求的持续时间和吞吐量

  27. const time = `${data.metrics.http_req_duration.values.avg.toFixed(3)}`;

  28. const rps = `${data.metrics.http_reqs.values.rate.toFixed(3)}`;

  29. const res = `${time} ${rps}`;

  30. console.log(res); # 利用console.log可以将内容打印到控制台

  31. return {stdout : res}; #输出到标准输出

  32. }

如下是一个Python代码示例,相关代码已经注释,通过Python中的subprocess模块执行k6脚本,并且捕获k6脚本的输出,通过pandas库进行整理输出到excel中。还可以通过argparse库解析命令行参数传入k6脚本中,更加灵活,高效。

  1. # -*- coding: utf-8 -*-

  2. import subprocess

  3. from alive_progress import alive_bar # 非常丰富的进度条工具库

  4. from tqdm import tqdm # 进度条工具库

  5. import pandas as pd # 可以用来处理文本excel,csv等

  6. from collections import OrderedDict

  7. import argparse # 用来解析命令行参数

  8. import time

  9. print('测试时间 : ', time.strftime('%b %d %Y %H:%M:%S', time.gmtime(time.time())))

  10. print("************开始测试啦! 祈祷不出错!**************")

  11. # 需要测试的测试语句集合

  12. test_examples = [

  13. "aaaaaaa",

  14. "bbbbbbb",

  15. "ccccccc"

  16. ]

  17. dataMap = {'test': test_examples}

  18. parser = argparse.ArgumentParser()

  19. parser.add_argument("-d", default="60s", help="duration time", dest="duration_time") #解析命令行参数,控制测试时间

  20. args = parser.parse_args()

  21. print("每条语句测试时间 : ", args.duration_time)

  22. vus = ['10', '20', '30', '40'] # 并发数集合 ,分别测试并发数为10,20,30,40的场景

  23. cols_name = ['1-avg/ms', '1-rps/s', '10-avg/ms', '10-rps/s','20-avg/ms', '20-rps/s','50-avg/ms', '50-rps/s'] # excel的列名

  24. # 循环测试,可以将多个需要测试的语句集合放入到dataMap中

  25. for (name, data) in dataMap.items():

  26. print("当前测试的项目为 :", name)

  27. res = OrderedDict()

  28. res['test_examples'] = []

  29. for n in cols_name:

  30. res[n] = []

  31. df = pd.DataFrame(res)

  32. excel_name = name + ".xlsx"

  33. df.to_excel(excel_name, index=False)

  34. for query in data:

  35. print("当前测试语句为 :", query)

  36. origin = pd.read_excel(excel_name)

  37. with alive_bar(len(vus)) as bar:

  38. temp_dict = {}

  39. temp_dict['test_examples'] = query

  40. for vu in vus:

  41. keyRps = vu + '-rps/s'

  42. keyTime = vu + '-avg/ms'

  43. MyVar='MyVar=' + query

  44. #通过Popen执行k6脚本,并且捕获它的标准输出

  45. process = subprocess.Popen(['k6', 'run', '--quiet', 'script.js', '--env', MyVar, '--vus', vu, '--duration', args.duration_time], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

  46. result = process.stdout.read()

  47. temp = result.split()

  48. temp_dict[keyTime] = temp[0].decode();

  49. temp_dict[keyRps] = temp[1].decode();

  50. print("并发:", vu, temp[0].decode(), temp[1].decode())

  51. bar()

  52. #将脚本输出写到excel

  53. save_data = origin.append(temp_dict, ignore_index=True)

  54. save_data.to_excel(excel_name, index=False)

执行此Python脚本,可以得到类似以下输出:

1、k6官网文档链接:https://k6.io/docs/

2、k6安装链接:https://k6.io/docs/get-started/installation/

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

  1. 文档获取方式:

  2. 加入我的软件测试交流群:680748947免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1026615.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正式发布:VitePress 1.0 现代化静态站点生成器!

大家好,我是奇兵,今天介绍一下现代化静态站点生成器!,希望能帮到大家。 3 月 21 日, 由 Vue 团队出品的现代化静态站点生成器 VitePress 正式发布 1.0 版本!它专为构建快速、以内容为中心的网站而生,能够轻…

动态多态的注意事项

大家好: 衷心希望各位点赞。 您的问题请留在评论区,我会及时回答。 多态的基本概念 多态是C面向对象三大特性之一(多态、继承、封装) 多态分为两类: 静态多态:函数重载和运算符重载属于静态多态&#x…

C语言从入门到实战----C语言中内存函数的使用和模拟实现

目录 前言 1.memcpy 使用和模拟实现 2. memmove 使用和模拟实现 3. memset 函数的使用 4. memcmp 函数的使用 前言 在编程领域,内存管理是至关重要的一环,它确保了程序能够高效、稳定地运行。 C语言作为一门底层的编程语言,提供了一系…

【3D目标检测】Det3d—SE-SSD模型训练(前篇):KITTI数据集训练

SE-SSD模型训练 1 基于Det3d搭建SE-SSD环境2 自定义数据准备2.1 自定义数据集标注2.2 训练数据生成2.3 数据集分割 3 训练KITTI数据集3.1 数据准备3.2 配置修改3.3 模型训练 1 基于Det3d搭建SE-SSD环境 Det3D环境搭建参考:【3D目标检测】环境搭建(OpenP…

Linux非root用户安装mysql5.7

1、下载安装包MySQL :: Download MySQL Community Server 点击Archives 我下载的是5.7.27版本,linux主机直接选择linux-Generic即可,选择第一个包下载即可 2、安装mysql 解压 shell> tar xzvf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz shell&g…

基于深度学习YOLOv8+PyQt5的水底海底垃圾生物探测器检测识别系统(源码+数据集+配置说明)

wx供重浩:创享日记 对话框发送:323海底 获取完整源码7000张数据集配置说明文件说明远程操作配置环境跑通程序 效果展示 基于深度学习YOLOv8PyQt5的水底海底垃圾生物探测器检测识别系统设计(源码数据集配置文件) 各文件说明 程序运…

申请免费域名证书

目录 背景: 域名证书是什么: 域名证书有哪些: 部署域名证书有什么用: 免费的域名证书在哪里申请: 背景: 域名是一个IP地址上的“面具” 。一个域名的目的是便于记忆和沟通的一组服务器的地址(网站&…

分页功能制作

使用HTML,css,js和json假数据制作分页功能。 以下为分页功能结构,下面可以点击上一页,下一页及数字,还可以自己输入想要跳转的页面点击跳转。下面每页显示的内容也会跟着改变。还可以选择不同的每页显示数据的条数。默…

python数据实时传给unity工程并绘制出来

python # 服务器端代码 import socket import random import struct import time# 创建一个服务器Socket server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 监听的地址和端口 host 127.0.0.1 port 12345# 绑定地址和端口 server_socket.bind((host, port…

C语言中常用的文件操作

本文将介绍常用的关于文件操作函数,如fopen,fclose,fread,fwrite,feek,ftell,rewind以及feof和ferror等文件操作操作函数,还介绍一些用于所有输入输出流的函数如fgetc,fputc,fgets,fputs,fprintf,fscanf等函数,还介绍了sscanf,sprintf函数,fe…

主流电商平台淘宝/1688/京东电商数据实时采集监测|电商API接口接入

电商大数据平台基于网络主流电商平台淘宝/1688/京东电商数据进行搭建,全面监测了包含淘宝、京东、苏宁、美团、大众点评等共计100余个主流电商交易平台,并凭借多年的电子商务数据分析挖掘经验积累形成的电商数据清洗体系和挖掘模型,能高效完成…

DashVector - 阿里云向量检索服务

DashVector 文章目录 DashVector一、关于 DashVector二、使用 DashVector 前提准备1、创建Cluster:2、获得API-KEY3、安装最新版SDK 三、快速使用 DashVector1. 创建Client2. 创建Collection3、插入Doc4、相似性检索5、删除Doc6. 查看Collection统计信息7. 删除Coll…

Flask 与小程序 的图片数据交互 过程及探讨研究学习

今天不知道怎么的&#xff0c;之前拿编程浪子地作品抄过来粘上用好好的&#xff0c;昨天开始照片突的就不显示了。 今天不妨再耐味地细细探究一下微信小程序wxml 和flask服务器端是怎么jpg图片数据交互的。 mina/pages/food/index.wxml <!--index.wxml--> <!--1px …

Python程序设计 循环结构(二)

1.斐波那契数列 编写一个能计算斐波那契数列中第x个数的小程序。斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列、 因数学家莱昂纳多斐波那契&#xff08;Leonardoda Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为…

日本EPSON 爱普生HUD汽车抬头显示系统芯片

目前HUD产品在新车上的配装率逐年上升&#xff0c;预计在2025年将达到30%。那么在介绍爱普生HUD整合方案之前&#xff0c;让我们先了解一下什么叫HUD。 HUD&#xff08;Head Up Display&#xff09;中文叫抬头显示系统&#xff0c;又被叫做平行显示系统。早被应用在飞机辅助…

Linux系统——硬件命令

目录 一.网卡带宽 1.查看网卡速率——ethtool 网卡名 2.查看mac地址——ethtool -P 网卡名 二、内存相关 1.显示系统中内存使用情况——free -h 2.显示内存模块的详细信息——dmidecode -t memory 三、CPU相关 1.查看CPU架构信息——lscpu 2.性能模式 四、其他硬件命…

C语言例4-37:输出10~100的全部素数

素数是指除1和它本身之外不能被其他任何整数整除。 自己思考的基础代码如下&#xff1a; //输出10~100的全部素数 //素数是指除1和它本身之外不能被其他任何整数整除 //自己思考的基础代码 #include<stdio.h> int main(void) {int n10,i2,m,counter0; // n10~100;for(n…

如何用Flask中的Blueprints构建大型Web应用

本文分享自华为云社区《构建大型Web应用Flask中的Blueprints指南》&#xff0c;作者&#xff1a; 柠檬味拥抱。 什么是Blueprints&#xff1f; 什么是Blueprints&#xff1f; Blueprints是Flask中的一种模式&#xff0c;用于将应用程序分解为可重用的模块。每个蓝图实际上是…

IDEA | 资源文件中文乱码问题解决

问题 IDEA打开资源文件&#xff0c;显示乱码问题。 解决方案 1、电脑是mac&#xff0c;点击IDEA->【Preferences】->【Editor】->【File Encodings】 2、选择【Properties Files】中的UTF-8&#xff0c;并勾选Transparent native-to-ascii conversion。 3、最后点击…

蓝桥杯算法赛(二进制王国)

问题描述 二进制王国是一个非常特殊的国家&#xff0c;因为该国家的居民仅由 0 和 1 组成。 在这个国家中&#xff0c;每个家庭都可以用一个由 0 和 1 组成的字符串 S 来表示&#xff0c;例如 101、 000、 111 等。 现在&#xff0c;国王选了出 N 户家庭参加邻国的庆典…