本文转载自微信公众号「dongfanger」,作者dongfanger。转载本文请联系dongfanger公众号。

Locust是一款Python技术栈的开源| O q H + c X _ b的性能测试\ c * ` 9 X y 7 n工具。Locust直译为蝗虫,寓意着它能产生蝗虫般成千| , f v 8 C _ 2上万的并发用户:

Locust并不小众,从它Github的Star数量就可见一斑:

截止文章写作时,一共15951Star。

Locust生态良好,它已在多家外企(包括世界500强)Q u h 9 H投入使用:

如此看来,Locust是非常值得学习和掌握的一款工具。

Python的魔力在于t o Y y *化繁为简,基于Python的Locust也能给仍然困惑于性能测试Q * \ { \ {的我们带来启发。

Locust特点

  • 以纯Python方k F o $ # p [ [ W式编写用户脚本,提供极大自由度。
  • 用户脚本可以串行方式编写,Locust会通过轻b 4 / D e 3 g量级进程/协程产生并发,无需自己做并发编程。
  • 并发量大,借助于gevent库\ # N U v V # .,Locust能产生成千上万并发请求。
  • 开销小,Locust用户运行时开销很小。
  • 良好的Web UI对性能结果实时监测。
  • 能测任何系统任何协议,} v p f只需要写个client即可。
  • 开放m ? ) X nREST API,尽情发挥。

安装Locust

需要s E IPython版本3.6及以上。

执行pip命令:

  1. $pipinstalllocust

验证安装成功:

  1. $locust-V

安装时会一并安装依赖库:

Installing col– d S E 1 tlected packages: Werkzeug, pywin32, zope.event, greenlet, gevent, geventhD : *ttpclientq / (, itsdangerous, flask, Flask-BasicAuth, ConfigArgParse, pyzmq, psutil, locust

能看出来flask为Locust提供了Web功能。

快速上手

使用Locust一般按照以下步骤进行:

  1. 编写Python用户脚本。
  2. 使用locust命令执行性能测试。
  3. (可选)通过Web界面监测结果。

示例S ` c A代码如下,新建locustfile.py文件:

  1. importtime
  2. fromlocustimportHttpUser,task,between
  3. classQuickstartUser(HttpUser)9 0 3 R q 4 L:
  4. wait_time=b^ i ^ a Fetween(1,2.5)
  5. @task
  6. defhello_world(self):
  7. self.client.get("/hello")
  8. self.client.get("/world")
  9. @task(3)
  10. defview_items(self):
  11. foritem_idinrange(10):
  12. self.client.get(f"/item?id={item_id}"= W e , 3 ) { =,name="/item3 9 G e N N / _ T")
  13. time.sleep(1)
  14. defon_start(self):
  15. self.client.post("/login",json={"username":"foo","password":"bar"})

路径切换到locustfile.py文件所在目录,执行命令:

  1. $locust

也可以通过-f指定某个目录文件:

  1. $) G C {locust-flocust_fi^ 8 ` G ] \les/my_locust_file.py

运行后,打开http://127.0.0.1:8089看到WebQ b N ( K ~ Z a界面:

填写g ! d D \信息后,就能开始压测了。Web界面提供了结果统计5 b ! a I E数据:

和性能指标走势图:

脚本解析

示例脚本解析如下:

  1. #Locust用户脚本就是Python模块
  2. importtime
  3. fromlocustimportHttp3 k $ q \ T 2User,task,between
  4. #类继承自HttpUser
  5. classQuickstartUser(Htx : D & $ P \ &tpUser):
  6. #每个模拟用户等待1~2.5秒
  7. wait_time=between(1,2.5)
  8. #被@task装饰的才会并发执行
  9. @task
  10. defhello_world(, l } e - F # nself):j s z A @ G n
  11. #client属性是HttpSession实例,用来发送HTTP请求
  12. self.client.get("/hello")
  13. self.client.get("/world")
  14. #每个类只会有一个task被选中执行
  15. #3代表weight权重
  16. #权重越大越容易被选中执行
  17. #vi0 [ T / w : bew_items比hello_wolrd多3倍概率被选中执行
  18. @task(3)
  19. defvies b Nw_items(self):
  20. foritem_idinrange(10):
  21. #E h 5 Vname参数作用是把统计结果按6 ^ U _ % * c同一名称进行分组
  22. #这里防止URL参数不同会产生10个不同记录不便于观察
  23. #把10个汇总成1个"/item"记录
  24. self.client.get(f"/item?id={item_id}",name="/item")
  25. time.sleep(1)
  26. #每个模拟用户开始运_ V % | u I c行时都会执行
  27. defb e 6 Y oon_stae T T B A + @ D _rt(self):
  28. self.client.H 3 } b upost("/login",json={"username":"foo","passwordU n }":"bar"})

小结

本文先了解了Locust的背景和生态,它是~ = A U ` I B值得学习的,对于Python技术栈来说更加如此。接着介绍了使用pip命令安装Locust,其中发现顺带安装了flask,LocN s {ust的We& | V ^ q I ! q Kb功能是flask提供的。然后给出5 G R * p了一段示例代码,按照步骤上手Locust。最后对示例代码进行了解析,浅尝辄G * L q G x o | t止。locustfile实际上该怎么写呢?

参考资料:

https://locust.io/

https://docs.locust.io/en/stable/