基于python的壓力測試框架locust的基礎(chǔ)使用

概述

locust是一個用python寫的可分布式部署鹅髓、模擬大量用戶同時請求你的web系統(tǒng)或其他系統(tǒng)從而進(jìn)行壓力測試的框架。locust搀捷,中文蝗蟲,蝗蟲過境多望,寸草不生嫩舟。估計(jì)作者也是這個意思。

github開源地址

官網(wǎng)文檔地址

對于壓力測試的要點(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):

  1. 簡單易用黎棠,只需要用python寫腳本代碼,在代碼中去定義用戶行為镰绎,然后以命令行方式啟動腳本代碼即可脓斩。不像有些測試工具需要操作軟件錄制腳本或者配置復(fù)雜的xml文件。嗯畴栖,jmeter也是很優(yōu)秀的開源工具随静,不然也不會那么受歡迎,但是總覺得有些傻瓜吗讶,也不夠靈活燎猛,??。

  2. 在模擬有效并發(fā)方面照皆,locust的優(yōu)勢在于其摒棄了進(jìn)程和線程重绷,完全基于事件驅(qū)動,使用gevent提供的非阻塞IOcoroutine來實(shí)現(xiàn)網(wǎng)絡(luò)層的并發(fā)請求膜毁。

  3. 可以分布式部署昭卓,單臺機(jī)器可以模擬數(shù)千用戶,也就是說如果有幾十臺機(jī)器瘟滨,那同時在線用戶數(shù)可以模擬到百萬級候醒,對絕大多數(shù)中小公司來說夠用了。

  4. 壓測過程中可以通過一個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測試一下:

locust1.png

出現(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ù)測試場景都是在LocustTaskSet兩個類的繼承子類中進(jìn)行描述的捧弃。

測試開始后赠叼,每個虛擬用戶(Locust實(shí)例)的運(yùn)行邏輯都會遵循如下規(guī)律:

  1. 先執(zhí)行WebsiteTasks中的on_start(只執(zhí)行一次),作為初始化违霞;
  2. WebsiteTasks中隨機(jī)挑選(如果定義了任務(wù)間的權(quán)重關(guān)系嘴办,那么就是按照權(quán)重關(guān)系隨機(jī)挑選)一個任務(wù)執(zhí)行;
  3. 根據(jù)Locustwait_time定義的間隔時間范圍(如果TaskSet類中也定義了wait_time买鸽,以TaskSet中的優(yōu)先)涧郊,在時間范圍中隨機(jī)取一個值,休眠等待癞谒;
  4. 重復(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)

locust2.png
第四步:執(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即可。

locust3.png

因?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)生的過程如下:

locust5.gif

Locust的結(jié)果展示十分簡單甲脏,主要就四個指標(biāo):并發(fā)數(shù)RPS妹笆、響應(yīng)時間块请、異常率。但對于大多數(shù)場景來說拳缠,這幾個指標(biāo)已經(jīng)足夠了墩新。

測試完成后,可以查看圖表結(jié)果窟坐,也可以下載csv格式的文件海渊。

locust4.png

總結(jié)

本文只是基本的介紹了一下locust,和基礎(chǔ)的使用方法狸涌。高階的用法還需要配合實(shí)戰(zhàn)進(jìn)行研究使用切省。

參考文章

深入淺出開源性能測試工具 Locust(使用篇)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市帕胆,隨后出現(xiàn)的幾起案子朝捆,更是在濱河造成了極大的恐慌,老刑警劉巖懒豹,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芙盘,死亡現(xiàn)場離奇詭異驯用,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)儒老,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門蝴乔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驮樊,你說我怎么就攤上這事薇正。” “怎么了囚衔?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵挖腰,是天一觀的道長。 經(jīng)常有香客問我练湿,道長猴仑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任肥哎,我火速辦了婚禮辽俗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘篡诽。我一直安慰自己崖飘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布霞捡。 她就那樣靜靜地躺著坐漏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碧信。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天街夭,我揣著相機(jī)與錄音砰碴,去河邊找鬼。 笑死板丽,一個胖子當(dāng)著我的面吹牛呈枉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播埃碱,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼猖辫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了砚殿?” 一聲冷哼從身側(cè)響起啃憎,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎似炎,沒想到半個月后辛萍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悯姊,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年贩毕,在試婚紗的時候發(fā)現(xiàn)自己被綠了悯许。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡辉阶,死狀恐怖先壕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谆甜,我是刑警寧澤启上,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站店印,受9級特大地震影響冈在,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜按摘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一包券、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧炫贤,春花似錦溅固、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至掠河,卻和暖如春亮元,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唠摹。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工爆捞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勾拉。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓煮甥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親藕赞。 傳聞我的和親對象是個殘疾皇子成肘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容