首页 > 解决方案 > Locust - 重试某些状态码,但默认处理所有其他状态码

问题描述

如果我的访问令牌过期,我有一个 Locust 任务可能会以 401 告终。在这种情况下,我将更新它,然后重试该任务。这一切都很好(基于this):

@task
def list_claims(self):
    with self.client.get("/api/1.0/claim/", name="LIST claims", headers=self.headers, catch_response=True) as response:
        if response.status_code == 401:
            logging.info("401 - Need to fetch a new access token!") # usually happens when the access tokens expires after an hour
            self.aad_b2c_auth()
            raise RescheduleTaskImmediately() # re-run this task with the newly refreshed token

问题是这似乎吸收了所有其他状态代码,所以任务永远不会显示为失败,即使它,例如,返回 503 等。我认为这是因为catch_response=True?!所以理想情况下,我只想对 401 进行特殊处理,并将其余部分留给默认处理程序(2xx = 成功,4xx/5xx = 失败)。有没有内置的方法来实现这一点?

标签: pythonlocust

解决方案


您应该能够else在 401 检查后添加一条语句并触发请求事件。在测试其他系统时手动触发请求事件的上下文中可以看到一个示例此处记录的 API 。基本上像这样的东西应该可以工作:

else:
    environment.events.request.fire(**response.request_meta)

或者,您可以尝试将请求标记为没有手动结果,并且 Locust 可能会为您执行触发。

else:
    response._manual_result = False

不确定这样做是否在技术上得到支持,因此它可能并不总是正常运行,因此可能需要额外的维护。


推荐阅读