首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python上的蝗虫:用户界面上没有蝗虫统计显示

Python上的蝗虫:用户界面上没有蝗虫统计显示
EN

Stack Overflow用户
提问于 2021-03-18 16:58:08
回答 1查看 808关注 0票数 0

我对Locust (和Python)很陌生,并且正在尝试加载一个API。我的蝗虫UI显示没有任何统计-没有用户孵化,没有API调用,等等。我需要帮助弄清楚如何让他们显示在UI上,以便我可以得到统计。

这是我的locust.py文件:

代码语言:javascript
复制
from locust import HttpUser, SequentialTaskSet, task, constant

import finops_service.locust_files.finops_fx_load_testing as load_test

class FXTransaction(SequentialTaskSet):
    def __init__(self, parent):
        super().__init__(parent)
        self.comp_data = dict()
        self.rate_lock_response = dict()
        self.transaction_response = dict()
        self.fx_providerID = '57638f08-e938-48d7-accf-325b6728a9ee'
        self.headers = {"Content-Type": "application/json"}

def on_start(self):
    load_test.login(self),

@task
def get_company_data(self):
    # Get company data
    self.comp_data = load_test.get_company_data(self)
    print("Company is: ", self.comp_data['company'])
    print("Vendor is:  ", self.comp_data['vendor'])
    print("Payment Method is:  ", self.comp_data['payment_method'])
    print("Funding Method is:  ", self.comp_data['funding_method'])

# @task
# def rate_lock(self):
    print("Starting rate lock")
    load_test.rate_lock(self)
    print("This is the returned rate lock response:")
    print(self.rate_lock_response)

# @task
# def approve_transaction(self):
#     print("Starting transaction")
#     load_test.approve_transaction(self)
#     print("This is the returned transaction response:")
#     print(self.transaction_response)


class MyUser(HttpUser):
    wait_time = constant(1)
    # weight = 1
    host = "http://localhost:8080/PaymentService/base/"
    tasks = [FXTransaction]

以下是我的职责:

代码语言:javascript
复制
    import json
import random
import uuid

from utils import json_util as json_util

    enter code here

def login(self):
    try:
        with self.client.post(
                "security/login",
                headers={'Content-Type': 'application/json',
                         'Authorization': 'BASIC 0ee89b88-5c4b-4922-b1f9-c1584ab26e7e:12345'},
                name=login,
                timeout=55.6,
                catch_response=True) as response:
            if response.status_code != 200:
                response.failure("Login failed")
            else:
                response.success()
                print("Login succeeded")
            self.headers.update({'if-Match': "{}".format(response.headers["ETag"])})
    except ConnectionRefusedError:
        print("The test could not connect to {}".format("http://localhost:8080/PaymentService/security/login"))
        raise

def get_company_data(self):
    comp_index = random.randrange(0, 9)
    print("Random company data index is:  ", comp_index)
    try:
        body = json.load(open("finops_service/locust_files/load_testing_data.json", 'r'))
        comp_data = body['fx']['multipleCompanies_10']['company_data'][comp_index]
    except ConnectionRefusedError:
        print("The test could not connect to {}".format("http://localhost:8080/PaymentService/security/login"))
        raise
    return comp_data


def rate_lock(self):
    body = json_util.get_json_object(
        "/finops_service/locust_files/rate_lock_load_testing.json",
        'fx'.lower(),
        'valid_multiple_20'.lower()
    )
    body["debtorCompanyProfileId"] = self.comp_data['company']
    i = 0
    # there are 20 rate locks so need to update each request
    while i < 20:
        body["rateRequestPayments"][i]["creditorProfileId"] = self.comp_data['vendor']
        body["rateRequestPayments"][i]["debtorProfileId"] = self.comp_data['company']
        body["rateRequestPayments"][i]["paymentMethodId"] = self.comp_data['payment_method']
        random_float_no = round(random.uniform(1.11, 999.99), 2)
        body['rateRequestPayments'][i]['amount'] = random_float_no
        i += 1
    try:
        print("RIGHT BEFORE RATE LOCK CALL")
        with self.client.post("services/transaction/fx/rate/lock",
                              data=json.dumps(body),
                              headers=self.headers,
                              name="rate lock",
                              timeout=55.6,
                              catch_response=True) as response:
            if "GENERIC_FAILURE" in response.text:
                response.failure("FAIL")
                print("Rate lock call failed")
            else:
                response.success()
                print("rate lock succeeded")
            print("Rate lock response is:.........", response)
            print("Rate lock response TEXT is:.........", response.text)
            self.rate_lock_response = response.text
    except ConnectionRefusedError:
        print("The test could not connect to {}".format(
            "http://localhost:8080/PaymentService/services/transaction/fx/rate/lock"))
        raise

当我运行这个程序时,我可以看到self.client.post("services/transaction/fx/rate/lock"...不管是成功还是失败。但是,在Locust UI中,我显示了0名用户已孵化(控制台显示我已孵化了5)和0项任务。

每次运行时,我都会得到这个错误,它看起来与我的统计数据有关,但我不知道为什么会这样:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/Users/michellegautier/.pyenv/versions/3.7.4/lib/python3.7/site-packages/gevent/pywsgi.py", line 999, in handle_one_response
    self.run_application()
  File "/Users/michellegautier/.pyenv/versions/3.7.4/lib/python3.7/site-packages/gevent/pywsgi.py", line 945, in run_application
    self.result = self.application(self.environ, self.start_response)
  File "/Users/michellegautier/.pyenv/versions/3.7.4/lib/python3.7/site-packages/flask/app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/michellegautier/.pyenv/versions/3.7.4/lib/python3.7/site-packages/flask/app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "/Users/michellegautier/.pyenv/versions/3.7.4/lib/python3.7/site-packages/flask/app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/michellegautier/.pyenv/versions/3.7.4/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/Users/michellegautier/.pyenv/versions/3.7.4/lib/python3.7/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/michellegautier/.pyenv/versions/3.7.4/lib/python3.7/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/michellegautier/.pyenv/versions/3.7.4/lib/python3.7/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/michellegautier/.pyenv/versions/3.7.4/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/Users/michellegautier/.pyenv/versions/3.7.4/lib/python3.7/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/michellegautier/.pyenv/versions/3.7.4/lib/python3.7/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/michellegautier/.pyenv/versions/3.7.4/lib/python3.7/site-packages/locust/web.py", line 319, in wrapper
    return view_func(*args, **kwargs)
  File "/Users/michellegautier/.pyenv/versions/3.7.4/lib/python3.7/site-packages/locust/util/cache.py", line 21, in wrapper
    cache["result"] = func(*args, **kwargs)
  File "/Users/michellegautier/.pyenv/versions/3.7.4/lib/python3.7/site-packages/locust/web.py", line 208, in request_stats
    "safe_name": escape(s.name, quote=False),
  File "/Users/michellegautier/.pyenv/versions/3.7.4/lib/python3.7/html/__init__.py", line 19, in escape
    s = s.replace("&", "&amp;") # Must be done first!
AttributeError: 'function' object has no attribute 'replace'
2021-03-18T16:44:29Z {'REMOTE_ADDR': '::1', 'REMOTE_PORT': '49242', 'HTTP_HOST': 'localhost:8089', (hidden keys: 25)} failed with AttributeError

有人能帮我弄清楚如何让我的数据出现吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-18 19:26:14

数据没有出现在蝗虫是因为你发布的例外。如果您解决了这个问题,并且在代码运行时没有问题,那么您应该可以在Locust UI中看到统计数据。

您的代码有许多问题。

我不确定将代码粘贴到其中是否只是一个问题,但是您的on_start()get_company_data()函数(以及@task装饰器)需要缩进,因此它们是FXTransaction的一部分。

而且,尝试在login()get_company_data()中使用get_company_data()也是行不通的,因为它们不是类的一部分,所以没有self这样的东西。您可能希望将该函数中的self更改为client,然后在从on_start()函数调用它时传入self.client

但你的主要问题可能是:

代码语言:javascript
复制
with self.client.post(
            "security/login",
            headers={'Content-Type': 'application/json',
                     'Authorization': 'BASIC 0ee89b88-5c4b-4922-b1f9-c1584ab26e7e:12345'},
            name=login,
            …

name这里是您要点击的端点(URL)的名称。这应该是一个字符串,但是您要给它函数login。因此,当Locust代码试图用它想要做的name值做一些事情时,希望它是一个字符串,它就会失败,因为它试图在函数上执行这些操作。这就是AttributeError: 'function' object has no attribute 'replace'的意思。

我想如果你修好了所有这些东西,蝗虫就会成功的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66695633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档