如何为其他方法封装class方法
How to encapsulate class method for other methods
我想将 'non-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 的继承仍然存在问题 Class。
虽然 Locust 不会直接 运行 您的整个 Locust 文件代码,但它会直接 运行 您标记为 @task
的方法。如果您的方法使用或调用在您的任务之外定义的变量或方法,那应该会像往常一样工作。所以如果你想有一个字典来定义 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'])
我想将 'non-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 的继承仍然存在问题 Class。
虽然 Locust 不会直接 运行 您的整个 Locust 文件代码,但它会直接 运行 您标记为 @task
的方法。如果您的方法使用或调用在您的任务之外定义的变量或方法,那应该会像往常一样工作。所以如果你想有一个字典来定义 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'])