以类为参数的 Locust 多态性

问题描述 投票:0回答:1

我正在编写 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'
python polymorphism locust
1个回答
0
投票

Locust 正在尝试直接实例化您的 BaseUser(而不仅仅是您的子类)。在该课程上设置

abstract=True
以跳过它。

© www.soinside.com 2019 - 2024. All rights reserved.