一、什么是集合点?
集合点用以同步虚拟用户,以便恰好在同一时刻执行任务。在[测试计划]中,可能会要求系统能够承受1000 人同时提交数据,可以通过在提交数据操作前面加入集合点,这样当虚拟用户运行到提交数据的集合点时,就检查同时有多少用户运行到集合点,如果不到1000 人,已经到集合点的用户在此等待,当在集合点等待的用户达到1000 人时,1000 人同时去提交数据,从而达到测试计划中的需求。
注意:框架本身没有直接封装集合点的概念 ,间接通过gevent并发机制,使用gevent的锁来实现
0-1+1
0 阻塞线 等待
semaphore是一个内置的计数器: 每当调用acquire()时,内置计数器-1 每当调用release()时,内置计数器+1 计数器不能小于0,当计数器为0时,acquire()将阻塞线程直到其他线程调用release()
二、具体的实现步骤:
all_locusts_spawned=Semaphore()创建计数器的对像 将locust实例挂载到监听器 events.spawning_complete.add_listener Locust实例准备完成时触发
三、需求,做我们的登录,然后让其用户达到 20的时候,进行压测
四、代码实现:
from locust import *
from gevent._semaphore import Semaphore
# 创建计数器
all_semaphore=Semaphore()
#如果计数器为0则阻塞线程
all_semaphore.acquire()
#创建钩子函数
def on_math_complete(**kwargs):
all_semaphore.release()
# 挂在到locust钩子函数(所有的Locust示例产生完成时触发)
events.spawning_complete.add_listener(on_math_complete)
num=0
class loginAssert(HttpUser):
wait_time =between(1,2)
host = "http://127.0.0.1:8080"
def on_start(self) -> None:
global num
num+=1
print('%s 个用户正在等待; '%num)
all_semaphore.wait()
def on_stop(self) -> None:
print('on stop')
@task
def login(self):
with self.client.post('/login', json={'username': 'admin', 'password': '<PASSWORD>'},name='登录',catch_response=True)as response:
if response.status_code == 200:
response.success()
else:
response.failure("登录失败")
五、实现效果:当locust中设置用户数20时,达到20集合点实现接口并发
标签:实现,Locust,计数器,集合点,semaphore,response,def,1000 From: https://www.cnblogs.com/yongheng999/p/18083465