Locust是一款开源的Python性能测试工具,它可以模拟大量并发用户对网站或者其他接口进行压力测试
1. 关联:精确模拟用户操作
在某些场景下,我们需要将之前请求的响应参数关联到后续请求中,以模拟用户操作。这在会话管理(如session_id的传递)中很常见。通过关联,将上一个请求的响应数据应用到下一个请求中。示例:
-
from locust import TaskSet, task
-
from lxml import etree
-
class UserTasks(TaskSet):
-
@task
-
def login_and_continue(self):
-
# 模拟业务流程
-
response = self.client.get('/login')
-
session_id = self.extract_session_id(response.text)
-
self.client.post('/continue', json={"session_id": session_id})
-
def extract_session_id(self, html):
-
""这个函数只提供获取数据,不作为任务执行 ""
-
tags = etree.HTML(html)
-
return tags.xpath("//input[@name='session_id']/@value")[0]
使用extract_session_id
方法从响应中提取会话ID,并在后续请求中应用。
2. 数据循环:多用户操作模拟
如我们需要使用3个用户对一批URL压测,每个用户都需要访问到每个url,可以使用数据循环的方式实现:
-
from locust import TaskSet, task
-
class UserTasks(TaskSet):
-
def on_start(self):
-
self.url_index = 0
-
@task
-
def visit_multiple_pages(self):
-
url = self.user_data["urls"][self.url_index]
-
self.url_index = (self.url_index + 1) % len(self.user_data["urls"])
-
self.client.get(url)
-
def setup(self):
-
self.user_data["urls"] = ['page1', 'page2', 'page3', 'page4', 'page5']
通过setup
方法设置了循环的URL列表,然后在visit_multiple_pages
任务中实现了URL的循环使用,模拟不同用户对不同页面的操作。
3. 队列数据控制:并发数据模拟
为了并发测试数据的唯一性,可以使用队列参数化技巧。通过从队列中顺序取数然后重新放入队列:
-
from locust import TaskSet, task
-
import queue
-
class UserTasks(TaskSet):
-
@task
-
def unique_concurrent_actions(self):
-
try:
-
data = self.user_data_queue.get()
-
except queue.Empty:
-
print('数据已用尽,测试结束。')
-
exit(0)
-
self.client.post('/action', json=data)
-
self.user_data_queue.put_nowait(data)
-
def setup(self):
-
self.user_data_queue = queue.Queue()
-
for index in range(100):
-
data = {
-
"param1": f"value{index:04d}",
-
"param2": f"value{index:04d}"
-
}
-
self.user_data_queue.put_nowait(data)
用户共享同一组数据,先将数据放入队列,所有用户开始执行unique_concurrent_actions
任务都会从队列取数,这样就保证数据的唯一性,并在并发场景中循环使用,利用这个特点可以很好的处理多用户流程执行脚本的时候,出现数据错位的情况
感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取