我正在编写 Locust 脚本并想要扩展一个基类。一个子类与另一个子类之间有两个不同的值(
dto_class
和 api_suffix
)。其他的都是共享的
locust_base.py
(基类):
### locust_base.py ###
from locust import HttpUser, between, task
## other imports ##
class BaseUser(HttpUser):
"""
do some stuff
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.dto_class = kwargs.pop('dto_class')
self.api_suffix: str = kwargs.pop('api_suffix')
"""
set other stuff
"""
子类(例如
locust_specific_dto.py
)看起来像:
"""
locust_specific_dto.py
"""
from locust_base import BaseUser
class SpecificDtoUser(BaseUser):
def __init__(self, *args, **kwargs):
super(SpecificDtoUser, self).__init__(dto_class=SpecificDto, api_suffix="specificEndpoint", *args, **kwargs)
但是,运行
locust -f locust_specific_dto.py
时,会输出以下错误:
KeyError: 'dto_class'
2024-05-09T18:09:14Z <Greenlet at 0x21e4d99d580: <lambda>> failed with KeyError
[2024-05-09 14:09:14,811] WSAMZN-SPLR8QE1/CRITICAL/locust.runners: Unhandled exception in greenlet: <Greenlet at 0x21e4d99d580: <lambda>>
Traceback (most recent call last):
File "src\\gevent\\greenlet.py", line 908, in gevent._gevent_cgreenlet.Greenlet.run
File "{REDACTED}\AppData\Roaming\Python\Python311\site-packages\locust\runners.py", line 553, in <lambda>
lambda: self._start(user_count, spawn_rate, wait=wait, user_classes=user_classes)
^^^^^^^^^^^^^^^^^
File "{REDACTED}\AppData\Roaming\Python\Python311\site-packages\locust\runners.py", line 524, in _start
self.spawn_users(user_classes_spawn_count, wait)
^^^^^^^^^^^^^^^^^
File "{REDACTED}\AppData\Roaming\Python\Python311\site-packages\locust\runners.py", line 238, in spawn_users
new_users += spawn(user_class, spawn_count)
^^^^^^^^^^^^^^^^^
File "{REDACTED}\AppData\Roaming\Python\Python311\site-packages\locust\runners.py", line 227, in spawn
new_user = self.user_classes_by_name[user_class](self.environment)
^^^^^^^^^^^^^^^^^
File "{REDACTED}\Documents\dev\{REDACTED}\locust_base.py", line 23, in __init__
self.dto_class = kwargs.pop('dto_class')
^^^^^^^^^^^^^^^^^
KeyError: 'dto_class'
Locust 正在尝试直接实例化您的 BaseUser(而不仅仅是您的子类)。在该课程上设置
abstract=True
以跳过它。