You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Locust框架on_start()方法内API请求未执行的问题求助

Locust框架on_start()方法内API请求未执行的问题求助

我现在用Locust做性能测试,在on_start方法里写了一个API调用。这个方法里的print('started')能正常输出,但try块里的请求就是不执行。而且同样的请求放在独立Python脚本里(用requests库)完全没问题。

我的Locust脚本代码

import gevent
from locust import HttpUser, task, between
from locust.env import Environment
from locust.stats import stats_printer, stats_history


class QuickstartUser(HttpUser):
    wait_time = between(1, 5)
    host = 'https://MY_HOST'

    @task
    def hello_world(self):
        self.client.get("/hello")
        self.client.get("/world")

    def on_start(self):
        print('started')
        try:
            res = self.client.post(
                "'https://MY_HOST'/api/auth/logon",
                json={"username": "adminUser1", "password": "12345678"},
                headers={'Content-Type': 'application/json'},
                verify=False)
            print(res.text)
        except Exception as ex:
            print(ex)


# Setup Environment and Runner
env = Environment(user_classes=[QuickstartUser])
runner = env.create_local_runner()

# Start a WebUI instance
web_ui = env.create_web_ui("127.0.0.1", 8089)

# Execute init event handlers (only really needed if you have registered any)
env.events.init.fire(environment=env, runner=runner, web_ui=web_ui)

# Start a greenlet that periodically outputs the current stats
gevent.spawn(stats_printer(env.stats))

# Start a greenlet that saves current stats to history
gevent.spawn(stats_history, env.runner)

# Start the test
runner.start(user_count=1

我试过的操作

  • 用独立Python脚本(requests库)验证过这个API请求是正常工作的
  • 检查过URL、请求体和请求头,确认都是正确的
  • 把这个请求从on_start移到@task装饰的方法里,能正常执行

我的观察结果

  • print('started')能正常显示,说明on_start方法确实被执行了
  • print(res.text)完全没有输出,说明请求要么没发出去,要么没得到响应
  • except块也没捕获到任何异常,连报错信息都没有

我的疑问

  • 为什么on_start里的请求就是不执行呢?
  • 怎么才能让on_start方法里的请求在Locust里正常跑起来?

问题分析与解决方案

兄弟,我一眼就看到你代码里的URL有问题!你写的是"'https://MY_HOST'/api/auth/logon",这里多了一对单引号,导致实际发送的URL变成了带单引号的无效地址——比如'https://MY_HOST'/api/auth/logon,这显然是不对的,Locust的HttpClient在处理这种无效URL的时候,可能因为某种原因没抛出异常,但请求根本发不出去。

给你两个修复方案:

  1. 因为你已经在类里设置了host = 'https://MY_HOST',直接用相对路径就行:
    res = self.client.post(
        "/api/auth/logon",
        json={"username": "adminUser1", "password": "12345678"},
        headers={'Content-Type': 'application/json'},
        verify=False)
    
  2. 如果要写完整URL,去掉多余的单引号:
    res = self.client.post(
        "https://MY_HOST/api/auth/logon",
        json={"username": "adminUser1", "password": "12345678"},
        headers={'Content-Type': 'application/json'},
        verify=False)
    

另外,我注意到你脚本最后一行runner.start(user_count=1没闭合括号,应该改成runner.start(user_count=1),不然脚本会直接报错无法运行,不过你说print('started')能输出,可能是粘贴的时候漏了。

修复URL之后,你再试试,on_start里的请求应该就能正常执行,res.text也能输出了。如果还是有问题,可以给请求加个超时参数timeout=10,看看是不是超时了没抛出异常,不过大概率就是URL的引号问题导致的。

备注:内容来源于stack exchange,提问作者Dana Yeger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:44:33