Locustfile中的User类和HttpUser类
时间:2025-11-04 06:08:06 出处:系统运维阅读(143)
本文转载自微信公众号「dongfanger」,类和类作者dongfanger。类和类转载本文请联系dongfanger公众号。类和类
locustfile是类和类什么?
locustfile是Locust性能测试工具的用户脚本,描述了单个用户的类和类行为。
locustfile是类和类个普通的Python模块,如果写作locustfile.py,类和类那么路径切换到文件所在目录,类和类直接执行命令就能运行:
$ locust如果换个名字,类和类那么只能通过-f参数指定文件名运行:
$ locust -f locust_files/my_locust_file.py与一般Python模块不同的类和类是:locustfile必须至少定义一个类,且继承自User类。类和类
User类
User类表示性能测试的类和类模拟用户,Locust会在运行时创建User类的类和类实例。
wait_time属性
设置等待时间,类和类默认值不等待,类和类立即执行。
Locust支持4种方式设置wait_time属性。
为了便于理解实际意义,我把源码贴在了下面。
constant函数,常量,任务执行完毕等待X秒开始下一任务。 def constant(wait_time): """ Returns a function that just returns the number specified by the wait_time argument Example:: class MyUser(User): wait_time = constant(3) """ return lambda instance: wait_time between函数,区间随机值,云南idc服务商任务执行完毕等待X-Y秒(中间随机取值)开始下一任务。 def between(min_wait, max_wait): """ Returns a function that will return a random number between min_wait and max_wait. Example:: class MyUser(User): # wait between 3.0 and 10.5 seconds after each task wait_time = between(3.0, 10.5) """ return lambda instance: min_wait + random.random() * (max_wait - min_wait) constant_pacing函数,自适应,若任务耗时超过该时间,则任务结束后立即执行下一任务;若任务耗时不超过该时间,则等待达到该时间后执行下一任务。 def constant_pacing(wait_time): """ Returns a function that will track the run time of the tasks, and for each time its called it will return a wait time that will try to make the total time between task execution equal to the time specified by the wait_time argument. In the following example the task will always be executed once every second, no matter the task execution time:: class MyUser(User): wait_time = constant_pacing(1) @task def my_task(self): time.sleep(random.random()) If a task execution exceeds the specified wait_time, the wait will be 0 before starting the next task. """ def wait_time_func(self): if not hasattr(self, "_cp_last_run"): self._cp_last_wait_time = wait_time self._cp_last_run = time() return wait_time else: run_time = time() - self._cp_last_run - self._cp_last_wait_time self._cp_last_wait_time = max(0, wait_time - run_time) self._cp_last_run = time() return self._cp_last_wait_time return wait_time_func 自定义wait_time方法,比如每次等待时间1秒2秒3秒递增: class MyUser(User): last_wait_time = 0 def wait_time(self): self.last_wait_time += 1 return self.last_wait_time ...weight属性
设置创建类实例的权重,默认每个类创建相同数量的实例。
locustfile中可以有多个继承了User类的类。
命令行可以指定运行哪些类:
$ locust -f locust_file.py WebUser MobileUser通过weight属性可以让类更大概率创建实例,比如:
class WebUser(User): weight = 3 ... class MobileUser(User): weight = 1 ...WebUser类比MobileUser类多三倍概率创建实例。
host属性
设置URL前缀。
一般是在Locust的Web UI或者命令行,通过--host指定URL前缀。如果没有通过--host指定,并且类中设置了host属性,那么类的host属性才会生效。
environment属性
对用户运行环境的引用。
比如在task方法中通过environment属性终止运行:
self.environment.runner.quit()注意,单机会终止所有运行,分布式只会终止单个worker节点。
on_start和on_stop方法
测试前初始化和测试后清理。
HttpUser类
开篇文章的示例脚本,没有继承User类,站群服务器而是继承了它的子类HttpUser:

它比User类更常用,因为它添加了一个client属性,用来发送HTTP请求。
client属性/HttpSession
HttpUser类的client属性是HttpSession类的一个实例:

HttpSession是requests.Session的子类,requests就是常用来做接口测试的那个requests库:

HttpSession没有对requests.Session做什么改动,主要是传递请求结果给Locust,比如success/fail,response time,response length,name。
示例:
response = self.client.post("/login", {"username":"testuser", "password":"secret"}) print("Response status code:", response.status_code) print("Response text:", response.text) response = self.client.get("/my-profile")由于requests.Session会暂存cookie,所以示例中登录/login请求后可以继续请求/my-profile。
断言响应结果
可以使用with语句和catch_response参数对响应结果进行断言:
with self.client.get("/", catch_response=True) as response: if response.text == "Success": response.success() elif response.text != "Success": response.failure("Got wrong response") elif response.elapsed.total_seconds() > 0.5: response.failure("Request took too long")或者直接抛出异常:
from locust.exception import RescheduleTask ... with self.client.get("/does_not_exist/", catch_response=True) as response: if response.status_code == 404: raise RescheduleTask()name参数
name参数用于把不同api按同一分组进行统计,比如:
for i in range(10): self.client.get("/blog?id=%i" % i, name="/blog?id=[id]")会按/blog/?id=[id]统计1条数据,而不是分成10条数据。
HTTP代理
Locust默认设置了requests.Session的trust_env为False,不查找代理,以提高运行性能。如果需要可以设置locust_instance.client.trust_env为True。
示例代码
请求REST API并断言:
from json import JSONDecodeError ... with self.client.post("/", json={"foo": 42, "bar": None}, catch_response=True) as response: try: if response.json()["greeting"] != "hello": response.failure("Did not get expected value in greeting") except JSONDecodeError: response.failure("Response could not be decoded as JSON") except KeyError: response.failure("Response did not contain expected key greeting")小结
locustfile是个普通Python模块,服务器租用必须继承User类或其子类HttpUser等。本文对User类和HttpUser类的属性和方法进行了介绍,使用它们可以编写性能测试的用户脚本。locustfile还有另外一个重要组成元素,@task。
猜你喜欢
- 电脑玩原神遇到的问题及解决方法(探索神奇世界,解决游戏中常见错误)
- iPhone3GS分辨率(探索iPhone3GS分辨率的优势和局限性)
- 微软Surface2RT(探索Surface2RT的卓越性能与卓越功能,开启移动办公新时代)
- 探索索尼MDR-EX220LP耳机的品质和性能(了解MDR-EX220LP耳机的特点和用户体验)
- 电脑恢复重置教程(一步步教你如何进行电脑恢复重置,让电脑焕然一新)
- 尼康70-200f4镜头的特点与优势(适用广泛,轻便易携,画质出众)
- 华硕飞行堡垒FX50J(华硕FX50J笔记本电脑的性能、外观及使用体验评测)
- 如何在电脑win7系统中找回彻底删除的文件夹?(快速恢复已删除的文件夹,避免数据丢失的烦恼)
- 小白也能轻松学会电脑装机(详解电脑装机教程,让你快速掌握装机技巧)
