目录
1.背景
没啥背景,就是测着玩儿,嘿嘿~~
2.环境
python | 3.7.3 |
locust | 2.14.2 |
3.正文
class CasesLogin(TaskSet):
def on_start(self):
pass
@task(1)
def test_login(self):
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
"Content-Type": "application/json;charset=UTF-8"
}
# POST请求
url = "/api/sys/login"
data = {
"password": "123456", # 密码需要加密,这里省略
"username": "admin"
}
with self.client.post(url, json=data, headers=header, verfiy=False, catch_response=True) as resp: # 这里需要捕获响应,否则locust中无数据显示
if resp.status_code == 200:
resp.success()
else:
resp.failure(f"failed: {resp.text}")
# Get请求
# url = "/api/sys/config"
# with self.client.get(url, headers=header, verfiy=False, catch_response=True) as resp:
def on_stop(self):
pass
class WebsiteUser(HttpUser):
tasks = [CasesLogin] # 2.X中要这样写用例,否则用例执行不到
wait_time = between(3, 6)
host = "http://192.168.0.180:8081"
运行结果示例:
4.“坑”
1)没有了HttpLocust
以前只是粗略了解了大概,没曾想版本差异还蛮大,原来1.x版本中使用的HttpLocust已经替换成了HttpUser。
2)所谓的host到底是什么
开始总没懂,后来发现host是指被测环境,而不是locust所在的测试执行机。这个host可以在这里指定,如图所示:
class WebsiteUser(HttpUser):
tasks = [CasesLogin]
wait_time = between(3, 6)
host = "http://192.168.0.180:8081"
也可以在启动的main()中指定,如下所示:
if __name__ == "__main__":
os.system("locust -f testLocust.py -P 8300 --host=http://192.168.0.180:8081")
还可以在页面指定:
3)“8089”没位置了
如果启动时,出现了类似这样的报错,就说默认的8089端口被某个程序占用着。
- 若想继续使用8089端口,可以这样处理,以Windows下举例:
C:\>netstat -ano | findstr 8089
TCP [::]:8089 [::]:0 LISTENING 9072
C:\>tasklist /fi "pid eq 9072"
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
python.exe 9072 Console 1 51,044 K
C:\>taskkill /pid 9072 /f
成功: 已终止 PID 为 9072 的进程。
- 若想使用其他端口,可以自行指定:
locust -f testLocust.py -P 8300
4)发不出去的请求
遇到一个类似这样的报错:“ Tried to set status on a request that has not yet been made”。不知道确切根因,但采用了这样的解法:
首先,需要使用locust自身的请求。即,self.client.post/get这样的方式。
其次,将请求放在with...as这样的语句块中。
with self.client.post(url, catch_response=True) as resp:
if resp.status_code == 200:
resp.success()
else:
resp.failure("failed")
5)被pytest绊了一下
因为偷懒,在一个pytest工程中随意建了一个测试文件,并且用“test_”命名了文件,于是被自动识别为自动化测试的脚本。运行main方法时,就报如下错误:
if __name__ == "__main__":
os.system("locust -f testLocust.py -P 8300")
解决方案:
别偷懒~~另外起一个python工程好好测试吧。
参考:Empty suite_懒笑翻的博客-CSDN博客_empty suite
6)把header给弄丢了
因为没有写header导致web页面看到的请求结果全是失败
5.参考资料
接口压测之Locust_locust rps_失眠的书的博客-CSDN博客
性能工具之locust工具get与post请求_7DGroup的博客-CSDN博客_locust post
locust 报错:[WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。: (‘‘, 8089)_locust报错_wuyouywe的博客-CSDN博客