Hi弃榨!大家好呀菩收!我是你們努力喵哥!
大家應(yīng)該對(duì) Jmeter 都不陌生吧鲸睛。Jmeter 是現(xiàn)在最常用的性能測(cè)試工具娜饵。對(duì)于測(cè)試人員來(lái)說(shuō),Jmeter 技術(shù)是必不可少的官辈。
但是箱舞,今天喵哥推薦的可不是 Jmeter。因?yàn)閷?duì)于喵哥拳亿,Jmeter 有一些喵哥不太順手的地方晴股。
首先,Jmeter 提供了一個(gè)非常完善的 UI 界面肺魁。使用者需要在 UI 界面上選擇組件來(lái)組建起測(cè)試腳本电湘。對(duì)于很多人來(lái)說(shuō),可能比較直觀万搔。但是胡桨,這種方式使整個(gè)測(cè)試腳本失去了靈活性,只能構(gòu)建一些簡(jiǎn)單的測(cè)試邏輯瞬雹。
再則昧谊,Jmeter 模擬的負(fù)載是線程綁定的,意味著模擬的每個(gè)用戶酗捌,都需要一個(gè)單獨(dú)的線程呢诬。單臺(tái)機(jī)器可模擬的負(fù)載數(shù)有限。對(duì)于我們使用個(gè)人 PC 測(cè)試的話胖缤,是非常不利的尚镰。
因此今天,喵哥要給大家推薦另一款性能測(cè)試神器 Locust哪廓。Locust 的寓意是蝗蟲(chóng)狗唉。Locust 希望工具生成并發(fā)請(qǐng)求就和一大群蝗蟲(chóng)一般,向我們的被測(cè)系統(tǒng)發(fā)起攻擊涡真,以此測(cè)試系統(tǒng)在高并發(fā)壓力下是否能正常運(yùn)轉(zhuǎn)分俯。
再來(lái)嚴(yán)肅的介紹下。Locust 是一款易于使用的分布式負(fù)載測(cè)試工具哆料。其完全基于事件機(jī)制缸剪,即一個(gè) Locust 節(jié)點(diǎn)也可以在一個(gè)進(jìn)程中支持?jǐn)?shù)千并發(fā)用戶。不使用回調(diào)东亦,通過(guò) gevent 使用輕量級(jí)過(guò)程(即在自己的進(jìn)程內(nèi)運(yùn)行)杏节。
特性
用 Python 編寫(xiě)用戶測(cè)試方案
不需要笨拙的UI或龐大的XML,只需編寫(xiě)代碼即可》苡妫基于協(xié)程而不是回調(diào)镊逝,您的代碼邏輯和行為類似于正常的 Python代碼。
分布式和可擴(kuò)展-支持?jǐn)?shù)十萬(wàn)用戶
Locust 支持在多臺(tái)計(jì)算機(jī)上分布的運(yùn)行負(fù)載測(cè)試卒稳。由于基于事件蹋半,因此即使一個(gè)蝗蟲(chóng)節(jié)點(diǎn)也可以在單個(gè)過(guò)程中處理數(shù)千個(gè)用戶。其背后的部分原因是充坑,即使您模擬了這么多用戶减江,也并非所有人都在積極使用您的系統(tǒng)。每秒請(qǐng)求數(shù)不等于在線用戶數(shù)捻爷。
基于 Web 的 UI
Locust 具有簡(jiǎn)潔的 HTML + JS辈灼,可實(shí)時(shí)顯示所有相關(guān)的測(cè)試詳細(xì)信息。而且由于 UI 是基于 Web 的也榄,因此它是跨平臺(tái)的并且易于擴(kuò)展巡莹。
可以測(cè)試任何系統(tǒng)
即使 Locust 是面向Web的,它也可以用于測(cè)試幾乎所有系統(tǒng)甜紫。只需編寫(xiě)一個(gè)您想要測(cè)試的客戶端并將其與用戶一起使用降宅!超級(jí)容易!
可入侵的
蝗蟲(chóng)非常小囚霸,非常容易入侵腰根,我們打算保持這種狀態(tài)。事件 I / O 和協(xié)程的所有繁重工作都委托給gevent拓型。替代測(cè)試工具的脆弱性是誕生 Locust 的原因额嘿。
安裝
支持的python版本:2.7、3.4劣挫、3.5册养、3.6。
首先升級(jí)pip压固,不然可能會(huì)報(bào)錯(cuò)
pip install --upgrade pip
然后安裝Locust
pip install Locust
安裝完成
如果打算運(yùn)行Locust 分布在多個(gè)進(jìn)程/機(jī)器球拦,需要安裝 pyzmq。
通過(guò)pip命令安裝帐我。
pip install pyzmq
使用
在Locust中坎炼,您可以使用Python代碼定義用戶行為。然后焚刚,您可以使用該locust命令和(可選)其Web界面在收集請(qǐng)求統(tǒng)計(jì)信息時(shí)生成并模擬其中的許多用戶。
locustfile.py示例
import random
from locust import HttpUser, task, between
class QuickstartUser(HttpUser):
wait_time = between(5, 9)
@task
def index_page(self):
self.client.get("/hello")
self.client.get("/world")
@task(3)
def view_item(self):
item_id = random.randint(1, 10000)
self.client.get(f"/item?id={item_id}", name="/item")
def on_start(self):
self.client.post("/login", {"username":"foo", "password":"bar"})
讓我們分解一下扇调。
import random
from locust import HttpUser, task, between
蝗蟲(chóng)文件只是普通的Python模塊矿咕,它可以從其他文件或包中導(dǎo)入代碼。
class?QuickstartUser(HttpUser)
在這里,我們?yōu)橐M的用戶定義一個(gè)類碳柱。它繼承自 HttpUser該client屬性捡絮,從而為每個(gè)用戶提供一個(gè)屬性,該屬性是的一個(gè)實(shí)例HttpSession莲镣,可用于向要加載測(cè)試的目標(biāo)系統(tǒng)發(fā)出HTTP請(qǐng)求福稳。當(dāng)測(cè)試開(kāi)始時(shí),蝗蟲(chóng)將為它模擬的每個(gè)用戶創(chuàng)建一個(gè)此類的實(shí)例瑞侮,并且這些用戶中的每個(gè)將開(kāi)始在自己的綠色gevent線程中運(yùn)行的圆。
wait_time = between(5, 9)
我們的類定義了一個(gè)wait_time函數(shù),該函數(shù)將使模擬用戶在每個(gè)任務(wù)執(zhí)行后等待5到9秒半火。有關(guān)更多信息越妈,請(qǐng)參見(jiàn)wait_time屬性。
@task
def index_page(self):
self.client.get("/hello")
self.client.get("/world")
@task(3)
def view_item(self):
...
我們還通過(guò)用修飾兩個(gè)方法來(lái)聲明了兩個(gè)任務(wù)@task钮糖,其中一個(gè)具有較高的權(quán)重(3)梅掠。當(dāng)這種類型的用戶運(yùn)行時(shí),它將選擇一個(gè)index_page或一個(gè)(view_item有三倍的選擇機(jī)會(huì))view_item調(diào)用該方法店归,然后統(tǒng)一選擇一個(gè)介于5到9之間的持續(xù)時(shí)間阎抒,并在該持續(xù)時(shí)間內(nèi)休眠。等待時(shí)間過(guò)后消痛,它將選擇一個(gè)新任務(wù)并繼續(xù)重復(fù)執(zhí)行且叁。
@task(3)
def view_item(self):
item_id = random.randint(1, 10000)
self.client.get(f"/item?id={item_id}", name="/item")
在此view_item任務(wù)中,我們通過(guò)使用查詢參數(shù)來(lái)加載動(dòng)態(tài)URL肄满,該查詢參數(shù)是一個(gè)從1到10000之間隨機(jī)選擇的數(shù)字谴古。為了不在Locust的統(tǒng)計(jì)信息中獲得10k個(gè)單獨(dú)的條目-由于統(tǒng)計(jì)信息是按URL分組的,因此我們使用名稱參數(shù)將所有這些請(qǐng)求分組到一個(gè)名為的條目下"/item"稠歉。
請(qǐng)注意掰担,只有用修飾的方法@task會(huì)被調(diào)用,因此您可以根據(jù)自己的喜好定義自己的內(nèi)部幫助器方法怒炸。
def on_start(self):
此外带饱,我們還聲明了on_start方法。每個(gè)模擬用戶在啟動(dòng)時(shí)都會(huì)調(diào)用具有該名稱的方法阅羹。有關(guān)更多信息勺疼,請(qǐng)參見(jiàn)on_start和on_stop方法。
蝗蟲(chóng)開(kāi)始
將上面的代碼放在當(dāng)前目錄中名為locustfile.py的文件中捏鱼,然后運(yùn)行:
$ locust
如果您的蝗蟲(chóng)文件位于其他位置执庐,則可以使用-f。
$ locust -f locust_files/my_locust_file.py
要查看所有可用選項(xiàng)导梆,請(qǐng)輸入或檢查配置locust --help轨淌。
蝗蟲(chóng)的網(wǎng)絡(luò)界面
使用上述命令行之一啟動(dòng)Locust后迂烁,應(yīng)該打開(kāi)瀏覽器并將其指向http://127.0.0.1:8089。然后递鹉,您應(yīng)該會(huì)收到類似以下內(nèi)容的問(wèn)候:
填寫(xiě)內(nèi)容并開(kāi)始C瞬健(請(qǐng)注意,如果您不更改蝗蟲(chóng)文件以匹配目標(biāo)系統(tǒng)躏结,則大多數(shù)情況下會(huì)收到錯(cuò)誤響應(yīng))
更多的選擇
要運(yùn)行分布在多個(gè)Python進(jìn)程或計(jì)算機(jī)上的Locust却盘,可以使用--master命令行參數(shù)啟動(dòng)單個(gè)Locust主進(jìn)程,然后使用--worker命令行參數(shù)啟動(dòng)任意數(shù)量的Locust worker進(jìn)程媳拴。有關(guān)更多信息黄橘,請(qǐng)參見(jiàn)運(yùn)行蝗蟲(chóng)。
要直接開(kāi)始測(cè)試而不使用Web界面禀挫,請(qǐng)使用--headless旬陡。
也可以通過(guò)環(huán)境變量或在 配置文件中設(shè)置參數(shù)。
最后
Locust 也有其自身的局限性语婴。目前其本身對(duì)測(cè)試過(guò)程的監(jiān)控和測(cè)試結(jié)果展示描孟,不如 jmeter 全面和詳細(xì),需要進(jìn)行二次開(kāi)發(fā)才能滿足需求越來(lái)越復(fù)雜的性能測(cè)試需要砰左。
Locust 和 Jmeter 怎么選擇那匿醒?如果你懂代碼,強(qiáng)力建議你使用 Locust缠导。反之廉羔,最好還是使用 Jmeter。
Locust 的作者是 Locust.io 團(tuán)隊(duì)僻造,共有149位貢獻(xiàn)者憋他。Locust 已經(jīng)開(kāi)源并維護(hù)了10年,在 Github 上收獲了 13.3k Star髓削。Locust 也算是比較知名的開(kāi)源項(xiàng)目了竹挡,其用戶包含微軟、亞馬遜立膛、Google等知名互聯(lián)網(wǎng)企業(yè)揪罕。
項(xiàng)目地址:https://github.com/locustio/locust
在線官網(wǎng):https://locust.io/