使用Locust進(jìn)行壓力測(cè)試(二)復(fù)雜場(chǎng)景

最近一直在使用Locust進(jìn)行壓力測(cè)試乖杠,因此想總結(jié)一下學(xué)習(xí)和實(shí)踐的一些成果币狠。Locust官方文檔

版本:
python: 3.*
locust: 0.9.0

1.不同類(lèi)型的模擬用戶(hù)
考慮一種測(cè)試場(chǎng)景:如果我們想測(cè)試一款游戲近哟,需要并發(fā)100個(gè)人,并且使其中10個(gè)人在大廳閑逛景醇,另外90個(gè)人玩比賽闲坎,用locust框架應(yīng)該怎么實(shí)現(xiàn)呢?框架的命令行有提示locust [options] [LocustClass [LocustClass2 ...]]
當(dāng)我們使用框架運(yùn)行一個(gè)測(cè)試腳本時(shí)蟆湖,如果腳本中只有一個(gè)Locust類(lèi)故爵,則框架會(huì)以這個(gè)類(lèi)作為模擬用戶(hù)的模板;如果該腳本中不止一個(gè)Locust類(lèi)隅津,則需要指定類(lèi)名诬垂;如果需要模擬多種類(lèi)型的用戶(hù),則可以指定多個(gè)類(lèi)名伦仍,框架會(huì)根據(jù)每個(gè)Locust類(lèi)的權(quán)重分配模擬用戶(hù)的比例(默認(rèn)權(quán)重為10)结窘。
一個(gè)簡(jiǎn)單示例如下:

from locust import TaskSet, HttpLocust, task, TaskSequence, seq_task, InterruptTaskSet


class HangOutTaskSet(TaskSet):

    @task
    def hang_out(self):
        print("the player is hanging out")


class PlayGameTaskSet(TaskSet):

    @task
    def play(self):
        print("the player is playing game")


class PlayerOwn(HttpLocust):
    weight = 10
    task_set = HangOutTaskSet
    host = "http://www.baidu.com"
    min_wait = 10000
    max_wait = 10000


class PlayerTwo(HttpLocust):
    weight = 90
    task_set = PlayGameTaskSet
    host = "http://www.baidu.com"
    min_wait = 10000
    max_wait = 10000

命令行運(yùn)行:locust -f ***.py PlayerOwn PlayerTwo
如果并發(fā)10人,就會(huì)有1人在閑逛充蓝,9人在玩游戲了

多種模擬用戶(hù)運(yùn)行示例

2.TaskSet的tasks屬性
從(一)我們知道了一種定義任務(wù)的方式隧枫,就是在TaskSet類(lèi)中定義一個(gè)方法喉磁,并標(biāo)注其為@task;另一個(gè)定義任務(wù)的方式就是使用TaskSet的tasks屬性官脓,這個(gè)屬性值可以是數(shù)組或字典协怒,其中表示的任務(wù)可以是一個(gè)函數(shù),也可以是另一個(gè)TaskSet确买。
如果使用數(shù)組斤讥,其元素可以是元組(callable, int),int值即為該任務(wù)的權(quán)重湾趾。

  1. 函數(shù)
    示例中的tasks = [(play_one, 5), play_two]tasks = {play_one: 5, play_two: 1}是完全等價(jià)的
    tasks中的函數(shù)和有注解@task的函數(shù)有同等的地位芭商,都是這個(gè)TaskSet的一個(gè)基本單位。
# 函數(shù)需有一個(gè)參數(shù)表示self
def play_one(self):
    print("play_one")


def play_two(self):
    print("play_two")


class PlayGameTaskSet(TaskSet):
    tasks = [(play_one, 5), play_two]

    @task
    def play(self):
        print("the player is playing game")


class PlayerTwo(HttpLocust):
    weight = 90
    task_set = PlayGameTaskSet
    host = "http://www.baidu.com"
    min_wait = 100
    max_wait = 100
  1. 嵌套TaskSet
    tasks屬性的元素也可以是另一個(gè)TaskSet搀缠,這種做法就會(huì)形成嵌套的子任務(wù)铛楣。
    例如:我們測(cè)試一款游戲,需要每一個(gè)用戶(hù)在大廳閑逛的時(shí)候艺普,有1/10的概率進(jìn)入游戲比賽進(jìn)行另外的操作簸州,比賽結(jié)束退出后繼續(xù)閑逛,示例如下:
class PlayGameTaskSet(TaskSet):
    tasks = [play_one, play_two]

    @task(5)
    def play_game(self):
        print("the player is playing game")

    @task
    def end_game(self):
        print("game end")
        self.interrupt()


class HangOutTaskSet(TaskSet):
    tasks = {PlayGameTaskSet: 1}

    @task(9)
    def hang_out(self):
        print("the player is hanging out")

當(dāng)進(jìn)入嵌套的任務(wù)集執(zhí)行任務(wù)后歧譬,會(huì)根據(jù)嵌套任務(wù)集的任務(wù)權(quán)重執(zhí)行任務(wù)岸浑,除非調(diào)用self.interrupt()或拋出中斷異常raise InterruptTaskSet否則將一直在子任務(wù)集中執(zhí)行下去

3.內(nèi)部類(lèi)
還有一種實(shí)現(xiàn)嵌套子任務(wù)的方式是使用內(nèi)部類(lèi),如上訴示例瑰步,等同于:

class HangOutTaskSet(TaskSet):
    
    @task(9)
    def hang_out(self):
        print("the player is hanging out")

    @task
    class PlayGameTaskSet(TaskSet):
        tasks = [play_one, play_two]

        @task(5)
        def play_game(self):
            print("the player is playing game")

        @task
        def end_game(self):
            print("game end")
            self.interrupt()

4.類(lèi)的繼承
如果一個(gè)TaskSet的父類(lèi)是另一個(gè)TaskSet矢洲,那么父類(lèi)的所有任務(wù)會(huì)同樣的成為子類(lèi)的任務(wù)。

5.總結(jié)
在(一)中介紹了框架的幾個(gè)角色缩焦,Locust類(lèi)是創(chuàng)建模擬用戶(hù)的模板读虏,所以如果我們要使用不同的角色進(jìn)行測(cè)試時(shí),就需要給框架提供不同的Locust類(lèi)袁滥。TaskSet類(lèi)是模擬需要執(zhí)行的任務(wù)集盖桥,我覺(jué)得可以這么理解,這是一個(gè)任務(wù)的池子题翻,里面的每個(gè)單位都是一個(gè)任務(wù)揩徊,這個(gè)任務(wù)可以是函數(shù)也可以是另一個(gè)TaskSet,這個(gè)任務(wù)的定義方式有幾個(gè)(當(dāng)前TaskSet通過(guò)@task定義嵌赠,繼承父類(lèi)的任務(wù)靴拱,tasks屬性中一個(gè)元素),但它們都是同等地位的猾普,執(zhí)行的概率與它們的權(quán)重相同,每一次模擬用戶(hù)都會(huì)從這個(gè)池子里挑選任務(wù)進(jìn)行執(zhí)行(直到stop_timeout或頁(yè)面點(diǎn)擊Stop)本谜。當(dāng)挑選到一個(gè)類(lèi)型為T(mén)askSet的任務(wù)執(zhí)行時(shí)初家,就進(jìn)入了嵌套的子任務(wù)當(dāng)中,相當(dāng)于到了子任務(wù)的池子里開(kāi)始挑選任務(wù)執(zhí)行(直到調(diào)用self.interrupt()或拋出中斷異常raise InterruptTaskSet)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末溜在,一起剝皮案震驚了整個(gè)濱河市陌知,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掖肋,老刑警劉巖仆葡,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異志笼,居然都是意外死亡沿盅,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)纫溃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)腰涧,“玉大人,你說(shuō)我怎么就攤上這事紊浩〗颜。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵坊谁,是天一觀的道長(zhǎng)费彼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)口芍,這世上最難降的妖魔是什么箍铲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮阶界,結(jié)果婚禮上虹钮,老公的妹妹穿的比我還像新娘。我一直安慰自己膘融,他們只是感情好芙粱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著氧映,像睡著了一般春畔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岛都,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天律姨,我揣著相機(jī)與錄音,去河邊找鬼臼疫。 笑死择份,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的烫堤。 我是一名探鬼主播荣赶,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼凤价,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了拔创?” 一聲冷哼從身側(cè)響起利诺,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎剩燥,沒(méi)想到半個(gè)月后慢逾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡灭红,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年侣滩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片比伏。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胜卤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赁项,到底是詐尸還是另有隱情葛躏,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布悠菜,位于F島的核電站舰攒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏悔醋。R本人自食惡果不足惜摩窃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芬骄。 院中可真熱鬧猾愿,春花似錦、人聲如沸账阻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)淘太。三九已至姻僧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蒲牧,已是汗流浹背撇贺。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冰抢,地道東北人松嘶。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像挎扰,于是被迫代替她去往敵國(guó)和親翠订。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缓升,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • Locust文件就是一般的Python文件。唯一的需求就是它至少需要一個(gè)繼承于Locust的類(lèi). Locust類(lèi) ...
    Yuan_Jie閱讀 4,028評(píng)論 0 7
  • Locust的介紹 Locust是一個(gè)python的性能測(cè)試工具蕴轨,你可以通過(guò)寫(xiě)python腳本的方式來(lái)對(duì)web接口...
    佑___閱讀 2,109評(píng)論 0 6
  • 官方文檔https://docs.locust.io/en/latest/writing-a-locustfile...
    心悅飛飛閱讀 1,027評(píng)論 0 1
  • Locust是什么? Locust 是一個(gè)開(kāi)源負(fù)載測(cè)試工具骇吭。使用 Python 代碼定義用戶(hù)行為橙弱,也可以仿真百萬(wàn)個(gè)...
    zychen143閱讀 7,124評(píng)論 1 2
  • 我是特別普通甚至有點(diǎn)自卑的女生,我和所有女生一樣燥狰,向往美好的愛(ài)情棘脐。追求愛(ài)情的道路上做過(guò)很多錯(cuò)事,也曾把友情當(dāng)成愛(ài)情...
    張沂恩閱讀 440評(píng)論 0 0