一個(gè)更好用的性能測(cè)試框架

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然后安裝Locustpip 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 randomfrom locust import HttpUser, task, betweenclass 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 randomfrom 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屬性。

  • @taskdef 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/


  • ?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
    • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宝泵,隨后出現(xiàn)的幾起案子好啰,更是在濱河造成了極大的恐慌,老刑警劉巖儿奶,帶你破解...
      沈念sama閱讀 212,599評(píng)論 6 492
    • 序言:濱河連續(xù)發(fā)生了三起死亡事件框往,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡闯捎,警方通過(guò)查閱死者的電腦和手機(jī)椰弊,發(fā)現(xiàn)死者居然都...
      沈念sama閱讀 90,629評(píng)論 3 385
    • 文/潘曉璐 我一進(jìn)店門(mén)嘁酿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人男应,你說(shuō)我怎么就攤上這事∮樽校” “怎么了沐飘?”我有些...
      開(kāi)封第一講書(shū)人閱讀 158,084評(píng)論 0 348
    • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)牲迫。 經(jīng)常有香客問(wèn)我耐朴,道長(zhǎng),這世上最難降的妖魔是什么盹憎? 我笑而不...
      開(kāi)封第一講書(shū)人閱讀 56,708評(píng)論 1 284
    • 正文 為了忘掉前任筛峭,我火速辦了婚禮,結(jié)果婚禮上陪每,老公的妹妹穿的比我還像新娘影晓。我一直安慰自己,他們只是感情好檩禾,可當(dāng)我...
      茶點(diǎn)故事閱讀 65,813評(píng)論 6 386
    • 文/花漫 我一把揭開(kāi)白布挂签。 她就那樣靜靜地躺著,像睡著了一般盼产。 火紅的嫁衣襯著肌膚如雪饵婆。 梳的紋絲不亂的頭發(fā)上,一...
      開(kāi)封第一講書(shū)人閱讀 50,021評(píng)論 1 291
    • 那天戏售,我揣著相機(jī)與錄音侨核,去河邊找鬼。 笑死灌灾,一個(gè)胖子當(dāng)著我的面吹牛搓译,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播紧卒,決...
      沈念sama閱讀 39,120評(píng)論 3 410
    • 文/蒼蘭香墨 我猛地睜開(kāi)眼侥衬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了跑芳?” 一聲冷哼從身側(cè)響起轴总,我...
      開(kāi)封第一講書(shū)人閱讀 37,866評(píng)論 0 268
    • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎博个,沒(méi)想到半個(gè)月后怀樟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
      沈念sama閱讀 44,308評(píng)論 1 303
    • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盆佣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
      茶點(diǎn)故事閱讀 36,633評(píng)論 2 327
    • 正文 我和宋清朗相戀三年往堡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了械荷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
      茶點(diǎn)故事閱讀 38,768評(píng)論 1 341
    • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡虑灰,死狀恐怖吨瞎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情穆咐,我是刑警寧澤颤诀,帶...
      沈念sama閱讀 34,461評(píng)論 4 333
    • 正文 年R本政府宣布,位于F島的核電站对湃,受9級(jí)特大地震影響崖叫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拍柒,卻給世界環(huán)境...
      茶點(diǎn)故事閱讀 40,094評(píng)論 3 317
    • 文/蒙蒙 一心傀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拆讯,春花似錦脂男、人聲如沸。這莊子的主人今日做“春日...
      開(kāi)封第一講書(shū)人閱讀 30,850評(píng)論 0 21
    • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至陕贮,卻和暖如春堕油,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肮之。 一陣腳步聲響...
      開(kāi)封第一講書(shū)人閱讀 32,082評(píng)論 1 267
    • 我被黑心中介騙來(lái)泰國(guó)打工掉缺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人戈擒。 一個(gè)月前我還...
      沈念sama閱讀 46,571評(píng)論 2 362
    • 正文 我出身青樓眶明,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親筐高。 傳聞我的和親對(duì)象是個(gè)殘疾皇子搜囱,可洞房花燭夜當(dāng)晚...
      茶點(diǎn)故事閱讀 43,666評(píng)論 2 350