一:安装
使用 pip 安装 Locust:
pip install locust
shift+右键可以进入PowerShell 命令行窗口,也可以进入cmd窗口,和pycharm命令窗口输入安装命令。
locust需要一个py文件描述压测内容和操作。
locust版本1.0之前:文件内容大致如下:
需要一个用户类,该类继承HttpLocust。
class UserOne(HttpLocust):
task_set = UserTask #指向定义了用户行为的类
weight = 1 #同时运行多个Locust类时会用到,用于控制不同类型任务的执行权重,测试开始后,每个虚拟用户(Locust实例)的运行逻辑都会遵循如下规律:先执行WebsiteTasks中的on_start(只执行一次),作为初始化;从WebsiteTasks中随机挑选(如果定义了任务间的权重关系,那么就是按照权重关系随机挑选)一个任务执行;根据Locust类中min_wait和max_wait定义的间隔时间范围(如果TaskSet类中也定义了min_wait或者max_wait,以TaskSet中的优先),在时间范围中随机取一个值,休眠等待;重复2~3步骤,直至测试任务终止。
min_wait = 1000 #最小等待时间毫秒
max_wait = 1000 #最大等待时间毫秒
#相同可控制每秒增长量
stop_timeout = 5 Locust停止的秒数,如果为None,将不停止一直执行任务,单位为s秒
host = "https://www.baidu.com" #压测地址根路径
一个用户描述类:
class UserTask(TaskSet):
@task #@task装饰该方法表示为用户行为,括号里面参数表示该行为的执行权重:数值越大,执行频率越高,不设置默认是1;
def tc_index(self):
self.client.get("/")
locust版本1.0以后:文件内容大致如下:
可以看到从HttpLocust类变成了HttpUser类。
我们创建一个py文件取个喜欢的名字,并写出来大概的代码。
from locust import HttpUser, between, TaskSet, task
class MyTest(TaskSet):
@task #@task 装饰的方法才会在 Locust 虚拟用户运行过程中被调用
def testdef(self):
pass
class Userone(HttpUser):
wait_time = between(1, 2) #思考时间,1秒到2之间随机等待
# wait_time = constant(3) # 每次请求停顿时间 (思考时间)
host = 'http://xxxx'
# tasks = {
# MyTest: 3 #后面数字表示多个行为时候选择比例
# MyTest: 1 #后面数字表示多个行为时候选择比例
# }
tasks = [MyTest]
这里教大家一个从postman导出Python脚本的方法,如下图。
import requests
url = "http://www.weather.com.cn/data/cityinfo/101190408.html"
payload={}
headers = {}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
现在修改我们的locust代码,注意要使用locust的client客户端。
from locust import HttpUser, between, TaskSet, task
class MyTest(TaskSet):
@task
def testdef(self):
url='data/cityinfo/101190408.html' #调用接口 将会拼在根路径后面
payload = {}
headers = {}
r=self.client.request(method='GET', url=url, headers=headers, name='获取天气') #注意要使用locust的client客户端
r.encoding = 'UTF-8' #解码
print(r.text)
def on_start(self):
print('这是SETUP,每次实例化User前都会执行!')
def on_stop(self):
print('这是TEARDOWN,每次销毁User实例时都会执行!')
class Userone(HttpUser):
wait_time = between(1, 2) #思考时间,1秒到2之间随机等待
host = 'http://www.weather.com.cn/'
# tasks = {
# MyTest: 3 #后面数字表示多个行为时候选择比例
# MyTest: 1 #后面数字表示多个行为时候选择比例
# }
tasks = [MyTest]
if __name__ == "__main__":
import os
os.system("locust -f 演示locust.py") #相当于我们在当前目录命令行下执行了locust -f 演示locust.py
实际使用当中我们会自己添加自己的断言,注意catch_response 属性,必须设置为TRUE才能设置断言错误。
import json
import random
from locust import HttpUser, between, TaskSet, task
class MyTest(TaskSet):
@task
def testdef(self):
url='data/cityinfo/101190408.html'
payload = {}
headers = {}
f = [200, 100]
x=random.choice(f)
print(x)
with self.client.request(method='GET', url=url, headers=headers, name='获取天气',catch_response=True) as response: #catch_response = True :布尔类型,如果设置为 True, 允许该请求被标记为失败。
if response.status_code != x:
response.failure("请求错误,返回状态不正确")
elif response.elapsed.total_seconds() > 0.02:
response.failure("请求错误,耗时太长")
else:
response.success()
response.encoding = 'UTF-8'
print(response.text)
def on_start(self):
print('这是SETUP,每次实例化User前都会执行!')
def on_stop(self):
print('这是TEARDOWN,每次销毁User实例时都会执行!')
class Userone(HttpUser):
wait_time = between(1, 2) #思考时间,1秒到2之间随机等待
host = 'http://www.weather.com.cn/'
# tasks = {
# MyTest: 3 #后面数字表示多个行为时候选择比例
# MyTest: 1 #后面数字表示多个行为时候选择比例
# }
tasks = [MyTest]
if __name__ == "__main__":
import os
os.system("locust -f 演示locust.py")#相当于我们在当前目录命令行下执行了locust -f 演示locust.py
浏览器访问:运行命令locust -f 演示locust.py启动服务,可以看到默认端口8089,通过浏览器http://localhost:8089/访问,0.0.0.0运行以后我们的同事可以通过局域网我们的ip访问我们的服务,以后介绍django搭建平台时候也会用的。
增长折线图
无浏览器模式:-u
指定要产生的用户数,并-r
指定产生速率(每秒要启动的用户数)
locust -f 演示locust.py --headless -u 100 -r 10
--run-time
如果要指定测试的运行时间,则可以使用--run-time或进行操作-t ,一旦时间到,locust就停止运行,1h30m5s,h小时m分钟s秒。
locust -f 演示locust.py --headless -u 100 -r 10 --run-time 5s
默认情况下,locust将立即停止任务(甚至不等待请求完成)。如果要允许任务完成其迭代,则可以使用--stop-timeout <seconds>
参数
locust -f --headless -u 1000 -r 100 --run-time 1h30m --stop-timeout 10
locust -f 演示locust.py --headless -u 100 -r 10 --run-time 5s --csv=mycsv
加上--csv=mycsv 参数保存CSV文件
简单的介绍了下locust入门,优点是快速上手,单机模拟出较高的并发压力,缺点是报告简单,性能上不去。读者可以深入了解下locust分布式,祝大家情人节快乐,有情人终成眷属,没对象的好好学习。