【问题标题】:Cannot choose from an empty sequence Locust Error无法从空序列中选择蝗虫错误
【发布时间】:2020-06-02 21:10:25
【问题描述】:

我正在尝试运行 Locust 文件并反复遇到以下错误:

    Traceback (most recent call last):
  File "/Applications/anaconda/lib/python3.6/site-packages/locust/user/task.py", line 280, in run
    self.schedule_task(self.get_next_task())
  File "/Applications/anaconda/lib/python3.6/site-packages/locust/user/task.py", line 408, in get_next_task
    return random.choice(self.user.tasks)
  File "/Applications/anaconda/lib/python3.6/random.py", line 260, in choice
    raise IndexError('Cannot choose from an empty sequence') from None
IndexError: Cannot choose from an empty sequence 

我的 locust 文件如下所示:

import base64

from locust import HttpUser, TaskSet, task
from random import randint, choice


class WebTasks(TaskSet):

    @task
    def load(self):
        base64string = base64.encodebytes(('%s:%s' % ('user', 'password')).encode()).decode().replace('\n', '')

        catalogue = self.client.get("/catalogue").json()
        category_item = choice(catalogue)
        item_id = category_item["id"]

        self.client.get("/")
        self.client.get("/login", headers={"Authorization":"Basic %s" % base64string})
        self.client.get("/category.html")
        self.client.get("/detail.html?id={}".format(item_id))
        self.client.delete("/cart")
        self.client.post("/cart", json={"id": item_id, "quantity": 1})
        self.client.get("/basket.html")
        self.client.post("/orders")

class Web(HttpUser):
    task_set = WebTasks
    min_wait = 0
    max_wait = 0

我相信这个问题通常是由于没有定义任何任务引起的,但我确实在这里定义了一个任务,所以我不确定我为什么会收到这个错误。我在 Mac OS 上运行 Python 3.6.8 和 Locust 1.0.2。

【问题讨论】:

  • 顺便说一句,您没有使用专用的 Conda 环境吗?

标签: python locust


【解决方案1】:

错误消息是针对以下行之一:

category_item = choice(catalogue)
# or
item_id = choice(self.client.get("/catalogue").json())["id"]

所以对catalogue = self.client.get("/catalogue").json() 的调用返回了一个空列表/可迭代。两个“目录获取”都是同一个调用。


这部分没有意义:

catalogue = self.client.get("/catalogue").json()  # 1A
print(catalogue)
category_item = choice(catalogue)                 # 1B
item_id = category_item["id"]

item_id = choice(self.client.get("/catalogue").json())["id"]  #2

您在“1A”中获取目录,然后在“1B”中进行随机选择,然后将其忽略/未使用,然后您再次获得相同的目录并在'#2',但这次您选择项目的"id"。直接跳到第二个。


而且你没有正确创建task_set

class Web(HttpUser):
    task_set = WebTasks  # is just a reference to the WebTasks class

应该是:

class Web(HttpUser):
    task_set = WebTasks()  # to *create an object* of the WebTasks class

【讨论】:

  • 我很抱歉,只是想看看这两种获取目录的方法是否会产生不同的结果,应该只有其中一种实现。问题是,即使没有访问目录(如果我将其注释掉)我仍然会收到错误
  • 你修复了task_set = WebTasks vs task_set = WebTasks() 吗?
  • 在任何情况下,即使在只调用一次 get-catalogue 的编辑函数中,它似乎也返回了一个空集合。所以choice 抛出一个错误,因为它不能从空集合中随机选择,正如我在回答中提到的那样。你之前的print(catalogue) 的输出是什么?如果整个东西太大,请提供一个样本。
  • 正如我所说,当我注释掉所有访问目录的行(以及相应的 item_id)时,我仍然会收到错误消息。我发现如果我将任务移到 Web 类中,一切正常,不知道为什么。
【解决方案2】:

Locust 1.0 有一些变化,所以尝试替换

task_set = WebTasks

tasks = [WebTasks]

或者完全取消 TaskSet 并将您的 @task 声明直接放在用户上。欲了解更多信息,请参阅https://docs.locust.io/en/stable/changelog.html#changelog-1-0

虽然错误消息很糟糕,但我认为我们已经改进了...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-25
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多