iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Locust 测试结果通过Matplot
  • 503
分享到

Locust 测试结果通过Matplot

测试LocustMatplot 2023-01-30 22:01:26 503人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目的: 相信大家对于使用Loadrunner测试后的结果分析详细程度还是有比较深刻的感受的,每个请求,每个事务点等都会有各自的趋势指标,在同一张图标中展示。如下图:     而Locust自身提供的chart趋势图缺很简单,如下图:  

目的:

相信大家对于使用Loadrunner测试后的结果分析详细程度还是有比较深刻的感受的,每个请求,每个事务点等都会有各自的趋势指标,在同一张图标中展示。如下图:

 

 

而Locust自身提供的chart趋势图缺很简单,如下图:

 

 

那么要达到Loadrunner对于每个请求的详细的描述,用locust能否实现呢?

答案是肯定的,那么我们想到就开始做!

 

思路:

我们整理一下思路,按照步骤去达到我们的目的:

1. 首先我们需要知道每个请求的响应时间

2. 我们需要把每个请求的响应时间进行数据整理和拆分

3. 我们需要把整理好的数据生成图表

 

实施:

按照初步的思路,我们来按步骤进行实施:

1. 抓取每个请求的响应时间。

我们需要获取每个请求的响应时间,可以通过Locust本身自带的钩子函数打印成日志文件。

具体代码如下:

#!/usr/bin/python3.6
# -*- coding: UTF-8 -*-
# author:Lucien
# 基础包: 压力Log日志封装
from locust import events
import os
import time
import logging
from logging.handlers import RotatingFileHandler


class loadLogger():
    def __init__(self, filePath, fileName):
        self.filePath = filePath  # 存放文件的路径
        self.fileName = fileName  # 存放文件的名字
        self.BACK_UP_COUNT = 5000  # 文件分割上限数
        self.MAX_LOG_BYTES = 1024 * 1024 * 1  # 单个文件最大记录数1M
        self.create_handler()  # 初始化创建日志handler
        self.create_logger()  # 初始化创建Logger

    def create_handler(self):  # 建立handler
        self.success_handler = RotatingFileHandler(filename=os.path.join(self.filePath, self.fileName),
                                                   maxBytes=self.MAX_LOG_BYTES * 100, backupCount=self.BACK_UP_COUNT,
                                                   delay=1)  # 分割文件处理按100m分割
        fORMatter = logging.Formatter('%(asctime)s | %(name)s | %(levelname)s | %(message)s')  # 设定输出格式
        formatter.converter = time.gmtime  # 时间转换
        self.success_handler.setFormatter(formatter)  # 格式加载到handler

    def create_logger(self):  # 建立Logger
        self.success_logger = logging.getLogger('request_success')
        self.success_logger.propagate = False
        self.success_logger.addHandler(self.success_handler)

    def success_request(self, request_type, name, response_time, response_length):  # 成功日志输出格式加载到Logger中
        msg = ' | '.join([str(request_type), name, str(response_time), str(response_length)])
        self.success_logger.info(msg)

    def get_locust_Hook(self):  # 钩子挂载到Locust中
        events.request_success += self.success_request

以上为封装好的Log日志输出

并发时带入log日志输出为本地文件存放,代码如下:

# !/usr/bin/python3.6
# -*- coding: UTF-8 -*-
# author: lucien
# 基础包: locust趋势图生成包
from locust import TaskSet, task, HttpLocust
from Performance_Core.performance_log import loadLogger
import os


class file_server_stress(TaskSet):
    def on_start(self):
        '''警号,部门编号等'''
        self.deptID = '520'
        self.pcMemberID = '10000001'
        self.phoneMemberID = '10000004'
        self.logger = loadLogger(filePath='E:\\PrintLog', fileName='11-12-logs')

    # 上传文件
    @task(1)
    def update_file(self):
        payload = "xxx"
        url = ':6061/file/imgs/upload/file'
        headers = {
            'content-type': "multipart/form-data; boundary=----WEBKitFormBoundary7MA4YWxkTrZu0gW",
            'Cache-Control': "no-cache",
            'Postman-Token': "9889c0b4-b91c-4b23-a713-cae4d60e623a"
        }
        response = self.client.post(url=url, data=payload, headers=headers, name='update_file', catch_response=True,
                                    timeout=20)
        print(response.text)
        # 验证请求成功与失败
        if response.status_code == 200:
            self.logger.get_locust_Hook() #重点!此处挂载Log日志钩子
            response.success()
        else:
            self.logger.get_locust_Hook()
            response.failure('上传文件失败')

class userbehavior(HttpLocust):
    host = 'http://192.168.1.222'
    task_set = file_server_stress
    min_wait = 3000
    max_wait = 5000

if __name__ == '__main__':
    '''网页启动,在网页中输入127.0.0.1:8089'''
    os.system('locust -f file_server_stress.py --web-host=127.0.0.1')  

运行完测试后,我们将会得到一组log日志文件,样式如下:

第一步顺利完成!

 

2. 对日志文件进行数据分析和拆分

我们所得到的所有日志记录都会混合在日志文件中,我们需要把它提取出来,并且通过groupby来拆分不同的请求

提取日志文件,我们可以用到Python的强项,数据分析支持库pandas和Numpy

首先,我们通过Pandas提取日志文件:

headers = ['time', 'label', 'loglevel', 'method', 'name', 'response_time', 'size']  
self.data = pandas.read_csv(filename, sep='|', names=headers)

读取日志文件后生成DATAFRAME的pandas数据独有格式

其次,我们通过对读取的文件处理后进行排序

self.sorted_data = self.data.sort_values(by=['time', 'name'], ascending=[True, True])

按时间和请求名称,将序排列

最后,我们对排序后的数据进行分组

self.grouped_data = self.sorted_data.groupby('name')

自此,我们数据处理工作大体准备完成

 

3.把数据生成图表

需要把数据生成图表,自然离不开matplotlib了

按照matplolib里,plot方法,把x轴和y轴 按照time 和 response_time 生成相应的折线图,最后生成的趋势图如下:

大功告成!

 

最后附上实际代码,供有需要的同学参考,也可以自行改良:

# !/usr/bin/python3.6
# -*- coding: UTF-8 -*-
# author: lucien
# 基础包: locust趋势图生成包
import pandas as pd
from datetime import datetime
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import dates

hex_colors = [
    '#FF7500',
    '#F00056',
    '#0EB83A',
    '#00BC12',
    '#1BD1A5',
    '#0C8918',
    '#0AA344',
    '#2ADD9C',
    '#3DE1AD',
    '#424C50',
    '#DB5A6B',
    '#FF4E20',
    '#3EEDE7',
    '#4B5CC4',
    '#70F3FF',
    '#2E4E7E',
    '#3B2E7E',
    '#425066',
    '#8D4BBB',
    '#815476',
    '#808080',
    '#161823',
    '#50616D',
    '#725E82',
    '#A78E44',
    '#8C4356',
    '#F47983',
    '#B36D61',
    '#C93756',
    '#FF2121',
    '#C83C23',
    '#9D2933',
    '#FFF143',
    '#FF0097',
    '#A98175',
    '#C32136',
    '#6E511E',
    '#F20C00',
    '#F9906F',
    '#FF8936',
    '#DC3023',
    '#EAFF56',
    '#FFA400',
    '#60281E',
    '#44CEF6',
    '#F0C239',
    '#A88462',
    '#B35C44',
    '#B25D25',
    '#C89B40',
    '#D9B611',
    '#827100',
    '#C3272B',
    '#7C4B00',
    '#BDDD22',
    '#789262',
    '#FF8C31',
    '#C91F37',
    '#00E500',
    '#177CB0',
    '#065279',
]


class data_analyse():
    def __init__(self, filename):
        self.filename = filename
        self.xfmt = dates.DateFormatter('%m/%d %H:%M')
        self._init_graph()  # 初始化趋势图大小
        self._set_graph()  # 初始化趋势图样式

        headers = ['time', 'label', 'loglevel', 'method', 'name', 'response_time', 'size']  # 命名字段标题
        self.data = pd.read_csv(filename, sep='|', names=headers)  # 从文件获取内容为DATAFRAME格式
        for col in headers[-2:]:  # 转换response_time和size为int型
            self.data[col] = self.data[col].apply(lambda x: int(x))
        for col in headers[0:-2]:  # 取消掉所有非int型的空格
            self.data[col] = self.data[col].apply(lambda x: x.strip())
        self.data['time'] = self.data['time'].apply(
            lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M:%S,%f'))  # time转化为时间格式
        self.sorted_data = self.data.sort_values(by=['time', 'name'], ascending=[True, True])  # 对数据按照time和name进行降序排列
        self.grouped_data = self.sorted_data.groupby('name')  # 对降序排列的数据,按名称分组
        self.requests_counts = np.array([[key, len(group)] for key, group in self.grouped_data])  # 构建请求名和请求次数数组

    def _init_graph(self):  # 设定趋势图大小
        left, width = 0.1, 0.8
        bottom, height = 0.1, 0.8
        self.trend_scatter = [left, bottom, width, height]

    def _set_graph(self):  # 生成基本趋势图样式
        plt.clf()  # 清除figure中所有axes
        self.ax_plot = plt.axes(self.trend_scatter)  # 套用axes大小
        self.ax_plot.grid(True)  # 打开网格
        self.ax_plot.set_ylabel('Response Time(ms)')  # 纵坐标标题
        self.ax_plot.set_xlabel('time')  # 横坐标标题
        self.ax_plot.figure.set_size_inches(15, 8)  # 画板大小
        self.ax_plot.xaxis.set_major_locator(dates.MinuteLocator(interval=5))  # 设定横坐标日期格式为5min间隔
        self.ax_plot.xaxis.set_major_formatter(self.xfmt)  # 设定横坐标格式

    def generate_trend(self):  # 生成趋势图
        start_index = 0
        legend_list = []
        for index, request in enumerate(self.requests_counts):  # 为数组添加index标签
            name, count = request[0], int(request[1])  # 获取请求名和请求次数
            end_index = start_index + count
            x = self.grouped_data.get_group(name)['time'][start_index: end_index]  # 设置x轴数据
            y = self.grouped_data.get_group(name)['response_time'][start_index:end_index]  # 设置y轴数据
            self.ax_plot.plot(x, y, '-', color=hex_colors[index + 1])  # 画图
            legend_list.append(name)  # 添加请求名到legend中
        plt.legend(legend_list)  # 打印legend
        # plt.show()  # 打印趋势图
        plt.title(self.filename)
        plt.savefig(fname='.'.join([self.filename, 'png']), dpi=300, bbox_inches='tight')  # 保存趋势图


if __name__ == '__main__':
    data = data_analyse('E:\\PrintLog\\logs')
    print(data.sorted_data.info())
    # data.generate_trend()

 

 如要转载,请标明出处

 

--结束END--

本文标题: Locust 测试结果通过Matplot

本文链接: https://www.lsjlt.com/news/180288.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Locust 测试结果通过Matplot
    目的: 相信大家对于使用Loadrunner测试后的结果分析详细程度还是有比较深刻的感受的,每个请求,每个事务点等都会有各自的趋势指标,在同一张图标中展示。如下图:     而Locust自身提供的chart趋势图缺很简单,如下图:  ...
    99+
    2023-01-30
    测试 Locust Matplot
  • Jmeter如何通过CSV保存测试数据、测试用例及将测试结果导出到Excel里
    这篇文章给大家分享的是有关Jmeter如何通过CSV保存测试数据、测试用例及将测试结果导出到Excel里的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。CSV保存测试数据,并上传到CSV Data Set Conf...
    99+
    2023-06-04
  • uni-app 打包 ios 测试包,通过 testFlight 分发测试
    uni-app开发,ios 申请证书打 ios 包 申请 ios 证书 (私钥证书)和描述文件(证书profile) 申请方式通过uni-app介绍进行申请,地址:https://ask.dcloud.net.cn/article...
    99+
    2023-08-20
    ios uni-app xcode
  • 【压测】通过Jemeter进行压力测试(超详细)
    文章目录 背景一、前言二、关于JMeter三、准备工作四、创建测试4.1、创建线程组4.2、配置元件4.3、构造HTTP请求4.4、添加HTTP请求头4.5、添加断言4.6、添加察看结果树4.7、添加Summary Report4....
    99+
    2023-08-16
    压力测试 java 开发语言
  • 如何通过Apache Bench实现web压力测试
    本篇内容主要讲解“如何通过Apache Bench实现web压力测试”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何通过Apache Bench实现web压力测试”吧!一、Apache Ben...
    99+
    2023-06-03
  • Java API面试中的Spring知识测试:您是否能通过?
    在Java开发中,Spring框架已经成为了一个不可或缺的工具。因此,在Java API的面试过程中,Spring知识测试也变得越来越重要。本文将为您介绍一些常见的Spring面试问题,并提供相应的答案和代码演示。 Spring框架是什...
    99+
    2023-09-15
    api 面试 spring
  • PHP7怎么通过yum源安装及性能测试
    今天就跟大家聊聊有关PHP7怎么通过yum源安装及性能测试,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。提到PHP,肯定会有人说这是世界上最好的编程语言。单说流行程度,目前全球超过8...
    99+
    2023-06-05
  • SpringbootMaven打包跳过测试的五种方式小结
    目录Maven跳过单元测试五种方法1、命令行方式跳过测试2、pom.xml中配置跳过测试3、idea直接配置4、添加Maven配置参数5、通过更改设置使用Maven打包的时候,可能会...
    99+
    2023-05-18
    Springboot Maven打包跳过测试 Springboot Maven 跳过测试
  • Maven打包跳过测试的5种方式总结
    目录前言1、命令行方式跳过测试2、pom.xml中配置跳过测试3、直接配置4、添加Maven配置参数5、通过更改设置参考总结前言 今天工作中遇见一个小问题,正好晚上没什么安排,而且也...
    99+
    2023-01-30
    maven 跳过测试打包 maven跳过测试打包命令 maven跳过测试
  • Apache容器的实时性能测试:结果如何?
    Apache是目前全球最流行的Web服务器之一,也是开源社区中最著名的项目之一。由于其流行度和可靠性,很多企业都在使用Apache作为其Web服务器。然而,这样的高流量环境下,如何确保Apache服务器的性能稳定和可靠,成为了一个重要的问...
    99+
    2023-08-10
    apache 容器 实时
  • 解决Pytorch在测试与训练过程中的验证结果不一致问题
    引言 今天在使用Pytorch导入此前保存的模型进行测试,在过程中发现输出的结果与验证结果差距甚大,经过排查后发现是forward与eval()顺序问题。 现象 此前的错误代码是 ...
    99+
    2024-04-02
  • 如何在 Python 中优化算法以通过 leetcode 测试?
    如何在 Python 中优化算法以通过 LeetCode 测试? LeetCode 是一个相当流行的在线编程平台,许多人使用它来提高编程技能和解决算法问题。然而,在 LeetCode 上编写的算法可能会遇到一些挑战,例如运行时间过长或者内存...
    99+
    2023-07-23
    编程算法 leetcode 文件
  • Python接口测试中通过登录接口获取实
    1、封装login_token 2、headers:对应登录请求头部信息 3、request_param:登录的参数数据 4、json.dumps:将一个Python数据结构转换为JSON 5、dict(response.json()):...
    99+
    2023-01-31
    接口 测试中 Python
  • go通过benchmark对代码进行性能测试详解
    目录benchmark的使用运行Benchmark指定测试时长或测试次数重置时间和暂停计时查看内存使用情况testing.B的底层实现总结benchmark的使用 在开发中我们要想编...
    99+
    2023-05-17
    go-benchmark代码性能测试 go benchmark
  • 详解Go 语言如何通过测试保证质量
    目录引言单元测试什么是单元测试Go 语言的单元测试单元测试覆盖率基准测试什么是基准测试Go 语言的基准测试计时方法内存统计并发基准测试基准测试实战总结引言 本节带你学习本专栏的第四模...
    99+
    2024-04-02
  • 怎么通过计划任务调用QuickTest测试脚本
    这篇文章主要介绍怎么通过计划任务调用QuickTest测试脚本,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!我们可以编写一个Vbs脚本,直接在Windows平台下直接运行调用qtp的测试脚本,也可以将这个脚本添加到计...
    99+
    2023-06-08
  • Apache下分析ab性能测试的结果是什么
    这篇文章给大家介绍Apache下分析ab性能测试的结果是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一直以来我都是用Loadrunner去做性能测试。Loadrunner实际上是一个很重的性能测试工具。他的功能很...
    99+
    2023-06-22
  • Postman中怎么进行断言和测试结果验证
    在Postman中可以通过使用测试脚本来进行断言和测试结果验证。在发送请求后,可以在请求的“Tests”选项卡中编写JavaScri...
    99+
    2024-03-13
    Postman
  • 2020最新苹果App真机调试测试的过程是怎样的
    2020最新苹果App真机调试测试的过程是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。真机调试分5步进行介绍!(上架前一定要先测试好APP,要不app一堆bug,上...
    99+
    2023-06-04
  • 如何解决Pytorch在测试与训练过程中的验证结果不一致问题
    小编给大家分享一下如何解决Pytorch在测试与训练过程中的验证结果不一致问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!引言今天在使用Pytorch导入此前保存的模型进行测试,在过程中发现输出的结果与验证结果差距甚大,...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作