LocustIO调用所有POST API均返回500内部服务器错误问题
Locust POST请求返回500错误的坑与解决
最近用Locust做负载测试时碰到个头疼的问题:所有通过Locust调用的POST接口一律返回Internal Server Error - 500,但一模一样的接口在JMeter里跑却完全正常。折腾了好一阵才发现,居然是Locust的请求格式没设置对,甚至导致请求末尾莫名多了个撇号!
先给大家看看我当时的测试代码:
from locust import HttpLocust, TaskSet, task class justTestApi(TaskSet): @task(1) def accountInquiry(self): self.client.post("/users", { "id": 1, "name": "Leanne Graham", "username": "Bret" })
问题根源其实很好理解:当你直接把字典作为第二个参数传给self.client.post时,Locust默认会把它当成form-data格式的请求体发送,但很多后端接口是期望接收JSON格式的。后端解析不了这种格式的请求,自然就返回500错误了,你看到的末尾撇号应该就是格式不兼容导致的解析异常表现。
解决起来也很简单,两种方法任选其一:
方法一:直接使用json参数
Locust的post方法支持直接传json参数,它会自动帮你设置正确的请求头并序列化数据:
from locust import HttpLocust, TaskSet, task class justTestApi(TaskSet): @task(1) def accountInquiry(self): self.client.post( "/users", json={ "id": 1, "name": "Leanne Graham", "username": "Bret" } )
方法二:手动设置请求头并序列化JSON
如果你需要更灵活地控制请求头,可以手动把字典转成JSON字符串,同时设置Content-Type:
import json from locust import HttpLocust, TaskSet, task class justTestApi(TaskSet): @task(1) def accountInquiry(self): headers = {"Content-Type": "application/json"} payload = { "id": 1, "name": "Leanne Graham", "username": "Bret" } self.client.post("/users", data=json.dumps(payload), headers=headers)
改成这样之后,再跑测试应该就能和JMeter一样正常调用接口啦!
内容的提问来源于stack exchange,提问作者ken4ward
相关产品推荐
相关产品推荐

