百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

python:教你用几十行代码实现系统的性能自动化测试

off999 2024-10-01 14:02 31 浏览 0 评论


前言

在开发中,我们有时会碰到,相同的代码名明明测试环境没有问题,上了生产就出现各种“幺蛾子”,不是连接超时,就是数据有问题,去检查代码也不觉得有问题。然后查看系统监控发现,出问题的时间段,往往系统的cpu使用率、内存占有率都比较高。如果我们预估上线后, 网站或者接口的访问量, 提前对接口或者网站做压力测试,提前评估下可能会出现的情况,结果就不一样了。

性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。压力测试是通过确定一个系统的瓶颈或者不能接受的性能点,来获得系统能提供的最大服务级别的测试。

一、Locust介绍和安装

Locust 是一个用 Python 编写的开源的负载测试工具。它允许您针对模拟用户行为的 Web 应用程序编写测试,然后按规模运行测试以帮助查找瓶颈或其他性能问题。

安装:pip install locust

检查是否安装成功:locust -help



二、Locust的源码

创建unctionTest.py,编写源码

1、创建一个方法WebsiteTasks(TaskSet)并继承TaskSet

2、编写启动执行项on_start(self), 改启动项只会启动的时候被执行一次。

3、添加执行的任务@task(5), 方法的参数用于指定该行为的执行权重,参数越大每次被虚拟用户执行的概率越高,默认为1。

4、创建 WebsiteUser(HttpLocust)继承HttpLocust, 配置Locust执行的一些配置参数。

源码如下:


from locust import HttpLocust, TaskSet, taskclass WebsiteTasks(TaskSet):
 #进行初始化的工作,每个Locust用户开始做的第一件事
 def on_start(self): 
 payload = {
 "username": "test",
 "password": "test01",
 }
 header = {
 "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
 }
 self.client.post("/login",data=payload,headers=header)#self.client属性使用Python request库的所有方法,调用和使用方法和requests完全一致;
 #通过@task()装饰的方法为一个事务,方法的参数用于指定该行为的执行权重,参数越大每次被虚拟用户执行的概率越高,默认为1
 @task(5) 
 def index(self):
 self.client.get("/")
 @task(1)
 def about(self):
 self.client.get("/about/")
class WebsiteUser(HttpLocust):
 #被测系统的host,在终端中启动locust时没有指定--host参数时才会用到
 host = "https://github.com/"
 #TaskSet类,该类定义用户任务信息,必填。这里就是:WebsiteTasks类名,因为该类继承TaskSet;
 task_set = WebsiteTasks
 #每个用户执行两个任务间隔时间的上下限(毫秒),具体数值在上下限中随机取值,若不指定默认间隔时间固定为1秒 
 min_wait = 5000 
 max_wait = 15000

三、开发自动化性能测试

1、执行源码:

locust -f D:\javacode\hk03\webPageTest\src\性能自动化测试\functionTest.py



2、浏览器访问locust:

http://localhost:8089/



Number of users to simulate 设置并发的总用户数

Hatch rate (users spawned/second) 设置每秒产生的用户数

点击start swmarming开始运行

3、运行结果

统计页面如下:



图表页面:

每秒请求总数统计



请求响应的时间统计:




请求用户数的统计



故障统计



还可以下载统计的结果



完美!!!!!!!!!!!!!!!!

四、一些扩展

no-web模式运行启动

终端中-->进入代码目录:>> locust -f xxoo.py --no-web -c10 -r2 -t 1m

启动参数:--no-web 表示不使用web界面运行测试。 -c 设置虚拟用户数 。 -r 设置每秒启动虚拟用户数 。 -t 设置运行时间.。

no-web模式运行将测试结果保存到当前.py目录中:locust -f xxoo.py --csv=起一个名字

例如:locust -f test3.py --csv=foobar --no-web -c2 -t10s

分布式压测:

主从机中必须运行相同的测试代码(把主机中代码复制一份到多个从机中),主机负责收集测试数据,从机进行施压测试;

在主机终端中-->进入代码目录:>> locust -f xxxoo.py --master

从机中终端中-->进入代码目录:>> locust -f xxxoo.py --slave --master-host=主机ip

分布式压测no-web模式保存结果到主机中当前运行.py的目录中:>>locust -f test2.py --csv=foobartt --no-web -c2 -t10s --master

WebsiteTasks类中如何去调用 WebsiteUser(HttpLocust)类中定义的字段和方法呢?

通过在WebsiteTasks类中self.locust.xxoo xxoo就是我们在WebsiteUser类中定义的字段或方法;

代码如下


from locust import HttpLocust, TaskSet, task
class WebsiteTasks(TaskSet):
 @task(1)
 def about(self):
 #获取WebsiteUser定义的参数
 user_date = self.locust.user_date
 testDate = self.locust.funTest()
 self.client.get("/about/")
class WebsiteUser(HttpLocust):
 host = "https://github.com/"
 task_set = WebsiteTasks
 min_wait = 5000 
 max_wait = 15000
 user_date = "testdata"
 def funTest(self):
 return "哈哈哈,访问到了"

self.client 的理解

在Locust类中,静态字段client即客户端的请求方法,这里的client字段没有绑定客户端请求方法,因此在使用Locust时,需要先继承Locust类class HttpLocust(Locust),然后在self.client = HttpSession(base_url=self.host)绑定客户端请求方法;

对于常见的HTTP(s)协议,Locust已经实现了HttpLocust类,其self.client=HttpSession(base_url=self.host),而HttpSession继承自requests.Session。因此在测试HTTP(s)的Locust脚本中,可以通过client属性来使用Python requests库的所 有方法,调用方式与 reqeusts完全一致。另外,由于requests.Session的使用,client的方法调用之间就自动具有了状态记忆功能。常见的场景就是,在登录系统后可以维持登录状态的Session,从而后续HTTP请求操作都能带上登录状态。

关注公众号“莫非技术栈”可以免费领取源码哦~

相关推荐

apisix动态修改路由的原理_动态路由协议rip的配置

ApacheAPISIX能够实现动态修改路由(DynamicRouting)的核心原理,是它将传统的静态Nginx配置彻底解耦,通过中心化配置存储(如etcd)+OpenRest...

使用 Docker 部署 OpenResty Manager 搭建可视化反向代理系统

在之前的文章中,xiaoz推荐过可视化Nginx反向代理工具NginxProxyManager,最近xiaoz还发现一款功能更加强大,界面更加漂亮的OpenRestyManager,完全可以替代...

OpenResty 入门指南:从基础到动态路由实战

一、引言1.1OpenResty简介OpenResty是一款基于Nginx的高性能Web平台,通过集成Lua脚本和丰富的模块,将Nginx从静态反向代理转变为可动态编程的应用平台...

OpenResty 的 Lua 动态能力_openresty 动态upstream

OpenResty的Lua动态能力是其最核心的优势,它将LuaJIT嵌入到Nginx的每一个请求处理阶段,使得开发者可以用Lua脚本动态控制请求的生命周期,而无需重新编译或rel...

LVS和Nginx_lvs和nginx的区别

LVS(LinuxVirtualServer)和Nginx都是常用的负载均衡解决方案,广泛应用于大型网站和分布式系统中,以提高系统的性能、可用性和可扩展性。一、基本概念1.LVS(Linux...

外网连接到内网服务器需要端口映射吗,如何操作?

外网访问内网服务器通常需要端口映射(或内网穿透),这是跨越公网与私网边界的关键技术。操作方式取决于网络环境,以下分场景详解。一、端口映射的核心原理内网服务器位于私有IP地址段(如192.168.x.x...

Nginx如何解决C10K问题(1万个并发连接)?

关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。Nginx是大型架构的必备中间件,下面我就全面来详解NginxC10k问题@mikechen文章来源:mikec...

炸场!Spring Boot 9 大内置过滤器实战手册:从坑到神

炸场!SpringBoot9大内置过滤器实战手册:从坑到神在Java开发圈摸爬滚打十年,见过太多团队重复造轮子——明明SpringBoot自带的过滤器就能解决的问题,偏偏要手写几十...

WordPress和Typecho xmlrpc漏洞_wordpress主题漏洞

一般大家都关注WordPress,毕竟用户量巨大,而国内的Typecho作为轻量级的博客系统就关注的人并不多。Typecho有很多借鉴WordPress的,包括兼容的xmlrpc接口,而WordPre...

Linux Shell 入门教程(六):重定向、管道与命令替换

在前几篇中,我们学习了函数、流程控制等Shell编程的基础内容。现在我们来探索更高级的功能:如何控制数据流向、将命令链接在一起、让命令间通信变得可能。一、输入输出重定向(>、>>...

Nginx的location匹配规则,90%的人都没完全搞懂,一张图让你秒懂

刚配完nginx网站就崩了?运维和开发都头疼的location匹配规则优先级,弄错顺序直接导致500错误。核心在于nginx处理location时顺序严格:先精确匹配=,然后前缀匹配^~,接着按顺序正...

liunx服务器查看故障命令有那些?_linux查看服务器性能命令

在Linux服务器上排查故障时,需要使用一系列命令来检查系统状态、日志文件、资源利用情况以及网络状况。以下是常用的故障排查命令,按照不同场景分类说明。1.系统资源相关命令1.1查看CPU使...

服务器被入侵的常见迹象有哪些?_服务器入侵可以被完全操纵吗

服务器被入侵可能会导致数据泄露、服务异常或完全失控。及时发现入侵迹象能够帮助你尽早采取措施,减少损失。以下是服务器被入侵的常见迹象以及相关的分析与处理建议。1.服务器被入侵的常见迹象1.1系统性能...

前端错误可观测最佳实践_前端错误提示

场景解析对于前端项目,生产环境的代码通常经过压缩、混淆和打包处理,当代码在运行过程中产生错误时,通常难以还原原始代码从而定位问题,对于深度混淆尤其如此,因此Mozilla自2011年开始发起并...

8个能让你的Kubernetes集群“瞬间崩溃”的配置错误

错误一:livenessProbe探针“自杀式”配置——30秒内让Pod重启20次现象:Pod状态在Running→Terminating→CrashLoopBackOff之间循环,重启间隔仅...

取消回复欢迎 发表评论: