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的时候,可能因为某种原因没抛出异常,但请求根本发不出去。
给你两个修复方案:
- 因为你已经在类里设置了
host = 'https://MY_HOST',直接用相对路径就行:res = self.client.post( "/api/auth/logon", json={"username": "adminUser1", "password": "12345678"}, headers={'Content-Type': 'application/json'}, verify=False) - 如果要写完整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
相关产品推荐
相关产品推荐

