文章目录
- 一、Locust 的基本学习
- 1-0 最简单的事例
- 1-1 基本使用
- 1-2 基于内置 http 请求的源码分析
- 二、实现基于 WebSocket 协议的压力测试
- 三、可视化界面测试
一、Locust 的基本学习 Locust 官方文档
1-0 最简单的事例
from locust import Locust, TaskSet, taskclass MyTaskSet(TaskSet):
@task
def my_task(self):
print("executing my_task")class MyLocust(Locust):
task_set = MyTaskSet
min_wait = 5000
max_wait = 15000# locust -f locust_file.py MyLocust
1-1 基本使用
from locust import HttpLocust, TaskSet, task, Locust
from locust.clients import HttpSession
from locust.exception import LocustErrorclass UserBehavior(TaskSet):
def on_start(self):
""" on_start is called when a Locust start before any task is scheduled """
self.login()def on_stop(self):
""" on_stop is called when the TaskSet is stopping """
self.logout()def login(self):
self.client.post("/login", {"username": "ellen_key", "password": "education"})def logout(self):
self.client.post("/logout", {"username": "ellen_key", "password": "education"})@task(2)
def index(self):
self.client.get("/")@task(1)
def profile(self):
self.client.get("/profile")# Then we have a HttpLocust class which represents a user,
# where we define how long a simulated user should wait between executing tasks,
# as well as what TaskSet class should define the user’s “behaviour”.
class WebsiteUser(HttpLocust):
# Locust - task_set.run() - UserBehavior.run() - TaskSet.run()
task_set = UserBehavior
# 执行事物之间用户等待时间的下界,单位毫秒
min_wait = 5000
max_wait = 9000'''
RUN WAY : locust -f locust_files/my_locust_file.py --host=http://example.comlocust -f supperdiancan.py --no-web -c 10 -r 3 --run-time 10s
-flocust_file.py文件(locust任务文件)
-c指定要生成的Locust用户数
-r每秒生成的用户数
-n用于0.8用于-n指定请求数
--run-time 或-t指定测试的运行时间
'''
1-2 基于内置 http 请求的源码分析
- 基本流程分析
- WebsiteUser - Locust 子类,用于配制相关信息;可自定义名字,若但文件存在多个该类,则可使用命令进行指定执行。
- UserBehavior - TaskSet 子类,用于配制相关任务,每个user执行一次。
- HttpLocust - Locust 子类,用于初始化 client 交与 WebsiteUser
- HttpSession - 使用 requests 模块,实现基于 https 协议的连接
- 仿写思路
- 实现 ws 连接类,类似于 HttpSession
- 继承 Locust 类,实现 client 的覆盖,类比HttpLocust
- UserBehavior 内实现服务链接,一个用户一个链接
- WebsiteUser 配置信息,将 task_set 指向 UserBehavior
import gzip
import json
import timeimport websocket
from locust import TaskSet, events, Locust, taskclass WebSocketClient(object):def connect(self, url):
try:
self.ws = websocket.WebSocketApp(url)
self.ws.on_message = self.on_message
self.ws.on_error = self.on_error
self.ws.on_close = self.on_close
except websocket.WebSocketTimeoutException as e:
events.request_failure.fire(request_type="web_socket", name='ws', response_time=time.time(), exception=e)
else:
events.request_success.fire(request_type="web_socket", name='ws', response_time=time.time(),
response_length=0)
return self.wsdef on_message(self, message):
if isinstance(message, bytes):
message = gzip.decompress(message).decode("utf-8")
message = json.loads(message)
print(message)
if isinstance(message, dict):
if 'ping' in message:
pong = {'pong': message['ping']}
self.ws.send(json.dumps(pong))def on_error(self, error):
print('!!! error !!!', error)def on_close(self):
print("### closed ###")def on_open(self):
print('opened')
data = https://www.it610.com/article/{"sub": {'category': 0, 'star': []}}
self.ws.send(json.dumps(data))class WebSocketLocust(Locust):
def __init__(self):
super(WebSocketLocust, self).__init__()
self.client = WebSocketClient()class UserBehavior(TaskSet):
def on_start(self):
print('--------- task start ------------')
self.url = 'ws://localhost:8000/v1/ws/marketpair'def on_stop(self):
print('---------- task stop ------------')@task
def test_ws(self):
ws = self.client.connect(self.url)
ws.run_forever()class WebsiteUser(WebSocketLocust):
task_set = UserBehavior
min_wait = 5000
max_wait = 9000# locust -f market_pair_connect.py --host=http://127.0.0.1/
三、可视化界面测试 默认测试页面 :http://127.0.0.1:8089/
【测试 - 基于 Locust 的 WebSocket-server 压力测试】
文章图片
推荐阅读
- 面试|我经历的IT公司面试及离职感受(转)
- Asp.net|System.Globalization.DateTimeFormatInfo.InvariantInfo
- 测试|16年资深测试大牛教你三部成为测试架构师
- Android|Android VideoView如何播放RTSP的流
- web技术|项目管理之如何控制项目进度和质量
- android|测量webView页面性能技术方案
- 测试|selenium-grid AND docker化方案
- Java|Jacoco覆盖率工具使用调研