使用Locust进行接口性能测试:关联与参数化技巧分析(三)

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任务都会从队列取数,这样就保证数据的唯一性,并在并发场景中循环使用,利用这个特点可以很好的处理多用户流程执行脚本的时候,出现数据错位的情况。

总结

以上就是勇哥今天为各位小伙伴准备的内容,如果你想了解更多关于Python自动化测试的知识和技巧,欢迎关注我:公众号\博客\CSDN\B站:测试玩家勇哥;我会不定期地分享更多的精彩内容。感谢你的阅读和支持!


题外话,勇哥打算把新建的技术交流群,打造成一个活跃的高质量技术群。工作中遇到的技术问题,都可以在里面咨询大家,还有工作内推的机会。有兴趣的小伙伴,欢迎加我(记得备注是进群还是报名学习)👇👇👇****

👆****👆********👆长按上方二维码2秒,关注我


勇哥,10年落魄测试老司机,技术栈偏python,目前在一家超大型房产公司担任自动化测试主管,日常工作比较繁杂,主要负责自动化测试,性能测试、软件质量管理及人员管理。工作之余专注于为粉丝进行简历修改、面试辅导、模拟面试、资料分享、一对一自动化测试教学辅导等副业发展。目前已服务十多位小伙伴,取得高薪offer。

关注公众号,测试干货及时送达

往期精选文章👇:
接口自动化测试项目2.0,让你像Postman一样编写测试用例,支持多环境切换、多业务依赖、数据库断言等
揭秘抓包利器:Python和Mitmproxy让您轻松实现接口请求抓取与分析!
构建高效的接口自动化测试框架思路
Pytest 快速入门
接口自动化之测试数据动态生成并替换
requests模块该如何封装?
接口自动化如何封装mysql操作
一文看懂python如何执行cmd命令
最通俗易懂python操作数据库
python-Threading多线程之线程锁
python正则一篇搞掂
性能测试之必备知识

性能分析思

Python + ChatGPT来实现一个智能对话的钉钉机器人
一文看懂python如何执行cmd命令
posted @ 2023-08-10 15:52  测试玩家勇哥  阅读(165)  评论(0编辑  收藏  举报