【问题标题】:How to encapsulate class method for other methods如何为其他方法封装类方法
【发布时间】:2020-10-21 11:32:51
【问题描述】:

我想将“非 GET”方法封装为一个并对其进行参数化。 如何制作?

我认为这可以工作,但我不知道如何正确编写它: URL、NAME、METHOD 会有所不同。

list_of_dicts = [
{url:    ,
method:   
}
]

代码如下:

from locust import HttpUser, task, TaskSet, between, exception, events
import logging
import sys, os
sys.path.append(os.getcwd())
import settings

class MyUser(HttpUser):
    wait_time = between(5, 9)
    host = settings.host
    logins = [elem*3 for elem in settings.alphabetic] + \
        [elem*3 + "1" for elem in settings.alphabetic] + \
        [elem*3 + "2" for elem in settings.alphabetic]

    passwd = 'radio'
    login_pass = [(elem, "radio") for elem in logins]


    def on_start(self):
        if len(MyUser.login_pass) > 0:
            self.user, self.passwd_for_object = MyUser.login_pass.pop()
        self.client.verify = False
        self.login()

    def on_stop(self):
        pass

    def login(self):
        default_headers = {'X-Username': self.user, 'X-Password': MyUser.passwd}
        self.client.request(method="POST", url="login.xhtml", headers=default_headers,
                            name="---ON START---LOGIN")
        logging.info('Login with %s username and %s password', self.user, self.passwd_for_object)

@task
def delete_virtual_meters(self):
    """DELETE will not be performed if Virtual Meter does not exist"""
    default_headers = {'X-Username': self.user, 'X-Password': self.passwd}
    #for number in (3, 4, 5, 6, 7, 8): <- it wokrs
    for number in range(33,166):
        response = self.client.request(method="GET", url="api/virtualmeter/%s" % number,
                                       headers=default_headers, catch_response=True,
                                       name="Check if Virtual Meter %s exists" % number)
        if response.ok and number not in MyUser.deleted_numbers_virtual_meter:
            MyUser.deleted_numbers_virtual_meter[number] = True
            self.client.request(method="DELETE", url="api/virtualmeter/%s" % number,
                                headers=default_headers,
                                name="Delete existing Virtual Meter with ID %s" % number)
        else:
            response.failure(exc="Nothing to DELETE")

@task
def delete_additional_info(self):
    """DELETE will not be performed if Additional Info does not exist"""
    default_headers = {'X-Username': self.user, 'X-Password': self.passwd}
    for number in range(30, 102):
        response = self.client.request(method="GET", url="api/additionalInfo/%s" % number,
                                       headers=default_headers, catch_response=True,
                                       name="Check if Additional Info %s exists" % number)
        if response.ok and number not in MyUser.deleted_number_info:
            try:
                MyUser.deleted_number_info[number] = True
                self.client.request(method="DELETE", url="api/additionalInfo/%s" % number,
                                    headers=default_headers,
                                    name="Delete existing Additional Info with ID %s" % number)
            except AssertionError:
                response.failure(exc="Nothing to DELETE")

还有一件事——MyUser 类的继承仍然存在问题。

【问题讨论】:

  • 你遇到的继承问题是什么?
  • 如您所见 - 我想用字典创建一个列表,其中包含以下三个变量:METHOD、URL、NAME。我不知道怎么做。我的意思是 - 我想要这些变量。在另一个方法中并从它继承到另一个 @task 方法。

标签: python testing locust


【解决方案1】:

虽然 Locust 不会直接运行整个 locust 文件代码,但它会直接运行标记为 @task 的方法。如果您的方法使用或调用在您的任务之外定义的变量或方法,那应该可以正常工作。因此,如果您想要一个 dict 来定义请求的 HTTP 方法和 URL,您可以使用普通的 Python 方式来执行此操作,例如:

from locust import HttpUser, task, between

http_dict = {"method": "GET", "url": "http://127.0.0.1"}

class MyUser(HttpUser):
    wait_time = between(1,3)

    @task
    def use_dict(self):
        self.client.request(method=http_dict['method'], url=http_dict['url'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 2020-12-03
    • 2014-03-12
    • 1970-01-01
    相关资源
    最近更新 更多