概述
locust是一個用python寫的可分布式部署鹅髓、模擬大量用戶同時請求你的web系統(tǒng)或其他系統(tǒng)從而進(jìn)行壓力測試的框架。locust搀捷,中文蝗蟲,蝗蟲過境多望,寸草不生嫩舟。估計(jì)作者也是這個意思。
對于壓力測試的要點(diǎn)怀偷,引用一位網(wǎng)友的觀點(diǎn):
服務(wù)端性能測試工具最核心的部分是壓力發(fā)生器家厌,而壓力發(fā)生器的核心要點(diǎn)有兩個,一是真實(shí)模擬用戶操作枢纠,二是模擬有效并發(fā)
那locust是怎么做到這兩點(diǎn)的呢像街?
locust github上的介紹如下:
Locust is an easy-to-use, distributed, user load testing tool. It is intended for load-testing web sites (or other systems) and figuring out how many concurrent users a system can handle.
The idea is that during a test, a swarm of locusts will attack your website. The behavior of each locust (or test user if you will) is defined by you and the swarming process is monitored from a web UI in real-time. This will help you battle test and identify bottlenecks in your code before letting real users in.
Locust is completely event-based, and therefore it's possible to support thousands of concurrent users on a single machine. In contrast to many other event-based apps it doesn't use callbacks. Instead it uses light-weight processes, through gevent. Each locust swarming your site is actually running inside its own process (or greenlet, to be correct). This allows you to write very expressive scenarios in Python without complicating your code with callbacks.
概括一下有以下幾個特點(diǎn):
簡單易用黎棠,只需要用
python
寫腳本代碼,在代碼中去定義用戶行為镰绎,然后以命令行方式啟動腳本代碼即可脓斩。不像有些測試工具需要操作軟件錄制腳本或者配置復(fù)雜的xml文件。嗯畴栖,jmeter
也是很優(yōu)秀的開源工具随静,不然也不會那么受歡迎,但是總覺得有些傻瓜吗讶,也不夠靈活燎猛,??。在模擬有效并發(fā)方面照皆,
locust
的優(yōu)勢在于其摒棄了進(jìn)程和線程重绷,完全基于事件驅(qū)動,使用gevent
提供的非阻塞IO
和coroutine
來實(shí)現(xiàn)網(wǎng)絡(luò)層的并發(fā)請求膜毁。可以分布式部署昭卓,單臺機(jī)器可以模擬數(shù)千用戶,也就是說如果有幾十臺機(jī)器瘟滨,那同時在線用戶數(shù)可以模擬到百萬級候醒,對絕大多數(shù)中小公司來說夠用了。
壓測過程中可以通過一個
web
系統(tǒng)實(shí)時查看系統(tǒng)的表現(xiàn)杂瘸,還有數(shù)據(jù)及圖表結(jié)果倒淫,能導(dǎo)出csv格式的結(jié)果文件。
基本的使用方法
第一步:安裝locust
首先確保你電腦上已經(jīng)安裝了python
開發(fā)環(huán)境败玉,3.6
及以上版本敌土,我目前用的3.7.3
版本。
然后可以按照官網(wǎng)的安裝說明安裝绒怨,不同的系統(tǒng)平臺會有差異纯赎,以MacOS
系統(tǒng)為例,打開terminal
南蹂,先安裝libev
依賴:
brew install libev
然后用pip安裝locust:
pip3 install locust
用locust --help
測試一下:
出現(xiàn)上圖說明安裝成功犬金。
第二步:寫腳本代碼
先上示例代碼,后面會簡單介紹
from locust import HttpLocust,TaskSet,between,task
class WebsiteTasks(TaskSet):
def on_start(self):
self.client.post("/login", {
"username": "test",
"password": "123456"
})
@task(2)
def index(self):
self.client.get("/")
@task(1)
def about(self):
self.client.get("/about/")
def on_stop(self):
print("stop")
class WebSiteUser(HttpLocust):
task_set = WebsiteTasks
host = "http://192.168.31.180"
wait_time = between(1, 2)
在這個示例中六剥,定義了針對http://192.168.31.180
網(wǎng)站的測試場景:先模擬用戶登錄系統(tǒng)晚顷,然后隨機(jī)地訪問首頁(/
)和關(guān)于頁面(/about/
),請求比例為2:1
疗疟;并且该默,在測試過程中,每一個模擬出來的用戶的兩次請求的間隔時間為1~2
秒間的隨機(jī)值策彤。
示例腳本主要包含兩個類栓袖,一個是WebsiteUser
(繼承自HttpLocust
匣摘,而HttpLocust
繼承自Locust
),另一個是WebsiteTasks
(繼承自TaskSet
)裹刮。事實(shí)上音榜,在Locust
的測試腳本中,所有業(yè)務(wù)測試場景都是在Locust
和TaskSet
兩個類的繼承子類中進(jìn)行描述的捧弃。
測試開始后赠叼,每個虛擬用戶(Locust實(shí)例
)的運(yùn)行邏輯都會遵循如下規(guī)律:
- 先執(zhí)行
WebsiteTasks
中的on_start
(只執(zhí)行一次),作為初始化违霞; - 從
WebsiteTasks
中隨機(jī)挑選(如果定義了任務(wù)間的權(quán)重關(guān)系嘴办,那么就是按照權(quán)重關(guān)系隨機(jī)挑選)一個任務(wù)執(zhí)行; - 根據(jù)
Locust
中wait_time
定義的間隔時間范圍(如果TaskSet類
中也定義了wait_time
买鸽,以TaskSet
中的優(yōu)先)涧郊,在時間范圍中隨機(jī)取一個值,休眠等待癞谒; - 重復(fù)
2~3
步驟底燎,直至測試任務(wù)終止刃榨。
第三步:腳本調(diào)試
正式開始前有必要先調(diào)試一下腳本弹砚,看看報不報錯∈嘞#可以先通過下面這種單機(jī)下no-web
的形式調(diào)試桌吃,-f
是指定腳本文件名稱,-c是指并發(fā)用戶數(shù)量苞轿,-r
是啟動虛擬用戶的速率茅诱。
locust -f locustfile.py --no-web -c 1 -r 1
如果沒有報錯,terminal中會打印類似下面的日志信息(因?yàn)槲业膆ost沒開搬卒,所以各個結(jié)果都是0)
第四步:執(zhí)行測試
因?yàn)槲抑蛔隽藛螜C(jī)單進(jìn)程模式的測試瑟俭,所以就不寫單機(jī)多進(jìn)程、多機(jī)多進(jìn)程多的測試方法了契邀,畢竟沒有親身實(shí)踐過的東西咱不能亂說摆寄,以后如果用到,再寫坯门。
另外我就以默認(rèn)的web ui based
的方式做微饥,這樣結(jié)果看起來更直觀。上面第三步no-web
的形式我們也看到了古戴。
在terminal以如下命令啟動locust
欠橘,通常情況下不需額外指定其他參數(shù):
locust -f locustfile.py
Locust
默認(rèn)采用8089
端口啟動web
,如果要使用其它端口现恼,就可以使用如下參數(shù)進(jìn)行指定:
locust -f locustfile.py --port 8089
啟動成功后測試并沒有開始肃续,還需要在下面的web頁面中設(shè)置好幾個參數(shù)黍檩。
如果Locust
運(yùn)行在本機(jī),在瀏覽器中訪問http://127.0.0.1:8089
即可進(jìn)入Locust
的Web管理頁面始锚;如果Locust
運(yùn)行在其它機(jī)器上建炫,那么在瀏覽器中訪問http://locust_machine_ip:8089
即可。
因?yàn)閔ost的地址我已經(jīng)在腳本中寫好了疼蛾,所以會直接顯示在這上面肛跌,如果腳本中沒寫,也可以在這里寫〔煊簦現(xiàn)在只需要設(shè)置前兩個參數(shù):
Number of total users to simulate
: 設(shè)置并發(fā)用戶數(shù)衍慎,對應(yīng)no_web
模式的-c
參數(shù)Hatch rate (users spawned/second)
: 啟動虛擬用戶的速率,對應(yīng)著no_web
模式的-r
參數(shù)
參數(shù)配置完畢后皮钠,點(diǎn)擊【Start swarming】即可開始測試稳捆。
這里我把并發(fā)用戶數(shù)設(shè)為100,生成模擬用戶的速率設(shè)為1麦轰,那開始后乔夯,就會先有一個動態(tài)的用戶數(shù)量爬坡增長的過程,增長的過程中款侵,每個產(chǎn)生的用戶會按照腳本定義的行為去請求網(wǎng)站地址或者接口地址末荐,然后等用戶數(shù)量增長到100后,對系統(tǒng)的請求數(shù)也會維持在一個基本穩(wěn)定的范圍里新锈。
虛擬用戶產(chǎn)生的過程如下:
Locust
的結(jié)果展示十分簡單甲脏,主要就四個指標(biāo):并發(fā)數(shù)
、RPS
妹笆、響應(yīng)時間
块请、異常率
。但對于大多數(shù)場景來說拳缠,這幾個指標(biāo)已經(jīng)足夠了墩新。
測試完成后,可以查看圖表結(jié)果窟坐,也可以下載csv格式的文件海渊。
總結(jié)
本文只是基本的介紹了一下locust,和基礎(chǔ)的使用方法狸涌。高階的用法還需要配合實(shí)戰(zhàn)進(jìn)行研究使用切省。