学习了下locust做性能测试,写个笔记,怕自己忘记。性能测试用jemeter好像多一些,这个了解着好玩。
环境安装:
安装python和pycharm
安装locustio和三个依赖包:greenlet,gevent,geventhttpclient-wheels
卸载掉老版本:pip uninstall greenlet gevent locust locustio
安装新版本:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple greenlet==0.4.15 gevent==1.5a2 geventhttpclient-wheels==1.3.1.dev2 locustio==0.13.5
最好是安装以上的版本,其他版本发现有报错。
基本使用方法:
基本用法,导包,然后定义2个雷,分别继承TaskSet和Httplocust。继承TaskSet的类用来定义任务,另一个类用来进行locust的一些设置。@task装饰器用来表示具体任务
from locust import HttpLocust, TaskSet, task
#用户行为类,写需要做的操作
class userbehavior(TaskSet):
# 指定测试任务
@task
def test_login(self):
self.client('/')
class Websiteuser(HttpLocust):
#host地址和上面的client(‘’)里面的地址拼接成完整路径
host = 'http:127.0.0.1/iwebshop'
task_set = userbehavior
max_wait = 5000
min_wait = 2000
运行的命令:locust -f 脚本名称
然后打开http:localhost:8080打开locust首页,输入总用户数,每秒访问数,运行即可自动压力测试
案例一:单点测试:登录的性能
分2步:1.写代码安排任务,2.数据库构造存储过程,造数据(要想登录成功需要表中有该用户)
写代码:
from locust import HttpLocust, TaskSet, task
class uerbehavor(TaskSet):
@task
def regist(self):
#构造测试数据
for i in range(0, 101):
username = 'dabai' + str(i)
login_data = {'logininfo': username,
'password': '123456'}
self.client('/register', data=login_data)
class WebsiteSite(HttpLocust):
host = 'http:127.0.0.1/iwebshop'
task_set = uerbehavor
max_wait = 5000
min_wait = 2000
2.mysql数据库写一个存储过程
#创建一个存储过程,格式是以begin开始以end结束
create procedure login()
begin
#声明一个变量i,是int类型
declare i int;
while i <=3 do
insert into iwebuser(username,password)values(concat(dabai,i),'123456');
set i=i+1;
end whlie;
end
如果觉得这个数字3写死了不方便,可以传入参数num:login的括号加上num int,3替换成num,这样每次不用都输入一个num数了
还有时候会利用爬虫抓取页面元素,作为构造数据进行测试。
例如测试查询页面的性能时,会爬取页面商品关键词,然后写入csv表格作为测试数据
爬虫
from lxml import etree
response=requests.post('url').text
doc=etree.xpath(response)
keyword=doc.xpath('xpath路径'/text())
locust做性能测试执行很棒,但是监控指标太少,后续通过jmeter配合进行定位和调优的研究
如何构造100万甚至更多的性能压测?
1.2需要分布式部署。设置一台主控压力机和N台分布式压力机
在每台压力机上安装locust
把相关的测试脚本文件放在每台压力机上
明确一台主控压力机
在同一网段联网状态
2.执行命令
主控机:locust -f ***.py --master
压力机:locust -f ***.py --slave -host=ip地址(这里写master的地址)
3.设置虚拟用户
每个压力机设置10000个虚拟用户,合起来就足够多
locust参数说明
fails这个参数如果不超过10%可能可以接受,可能是需要刷新一下页面就好了
average平均响应时间在3-7s正常可以可以接受,再长就比较慢了。注意图标是毫秒ms
最大响应时间,合不合格看测试开始定的标准
上图中10。res/sec,表示每条请求数,表示压力机发送请求的情况,如下图平稳表示压力机工作正常
响应时间:黄色是最大响应时间,绿色是最小响应时间。
需要注意最大响应时间的波峰,如果持续不断的波峰,不断增加,说明性能出现问题
如下图中黄色最高峰,延迟90000ms,很高了,但是马上下降了,性能问题不大
总结:关注一直持续高位的情况
问题:用户是逐步增加并发的。如下图如果希望同时并发该怎么做
解决:设置集合点。
总而言之,虽然locust的指标数很少,主要看fails失败的比例,average平均响应时间,最大和最小响应时间