如何将FastHttpUser的client方法迁移至TaskDetails并在User_1中调用?
实现方案说明
可以实现需求,但你期望的直接写法@task td.client_get(url)无法直接生效——因为@task装饰器需要接收一个可调用的函数/方法,而td.client_get(url)是直接调用后的返回值,不是可被装饰的方法。下面提供几种可行的实现方式:
方式一:用工厂函数返回任务方法
调整TaskDetails的实现,让client_get返回一个能接收用户实例的函数:
# local_helper.py class TaskDetails: def client_get(self, url): # 返回一个可作为任务的函数,接收User实例作为参数 def task_func(user_instance): user_instance.client.get(url) return task_func
然后在用户类中直接赋值任务:
from locust.contrib.fasthttp import FastHttpUser from local_helper import TaskDetails from locust import task td = TaskDetails() # 假设url是预先定义好的变量 url = "/target-path" class User_1(FastHttpUser): # 直接将工厂函数返回的函数用@task装饰后赋值给类属性 iteration_task = task(td.client_get(url))
方式二:用Mixin类整合逻辑
把TaskDetails设计成Mixin类,让用户类直接继承,这样就能自然访问FastHttpUser的client属性:
# local_helper.py class TaskDetails: def client_get(self, url): self.client.get(url)
用户类实现:
from locust.contrib.fasthttp import FastHttpUser from local_helper import TaskDetails from locust import task url = "/target-path" class User_1(TaskDetails, FastHttpUser): @task def iteration_task(self): self.client_get(url)
这种方式逻辑更清晰,符合Python类继承的设计习惯,也能直接复用FastHttpUser的所有属性和方法。
方式三:静态方法接收用户实例
如果不想用继承,也可以把TaskDetails的方法设为静态方法,显式接收用户实例:
# local_helper.py class TaskDetails: @staticmethod def client_get(user_instance, url): user_instance.client.get(url)
用户类中调用:
from locust.contrib.fasthttp import FastHttpUser from local_helper import TaskDetails from locust import task td = TaskDetails() url = "/target-path" class User_1(FastHttpUser): @task def iteration_task(self): td.client_get(self, url)
内容的提问来源于stack exchange,提问作者Ardhi
相关产品推荐
相关产品推荐

