1.概述:

1.我们对目前比较流行的几款压测工具进行了调研。Jmeter与LoadRunner基于多线程实现并发,多线程由操作系统决定,由于上下文切换频繁、内核调度频繁,单台机器很难产生大量线程并发。以多线程方式运行会有很多线程切换的开销,故而考虑多协程方式实现,

Jmeter由Java语言编写,并不支持协程机制。Python语言通过async/await的方式实现协程,而Locust正是基于python。

2..Locust 完全是基于事件的,因此在一台机器上支持数千个并发用户是可能的。与许多其他基于事件的应用程序不同,它不使用回调。相反它通过 gevent 使用轻量级协程。这允许您用 Python 编写非常有表现力的场景,而不用回调使代码复杂化。

2.压测工具对比:

当你想做性能测试的时候,你会选择什么样的测试工具呢?是会选择wrk?jmeter?locust?还是loadrunner呢?

备注:服务端数据可以通过nmon_analyser或者Grafana监控

3.优缺点说明:

 3.1jmeter采用线程并发机制,但其主要依靠增加线程数提高并发量,当单机模拟数以千计的并发用户时,对于CPU和内存的消耗比较大,jmeter本身具有以下优点和缺点:

 优点:①界面可视化操作,可以使用录制脚本方式对较为复杂的用户流建模,还可以创建断言来验证测试行为是否通过;

②表格、图形、结果树等多类可视化数据分析和报告输出;

③支持http、ftp、tcp等多种协议类型测试;

④支持分布式压力测试,但对于上万的用户并发测试需要多台测试机支持,资源要求比较大;

⑤可以用于测试固定吞吐量下的系统性能,例如在100QPS(QPS:每秒查询率)下系统的响应时间和资源消耗;

缺点:①jmeter的GUI模式消耗资源较大,当需要测试高负载时,需要先使用GUI工具来生成XML测试计划,然后在非GUI模式下导入测试计划运行测试,并且关闭不需要的侦听器(收集数据与展示测量的组件),因为侦听器也会消耗掉本用于生成负载的大量资源。测试结束后后,需要将原始结果数据导入GUI以才能查看结果。

3.2.locust是一个的简单易用的分布式负载测试工具,主要用来对网站进行负载压力测试。locust使用python语言开发,测试资源消耗远远小于java语言开发的jmeter。且其支持分布式部署测试,能够轻松模拟百万级用户并发测试。

优点:①locust借助于协程实现对用户的模拟,相同物理资源(机器cpu、内存等)单台负载机可模拟的负载数远超jmeter;

②相比jmeter需要界面点击录制复杂场景的麻烦,locust只需用户使用python编写用户场景完成测试;

③不同与jmeter复杂的用户使用界面,locust的界面干净整洁,可以实时显示测试的相关细节(如发送请求数、失败数和当前发送请求速度等);

④locust虽然是面向web应用测试的,但是它可以用来测试几乎所有系统。给locust编写一个客户端,可以满足你所有的测试要求;

缺点同wrk一样,locust测试结果输出不如jmeter的测试结果展示类型多;

4.Locust的指标体系:

(1)响应时间
反应系统处理效率指标,从开始到完成某项工作所需要时间的度量,响应时间通常随着负载的增加而增加;
(2)吞吐率(QPS)

 表示“每秒查询数”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内的处理流量。
    备注:QPS 每秒钟发送的请求的数量。(一个事务可能包含多个请求)

(3)事务处理能力(TPS在locust中为RPS)

表示服务器每秒处理的事物数,它是衡量系统处理能力的重要指标 (每秒处理请求数)
 
备注:
  性能测试评判点_性能指标:
TPS,响应时间(平均响应时间,完成90%请求响应时间),错误/成功率
 
 

##___________________________Locust环境搭建_________________________________________________________________________

1.安装locust:

pip3 install locust

检查是否安装成功,执行命令:locust --v

2.脚本实例:

#!/usr/bin/env python
# -*- coding: utf-8 -*- from locust import HttpUser, TaskSet, task
# 定义用户行为类
class UserBehavior(TaskSet):
@task # 任务项
def test_login(self):
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}
url = '/login.htm'
res = self.client.get(url,headers=header, verify=False)
#断言方式一
#assert res.status_code == 200
#断言方式二
if res.status_code == 200:
print('登陆成功!')
else:
print('登陆失败!') class WebSiteUser(HttpUser):
tasks = [UserBehavior]
#host = "https://www.cnblogs.com"
max_wait = 5000
min_wait = 1000 if __name__ == "__main__":
import os
os.system("locust -f test.py --host=https://www.cnblogs.com")#这样写可以直接运行文件,也可以命令调用文件

多个接口测试脚本

#!/usr/bin/env python
# -*- coding: utf-8 -*- from locust import HttpUser,TaskSet,task class UserBehavior(TaskSet):
@task
def chen_users(self):
headers = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}##设置请求Headers头部
#请求输入参数
p = {"game_id":"20210708110"}
url='/subcontract'
res=self.client.post(url=url,headers=headers,params=p)
if res.status_code == 200:
print('登陆成功!')
else:
print('登陆失败!') @task(1)
def test_groups(self):
headers = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}##设置请求Headers头部
res=self.client.get("/getcontract", headers= headers)
if res.status_code == 200:
print('test登陆成功!')
else:
print('test登陆失败!') class WebsiteUser(HttpUser):
tasks = [UserBehavior]
min_wait = 3000
max_wait = 6000 if __name__ == "__main__":
import os
os.system("locust -f test.py --host=http://106.55.29.87:8000")

UserBehavior 类继承TaskSet 类,用于描述用户行为。

  • @task约定该方法为一个事件,一部分的数字表示请求比例,上面的比例为2:1 默认1:1

  • test_users()方法表示一个用户行为,这里是请求user接口。

  • test_groups()方法表示请求group接口。

  • client.get()用于指定请求的路径。

网站用户类用于设置性能测试。

  • task_set:一个定义的用户行为类。

  • min_wait:执行事务之间用户等待时间的下界(单位:毫秒)。

  • max_wait:执行事务之间用户等待时间的上界(单位:毫秒)。

3.执行测试:

 web模式:

使用命令行启动测试: locust -f test.py --host=https://www.cnblogs.com .................................................... .......普通启动
locust -f  E:\test\dalan_sparrow\sparrow\test.py --host=https://www.cnblogs.com --web-port 8091 ...............启动时指定端口
如果要运行分布式Locust,必须在启动从机时指定主机(运行分布在单台机器上的Locust时不需要这样做,因为主机默认为127.0.0.1):
locust -f testscript/locusttest.py --slave --master-host=192.168.0.100 --host=https://cnblogs.com
如果要运行分布在多个进程中的Locust,通过指定-master以下内容来启动主进程 :
locust -f testscript/locusttest.py --master --host=https://www.cnblogs.com

no web 模式:
1. locust -f load_test.py --host=https://www.baidu.com --no-web -c 10 -r 2 -t 1m
2. locust -f  D:\PycharmProjects\UItest\locust_scripts\locust_test2.py --no-web -c 1 -r 1 -t 10s --csv=d:

           启动参数:

--no-web 表示不使用Web界面运行测试。

-c 设置虚拟用户数。

-r 设置每秒启动虚拟用户数。

-t 设置设置运行时间。

--csv运行结果保存目录

备注:

1.Locust no-web模式执行命令提示locust: error: unrecognized arguments: -no-web -c 的问题

解决:将命令参数--no-web 更改为 --headless,将命令中指定用户并发数的参数 -c 改为 -u即可。

执行测试后在浏览器打开localhost:8089可以看到如下页面:

  • Number of users to simulate:设置模拟用户数。

  • Hatch rate(users spawned/second):每秒产生(启动)的虚拟用户数。

  • 单击“Start swarming”按钮,开始运行性能测试

 

运行之后可以看到主界面如下:

性能测试参数如下。

  • Type:请求的类型,例如GET/POST。

  • Name:请求的路径。

  • request:当前请求的数量。

  • fails:当前请求失败的数量。

  • Median:响应时间的中间值,即50%的响应时间在这个数值范围内,单位为毫秒;

  • Average:平均值,单位毫秒,所有请求的平均响应时间。

  • Min:请求的最小服务器响应时间,单位毫秒。

  • Max:请求的最大服务器响应时间,单位毫秒。

  • Content Size:单个请求的大小,单位字节。

  • reqs/sec:每秒钟请求的个数。即QPS

 点击 Charts 菜单可以查看性能图表

图表含义如下:

  • Total Request per Second :每秒的请求数

  • Average Response Time: 平均响应时间

  • Number of Users: 用户数




相关连接:

https://blog.csdn.net/weixin_38320674/article/details/108505688 ....................QPS、TPS、并发用户数、吞吐量关系

https://zhuanlan.zhihu.com/p/282824807  ........................locust代码案例

https://www.cnblogs.com/shenh/p/12424990.html ....................locust环境流程(包含分布式)

https://www.cnblogs.com/imyalost/p/9758189.html ......................locust基本环境流程

https://www.cnblogs.com/yoyoketang/p/9642242.html .................先登录场景案例

https://testerhome.com/topics/12712 .............................................Locust 简单例子

https://mp.weixin.qq.com/s?__biz=MzAxNjg3MTU4OQ==&mid=2247484282&idx=1&sn=f529a433410dde29ffb86efd792956aa ................locust汇总(包含no web模式)

https://testerhome.com/topics/24873 .......................................重新定义 Locust 的测试报告_  grafana性能监控平台

https://mp.weixin.qq.com/s/tIVdUfQlCnsKVC0VMLynLQ .............从0到1开展性能测试必备的性能测试要点!

https://mp.weixin.qq.com/s/lj7Oih1vswAXerk7lpz5ag ...................聊聊全链路压测 ,,服务改造

https://www.modb.pro/db/130338 ...............................................全链路压测之影子库介绍(影子库是做数据隔离的)

python性能测试工具locust的更多相关文章

  1. 性能测试工具Locust,一个开源性能测试工具

    性能测试工具Locust,一个开源性能测试工具使用Python代码来定义用户行为.用它可以模拟百万计的并发用户访问你的系统.1.它与目前主流的LoadRunner和Jmeter玩法都不一样.2.它完全 ...

  2. 基于python的性能测试工具–locust

    现在有很多的性能测试工具,比如说我们熟悉的loadrunner.jmeter.ab.webbench等等,这些工具如果对一个没用过的朋友来说,学习起来比较不容易,但是如果你能看懂python代码,会写 ...

  3. Python技术栈性能测试工具Locust入门

    Locust是一款Python技术栈的开源的性能测试工具.Locust直译为蝗虫,寓意着它能产生蝗虫般成千上万的并发用户: Locust并不小众,从它Github的Star数量就可见一斑: 截止文章写 ...

  4. 性能测试工具Locust

    An open source load testing tool. 一个开源性能测试工具. define user behaviour with python code, and swarm your ...

  5. 性能测试工具Locust的使用

    一.写在前面 官网:https://www.locust.io/ 官方使用文档:https://docs.locust.io/en/latest/ 大并发量测试时,建议在linux系统下进行. 二.L ...

  6. 开源性能测试工具Locust使用篇(三)

    脚本增强 面对较复杂的测试场景,我们可能还是会感觉无从下手:例如,很多时候脚本需要做关联或参数化处理,Locust中就不知道怎么实现了.可能也是这方面的原因,感觉难以将Locust应用到实际的性能测试 ...

  7. 开源性能测试工具Locust使用篇(二)

    那如何理解Locust和TaskSet这两个类呢? class HttpLocust(Locust) 在Locust类中,具有一个client属性,它对应着虚拟用户作为客户端所具备的请求能力,也就是我 ...

  8. 性能测试工具Locust的介绍和使用

    内容来自网络 https://www.w3xue.com/exp/article/20191/16707.html https://blog.csdn.net/qq_36255988/article/ ...

  9. 性能测试进阶:(一)性能测试工具Locust

    An open source load testing tool. 一个开源性能测试工具. define user behaviour with python code, and swarm your ...

  10. 好用的python性能测试神器–Locust

    原文链接:https://mp.weixin.qq.com/s/9PxSPuHmucSLi_welq6uNQ 现在性能测试工具太多,根据业务不同使用,比如说我们熟悉的loadrunner.jmeter ...

随机推荐

  1. Golang HTTP编程及源码解析

    1.网络基础 基本TCP客户-服务器程序Socket编程流程如如下图所示. TCP服务器绑定到特定端口并阻塞监听客户端端连接, TCP客户端则通过IP+端口向服务器发起请求,客户-服务器建立连接之后就 ...

  2. 用C++ 弹奏武侠音乐:沧海一声笑

    前言: 参照网路代码,用编程语言来弹奏一首音乐,搞点轻松的 原文:点击此处 完整代码: 以下为Visual Stuido 2022测试可用,控制台程序.运行之后,会自动弹奏沧海一声笑,并且出现歌词.主 ...

  3. 化学式latex语法

    $2 CO_2 \stackrel{光}{\underset{\text{催化剂}}{\longrightarrow}}2 Fe + 3 CO_2$ $\ce{CO2}$ $\ce{CU2+}$ $\ ...

  4. windows pwn(一)

    前言 前几天因为看CS shellcode装了一个win10虚拟机,然后正好因为逆向课老师要装一系列工具.于是就想起来之前一直想看的windows pwn,就顺便装了一下相关工具并且入门了一下. 工具 ...

  5. 剖析flutter_download_manager学习如何做下载管理,暂停和取消

    前言 内容类应用中图片或文件下载,一般应用中应用更新和升级,这些都是经典的下载场景.下载是项目中基础且重要的模块. 从代码逻辑复用性和人力成本考虑,一直想实现一个纯Dart实现的下载库,作为技术储备. ...

  6. LeetCode-593 有效的正方形

    来源:力扣(LeetCode)链接:https://leetcode.cn/problems/valid-square 题目描述 给定2D空间中四个点的坐标 p1, p2, p3 和 p4,如果这四个 ...

  7. LeetCode-1705 吃苹果的最大数目

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/maximum-number-of-eaten-apples 题目描述 有一棵特殊的苹果树,一连 ...

  8. django搭建简易blog

    目录 下载安装django 创建一个django项目 创建一个django应用 models.py urls.py views.py admin.py 配置应用到项目下 路由设置urls.py set ...

  9. mysql存储过程游标中途自动退出

    1.当在游标循环过程中select的结果集如果为空,就会触发游标continue handler for not found 提前将done置为1,导致提前退出游标. 2.游标循环中出现 select ...

  10. 关于paddleocr2.6 布局分析的踩坑总结(一)

    8月24日paddleocr发布了2.6.0,之前使用过2.5版本的布局分析,整体比较好用.近期就尝试了一下paddleocr的新版本,记录一下尝鲜经历.2.6版本的公告中指出,布局分析模型缩小了95 ...