locust(四) - HTTP請(qǐng)求的壓力測(cè)試

在前面幾篇文章中襟沮,只介紹了如何創(chuàng)建Locust類身辨、TaskSet類去模擬用戶障簿,本文介紹如何對(duì)提供HTTP接口的系統(tǒng)進(jìn)行壓力測(cè)試馒铃。Locust已經(jīng)有HttpLocust類蟹腾,每個(gè)HttpLocust類的實(shí)例都有一個(gè)client屬性用于構(gòu)造HTTP請(qǐng)求。

HttpLocust類

一個(gè)HttpLocust類的實(shí)例可以表示一組用于HTTP壓力測(cè)試的“用戶”区宇,該用戶的行為由task_set屬性定義娃殖,這些與父類Locust類都一致。

HttpLocust類有個(gè)額外的client屬性议谷,用于建立與保持HTTP請(qǐng)求會(huì)話炉爆。熟悉Python的朋友一般都知道requests庫,HttpLocust類的client正是封裝了該庫,用法基本一致芬首。

當(dāng)你的Locust類繼承自HttpLocust鲫凶,那你指向的TaskSet可以直接使用client屬性發(fā)起HTTP請(qǐng)求,下面是一個(gè)例子衩辟,可以用來對(duì)//about兩個(gè)URL進(jìn)行壓力測(cè)試:

from locust import HttpLocust, TaskSet, task

class MyTaskSet(TaskSet):
    @task(2)
    def index(self):
        self.client.get("/")

    @task(1)
    def about(self):
        self.client.get("/about/")

class MyLocust(HttpLocust):
    task_set = MyTaskSet
    min_wait = 5000
    max_wait = 15000

上面的示例代碼中,每個(gè)模擬用戶在5-15秒的等待間隔會(huì)發(fā)起一次請(qǐng)求波附,task的權(quán)重顯示了對(duì)URL / 的請(qǐng)求會(huì)是 /about 的兩倍艺晴。

有心的讀者會(huì)發(fā)現(xiàn),我們可以在TaskSet中直接使用self.client調(diào)用HttpSession掸屡,而不是self.locust.client封寞。這是因?yàn)闉榱擞脩舴奖悖?code>TaskSet類中的self.client已經(jīng)直接指向self.locust.client

HTTP client基本用法

client屬性中,每個(gè)HttpLocust實(shí)例都有一個(gè)HttpSession實(shí)例仅财。 HttpSession類實(shí)際上是requests.Session的一個(gè)子類狈究,可用于發(fā)出getpost盏求,put抖锥,deletehead碎罚,patchoptions等HTTP請(qǐng)求并報(bào)告給Locust的用于統(tǒng)計(jì)磅废。 HttpSession實(shí)例會(huì)在請(qǐng)求之間保存cookie,以便它可以用來登錄網(wǎng)站荆烈、保持請(qǐng)求會(huì)話拯勉。

下面是一個(gè)簡(jiǎn)單的例子,它向 /about 發(fā)出GET請(qǐng)求(假設(shè)self是TaskSet或HttpLocust類的實(shí)例:

response = self.client.get("/about")
print("Response status code:", response.status_code)
print("Response content:", response.text)

下面是POST請(qǐng)求的例子:

response = self.client.post("/login", {"username":"testuser", "password":"secret"})

人為標(biāo)記成功失敗

默認(rèn)情況下憔购,Locust將HTTP響應(yīng)碼為OK(2xx)的請(qǐng)求標(biāo)記為成功宫峦,其他的就標(biāo)記為失敗∶的瘢可能大多數(shù)時(shí)候這種處理方式就是我們想要的导绷,但是有的時(shí)候就是想測(cè)試返回404的情況呢?或者server在返回錯(cuò)誤時(shí)屎飘,錯(cuò)誤信息在響應(yīng)的消息體中而不體現(xiàn)在響應(yīng)碼诵次,這些情況的處理就需要手動(dòng)控制成功/失敗。

使用catch_response參數(shù)和with枚碗,可以獲取response的內(nèi)容并標(biāo)記失斢庖弧:

with client.get("/", catch_response=True) as response:
    if response.content != b"Success":
        response.failure("Got wrong response")

正如可以將請(qǐng)求OK響碼標(biāo)記為失敗一樣,用catch_response參數(shù)與with語句也可以將請(qǐng)求不為2xx的響應(yīng)碼標(biāo)記為成功:

with client.get("/does_not_exist/", catch_response=True) as response:
    if response.status_code == 404:
        response.success()

設(shè)置檢查點(diǎn)

Locust中設(shè)置檢查點(diǎn)是很簡(jiǎn)單的肮雨,可以直接用assert設(shè)置檢查點(diǎn)遵堵,對(duì)response的內(nèi)容檢查,并輸出錯(cuò)誤信息:

response = self.client.get('/test_assert')
assert '‘success' in response.content, "Respense error: " + response

動(dòng)態(tài)參數(shù)請(qǐng)求分組

網(wǎng)站的實(shí)參(Query String)經(jīng)常是動(dòng)態(tài)的,比如/blog?id=diff_id陌宿,一次查詢一個(gè)新的id锡足,如果不指定分組,在Locust的測(cè)試結(jié)果中和會(huì)看到默認(rèn)以"/blog?id=diff_id"的很多分組壳坪,而這些請(qǐng)求都是在測(cè)試獲取某個(gè)id的blog舶得,其實(shí)可以被分為一組。

通過給client傳入name參數(shù)能夠?qū)崿F(xiàn)分組:

# 這些id不同的請(qǐng)求都會(huì)被分組到 /blog/?id=[id] 中
for i in range(10):
    client.get("/blog?id=%i" % i, name="/blog?id=[id]")

參考

[1] Locust Documentation

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末爽蝴,一起剝皮案震驚了整個(gè)濱河市沐批,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝎亚,老刑警劉巖九孩,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異发框,居然都是意外死亡躺彬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門梅惯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宪拥,“玉大人,你說我怎么就攤上這事铣减〗猓” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵徙歼,是天一觀的道長(zhǎng)犁河。 經(jīng)常有香客問我,道長(zhǎng)魄梯,這世上最難降的妖魔是什么桨螺? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮酿秸,結(jié)果婚禮上灭翔,老公的妹妹穿的比我還像新娘。我一直安慰自己辣苏,他們只是感情好肝箱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著稀蟋,像睡著了一般煌张。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上退客,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天骏融,我揣著相機(jī)與錄音链嘀,去河邊找鬼。 笑死档玻,一個(gè)胖子當(dāng)著我的面吹牛怀泊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播误趴,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼霹琼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了凉当?” 一聲冷哼從身側(cè)響起枣申,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纤怒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體天通,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泊窘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了像寒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烘豹。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诺祸,靈堂內(nèi)的尸體忽然破棺而出携悯,到底是詐尸還是另有隱情,我是刑警寧澤筷笨,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布憔鬼,位于F島的核電站,受9級(jí)特大地震影響胃夏,放射性物質(zhì)發(fā)生泄漏轴或。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一仰禀、第九天 我趴在偏房一處隱蔽的房頂上張望照雁。 院中可真熱鬧,春花似錦答恶、人聲如沸饺蚊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽污呼。三九已至,卻和暖如春包竹,著一層夾襖步出監(jiān)牢的瞬間曙求,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悟狱,地道東北人静浴。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像挤渐,于是被迫代替她去往敵國和親苹享。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理浴麻,服務(wù)發(fā)現(xiàn)得问,斷路器,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • Locust文件就是一般的Python文件软免。唯一的需求就是它至少需要一個(gè)繼承于Locust的類. Locust類 ...
    Yuan_Jie閱讀 4,036評(píng)論 0 7
  • Locust是什么宫纬? Locust 是一個(gè)開源負(fù)載測(cè)試工具。使用 Python 代碼定義用戶行為膏萧,也可以仿真百萬個(gè)...
    zychen143閱讀 7,146評(píng)論 1 2
  • 欲飲桃花酒魂斷相思煙雨樓與爾同消萬古愁十度的酒也胡謅他鄉(xiāng)酒肉臭非重陽亦作重九我的灑脫不掣肘不會(huì)有勉強(qiáng)開口小橋流水柔...
    李帥帥angkuLC閱讀 558評(píng)論 0 0
  • 想學(xué)繪畫很久了漓骚,終于下定決心要好好來學(xué),堅(jiān)持每天繪畫榛泛!繪畫快一個(gè)月了蝌蹂,關(guān)注了一些大神,每次看著他們的作品真是各種神...
    一萌HM閱讀 280評(píng)論 7 7