1.6 萬 Star!微軟谷歌都在用 Python 性能測試工具
Locust是一款Python技術(shù)棧的開源的性能測試工具。Locust直譯為蝗蟲,寓意著它能產(chǎn)生蝗蟲般成千上萬的并發(fā)用戶。
Locust并不小眾,從它Github的Star數(shù)量就可見一斑:
鏈接:https://github.com/locustio/locust
截止文章寫作時(shí),一共15951Star。
Locust生態(tài)良好,它已在多家外企(包括世界500強(qiáng))投入使用:
如此看來,Locust是非常值得學(xué)習(xí)和掌握的一款工具。
Python的魔力在于化繁為簡,基于Python的Locust也能給仍然困惑于性能測試的我們帶來啟發(fā)。
Locust特點(diǎn)
- 以純Python方式編寫用戶腳本,提供極大自由度。
- 用戶腳本可以串行方式編寫,Locust會(huì)通過輕量級進(jìn)程/協(xié)程產(chǎn)生并發(fā),無需自己做并發(fā)編程。
- 并發(fā)量大,借助于gevent庫,Locust能產(chǎn)生成千上萬并發(fā)請求。
- 開銷小,Locust用戶運(yùn)行時(shí)開銷很小。
- 良好的Web UI對性能結(jié)果實(shí)時(shí)監(jiān)測。
- 能測任何系統(tǒng)任何協(xié)議,只需要寫個(gè)client即可。
- 開放REST API,盡情發(fā)揮。
安裝Locust
需要Python版本3.6及以上。
執(zhí)行pip命令:
- $ pip install locust
驗(yàn)證安裝成功:
- $ locust -V
安裝時(shí)會(huì)一并安裝依賴庫:
- Installing collected packages: Werkzeug, pywin32, zope.event, greenlet, gevent, geventhttpclient, itsdangerous, flask, Flask-BasicAuth, ConfigArgParse, pyzmq, psutil, locust
能看出來flask為Locust提供了Web功能。
快速上手
使用Locust一般按照以下步驟進(jìn)行:
- 編寫Python用戶腳本。
- 使用locust命令執(zhí)行性能測試。
- (可選)通過Web界面監(jiān)測結(jié)果。
示例代碼如下,新建locustfile.py文件:
- import time
- from locust import HttpUser, task, between
- class QuickstartUser(HttpUser):
- wait_time = between(1, 2.5)
- @task
- def hello_world(self):
- self.client.get("/hello")
- self.client.get("/world")
- @task(3)
- def view_items(self):
- for item_id in range(10):
- self.client.get(f"/item?id={item_id}", name="/item")
- time.sleep(1)
- def on_start(self):
- self.client.post("/login", json={"username":"foo", "password":"bar"})
路徑切換到locustfile.py文件所在目錄,執(zhí)行命令:
- $ locust
也可以通過-f指定某個(gè)目錄文件:
- $ locust -f locust_files/my_locust_file.py
運(yùn)行后,打開http://127.0.0.1:8089看到Web界面:
填寫信息后,就能開始壓測了。Web界面提供了結(jié)果統(tǒng)計(jì)數(shù)據(jù):
和性能指標(biāo)走勢圖:
腳本解析
示例腳本解析如下:
- # Locust用戶腳本就是Python模塊
- import time
- from locust import HttpUser, task, between
- # 類繼承自HttpUser
- class QuickstartUser(HttpUser):
- # 每個(gè)模擬用戶等待1~2.5秒
- wait_time = between(1, 2.5)
- # 被@task裝飾的才會(huì)并發(fā)執(zhí)行
- @task
- def hello_world(self):
- # client屬性是HttpSession實(shí)例,用來發(fā)送HTTP請求
- self.client.get("/hello")
- self.client.get("/world")
- # 每個(gè)類只會(huì)有一個(gè)task被選中執(zhí)行
- # 3代表weight權(quán)重
- # 權(quán)重越大越容易被選中執(zhí)行
- # view_items比hello_wolrd多3倍概率被選中執(zhí)行
- @task(3)
- def view_items(self):
- for item_id in range(10):
- # name參數(shù)作用是把統(tǒng)計(jì)結(jié)果按同一名稱進(jìn)行分組
- # 這里防止URL參數(shù)不同會(huì)產(chǎn)生10個(gè)不同記錄不便于觀察
- # 把10個(gè)匯總成1個(gè)"/item"記錄
- self.client.get(f"/item?id={item_id}", name="/item")
- time.sleep(1)
- # 每個(gè)模擬用戶開始運(yùn)行時(shí)都會(huì)執(zhí)行
- def on_start(self):
- self.client.post("/login", json={"username":"foo", "password":"bar"})
小結(jié)
本文先了解了Locust的背景和生態(tài),它是值得學(xué)習(xí)的,對于Python技術(shù)棧來說更加如此。接著介紹了使用pip命令安裝Locust,其中發(fā)現(xiàn)順帶安裝了flask,Locust的Web功能是flask提供的。
然后給出了一段示例代碼,按照步驟上手Locust。最后對示例代碼進(jìn)行了解析,淺嘗輒止。locustfile實(shí)際上該怎么寫呢?