目录
一、Locust优势
在模拟有效并发方面,Locust的优势在于其摒弃了进程和线程,完全基于事件驱动,使用gevent提供的非阻塞IO和coroutine来实现网络层的并发请求,因此即使是单台压力机也能产生数千并发请求数;再加上对分布式运行的支持,理论上来说,Locust能在使用较少压力机的前提下支持极高并发数的测试。
但是locust监控指标太少,后续还得通过Jmeter配合进行定位和调优。
二、Locust脚本编写基本步骤
1、导入类库: from locust import HttpUser, task, TaskSet
2、定义一个测试类UserBehavior,继承TaskSet,用装饰器@task来指定测试任务方法。通过client属性来使用Python requests库的所有方法,包括GET/POST/HEAD/PUT/DELETE/PATCH等,调用方式也与requests完全一致。
3、定义一个客户端类WebSiteUser,继承HttpUser,其中还有几个属性要注意一下:
host:被测系统的host,当在终端中启动locust时没有指定--host参数时可以指定;
tasks(1.0以下是task_set): tasks = [测试类名] ,指向一个TaskSet类的列表,TaskSet类定义了用户的任务信息,该属性为必填;
min_wait/max_wait: 每个用户执行两个任务间隔时间的上下限(毫秒),具体数值在上下限中随机取值,若不指定则默认间隔时间固定为1秒;
4、通过命令行运行脚本:locust -f xxx.py
5、再通过网站访问http://localhost:8089/,设置并发数
6、想要停止运行,需要在命令端,按ctrl+c,网站端点击stop就能停止了。
举例:单任务
# 对登录功能进行单点性能测试(多组测试数据)
# 发送首页请求,通过locust进行性能测试
from locust import HttpUser, task, TaskSet
# 定义测试类:用户行为
class UserBehavior(TaskSet):
# 指定测试任务
@task
def test_login(self):
# 定义登录的测试数据
for i in range(1, 101):
username = "jerry" + str(i)
logindata = {"login_info": username,
"password": "111111"}
# 发送首页请求给服务器 post
self.client.post("/index.php?controller=simple&action=login", data=logindata)
class WebSiteUser(HttpUser)