Locust运行测试报错:__init__()缺少必填位置参数'ecu_model_id'
问题根因
报错触发在你第一次实例化EcuModelApi的代码行EcuModelApi(self.client),原因是EcuModelApi类的__init__构造函数要求必须传入2个位置参数,第二个参数为ecu_model_id,你当前只传了第一个self.client参数,不符合初始化要求。
你提到其他用例不需要传这个参数,大概率是两种情况:
- 其他用例使用的是旧版本的
EcuModelApi,当时ecu_model_id是带默认值的可选参数,后续类定义被修改成了必填参数 - 其他用例实例化
EcuModelApi的场景已经提前拿到了ecu_model_id,只是你没注意到传参逻辑
解决方案
- 方案一:修改
EcuModelApi类定义,将ecu_model_id改为可选参数
调整EcuModelApi的构造函数,给ecu_model_id设置默认值None即可兼容你当前的调用逻辑:
class EcuModelApi: # 给ecu_model_id设置默认值,改为可选参数 def __init__(self, client, ecu_model_id=None): self.client = client self.ecu_model_id = ecu_model_id # 其余类方法保持不变
- 方案二:不修改依赖类源码,单独发起请求获取
ecu_model_id
如果你没有权限修改apicall.ecu.EcuModelApi的源码,可以直接用Locust的self.client直接调用查询ECU型号的接口,拿到ID后再实例化EcuModelApi:
def on_start(self): super().on_start() # 替换为你实际的查询接口地址、请求方式和参数解析逻辑 resp = self.client.get(f"/api/ecu/model?name={ECU_NAME}") self.ecu_model_id = resp.json()["data"]["ecu_model_id"] self.ecu_api = EcuModelApi(self.client, self.ecu_model_id)
其他注意事项
你当前的测试代码中使用了threading.Lock(),但没有导入threading模块,后续运行时会触发NameError,需要在代码开头补上import threading。
内容的提问来源于stack exchange,提问作者Beti
相关产品推荐
相关产品推荐

