You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Locust调用类实例方法报missing 1 required positional argument 'self'错误

问题场景

使用Locust框架开发测试脚本时,执行print(AbstractUser.get_token())触发如下报错:

TypeError: get_user_id() missing 1 required positional argument: 'self'

涉及的核心代码如下:

from locust import HttpUser
class AbstractUser(HttpUser):
    abstract = True

    def __init__(self, parent):
        super(AbstractUser, self).__init__(parent)
        self.user_attr = {}


    def set_token(self, token):
        self.user_attr['token'] = token

    def get_token(self):
        if 'token' in self.user_attr.keys():
            return self.user_attr['token']
        else:
            return None

错误截图参考:
错误截图1
错误截图2


报错原因
  • set_token、get_token都是类的实例方法,这类方法定义时第一个参数固定为self,作用是接收当前类的实例对象,这个参数不需要手动传,当你通过「类的实例」调用方法时,Python会自动把实例绑定给self。
  • 直接用AbstractUser.get_token()的写法,是通过类本身调用实例方法,此时Python不会自动传入实例对象给self参数,自然会抛出缺少必填参数的错误。
  • 额外说明:定义的是Locust的抽象用户类,正常压测运行时Locust会自动完成用户类的实例化,这类存取token的方法本来就应该在类内部通过self调用,不需要在类外部手动通过类名调用。
修复方案
  • 如果是本地调试类方法逻辑,必须先实例化类,再通过实例调用方法:
# 错误写法 直接通过类调用实例方法
# print(AbstractUser.get_token())

# 正确调试写法
if __name__ == "__main__":
    # Locust的HttpUser初始化需要传入parent参数,本地调试可传None
    test_user = AbstractUser(parent=None)
    # 初始无token,打印None
    print(test_user.get_token())
    # 存入测试token
    test_user.set_token("test_token_abc123")
    # 打印存入的token
    print(test_user.get_token())
  • 正式压测脚本中,所有实例方法直接在类内部通过self调用即可,参考标准写法:
from locust import HttpUser, task, between

class AbstractUser(HttpUser):
    abstract = True
    wait_time = between(1, 3)

    def __init__(self, parent):
        super(AbstractUser, self).__init__(parent)
        self.user_attr = {}

    def set_token(self, token):
        self.user_attr['token'] = token

    def get_token(self):
        # 用字典get方法更简洁,key不存在时直接返回None
        return self.user_attr.get('token')

    def on_start(self):
        # 压测启动后每个虚拟用户先执行登录
        login_resp = self.client.post(
            "/api/login",
            json={"username": "test_user", "password": "test_pass"}
        )
        token = login_resp.json()["data"]["token"]
        # 类内部通过self调用方法,自动绑定self不会报错
        self.set_token(token)

    @task
    def get_user_profile(self):
        # 取token组装鉴权请求头
        auth_headers = {"Authorization": f"Bearer {self.get_token()}"}
        self.client.get("/api/user/profile", headers=auth_headers)

内容的提问来源于stack exchange,提问作者Sudip Neupane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 02:46:00