最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Locust核心知識詳解

2023-03-08 13:35 作者:慧測  | 我要投稿

一、什么是Locust

Locust 是一種易于使用、可直接使用pyhton編寫腳本運(yùn)行且可擴(kuò)展的性能測試工具。

二、特點(diǎn)

  • 用純 Python 編寫測試場景

    如果您想要讓用戶執(zhí)行循環(huán)、執(zhí)行一些條件行為或進(jìn)行一些計算,只需使用 Python 提供的常規(guī)編程結(jié)構(gòu)即可。Locust 在其自己的 greenlet(輕量級進(jìn)程/協(xié)程)中運(yùn)行每個用戶。這使您可以像編寫常規(guī)(阻塞式)Python 代碼一樣編寫測試,而無需使用回調(diào)或其他機(jī)制。因為您的場景“只是 Python”,您可以使用常規(guī) IDE,并將測試版本控制為常規(guī)代碼(而不是某些使用 XML 或二進(jìn)制格式的其他工具)。

  • 分布式和可擴(kuò)展——支持?jǐn)?shù)十萬并發(fā)用戶

    Locust 使分布在多臺機(jī)器上運(yùn)行負(fù)載測試變得容易。它是基于事件的(使用 gevent),這使得單個進(jìn)程可以處理許多千個并發(fā)用戶。雖然可能存在其他工具能夠在給定硬件上執(zhí)行更多請求,但每個 Locust 用戶的低開銷使其非常適合測試高并發(fā)工作負(fù)載。

  • 基于?友好的Web 用戶界面

    Locust 有一個用戶友好的 Web 界面,實時顯示測試的進(jìn)度。您甚至可以在測試運(yùn)行時更改負(fù)載。它也可以在沒有用戶界面的情況下運(yùn)行,使其易于用于 CI/CD 測試。

  • 可以測試任何系統(tǒng)

    盡管 Locust 主要與網(wǎng)站/服務(wù)一起使用,但它可以用于測試幾乎任何系統(tǒng)或協(xié)議。只需編寫要測試的客戶端,或者探索由社區(qū)創(chuàng)建的客戶端。

  • 可入侵式的

    Locust 很小而且非常靈活,如果您想將報告數(shù)據(jù)發(fā)送到您喜歡的數(shù)據(jù)庫和繪圖系統(tǒng),或者包裝調(diào)用 REST API 來處理您系統(tǒng)的特定情況或運(yùn)行完全自定義的負(fù)載模式,都是極其容易實現(xiàn)的!

三、名稱和背景

Locust 起源于對現(xiàn)有解決方案的不滿。沒有現(xiàn)有的負(fù)載測試工具能夠很好地生成對動態(tài)網(wǎng)站產(chǎn)生現(xiàn)實負(fù)載的能力,其中大多數(shù)頁面對不同的用戶具有不同的內(nèi)容?,F(xiàn)有的工具使用笨拙的界面或冗長的配置文件聲明測試。在 Locust 中,我們采用了不同的方法。我們提供了一個 Python 框架,讓您可以使用 Python 代碼定義用戶的行為,而不是配置格式或用戶界面。

Locust 的名稱來自于蝗蟲物種,以其群集行為而聞名。

Locust 的早期版本使用了從自然界借鑒的術(shù)語(如集群、孵化、攻擊等),但現(xiàn)在采用了更多行業(yè)標(biāo)準(zhǔn)的命名。

四、安裝

五、編寫測試

現(xiàn)在,讓我們來看一個更完整、更實際的例子,展示你的測試可能會是什么樣子:

讓我們逐一分解它:

這是一個常規(guī)的 Python 模塊,可以從其他文件或包中導(dǎo)入代碼。

在這里,我們定義了一個類,用于模擬我們將要測試的用戶。它繼承了 HttpUser 類,為每個用戶提供了一個 client 屬性,該屬性是 HttpSession 的一個實例,可以用于向我們想要進(jìn)行負(fù)載測試的目標(biāo)系統(tǒng)發(fā)出 HTTP 請求。當(dāng)測試開始時,locust 將為它模擬的每個用戶創(chuàng)建一個該類的實例,并且每個用戶將在自己的 green gevent 線程中開始運(yùn)行。

要成為一個有效的 locustfile,文件必須至少包含一個繼承自 User 的類。

我們的類定義了一個等待時間,使模擬的用戶在執(zhí)行每個任務(wù)(見下文)后等待 1 到 5 秒。

使用 @task 裝飾的方法是 locust 文件的核心。對于每個正在運(yùn)行的用戶,Locust 創(chuàng)建一個 greenlet(微線程),該線程將調(diào)用這些方法。

我們通過裝飾兩個方法 @task 聲明了兩個任務(wù),其中一個給予了更高的權(quán)重(3)。當(dāng)我們的 QuickstartUser 運(yùn)行時,它會選擇聲明的任務(wù)之一——在本例中是 hello_worldview_items——并執(zhí)行它。任務(wù)是隨機(jī)選擇的,但你可以給它們不同的權(quán)重。上面的配置將使 Locust 選擇 view_items 的概率比選擇 hello_world 的概率高3倍。任務(wù)執(zhí)行完畢后,用戶將在等待時間(在本例中為 1 到 5 秒)內(nèi)休眠。在等待時間結(jié)束后,它將選擇一個新的任務(wù)并不斷重復(fù)執(zhí)行。

請注意,只有使用 @task 裝飾的方法才會被選擇執(zhí)行,因此您可以按照您自己的需要定義任何內(nèi)部幫助程序方法。

self.client 屬性使得可以進(jìn)行HTTP調(diào)用并且將被 Locust 記錄。有關(guān)如何進(jìn)行其他類型的請求、驗證響應(yīng)等信息。

注意

HttpUser不是一個真正的瀏覽器,因此不會解析HTML響應(yīng)來加載資源或呈現(xiàn)頁面。但它會跟蹤cookie。

在view_items任務(wù)中,我們使用一個可變的查詢參數(shù)加載10個不同的URL。為了不在Locust的統(tǒng)計信息中獲得10個單獨(dú)的條目 - 因為統(tǒng)計信息是按URL分組的 - 我們使用名稱參數(shù)將所有這些請求分組到一個名為“/item”的條目下。

此外,我們聲明了一個on_start方法。當(dāng)每個模擬用戶啟動時,將調(diào)用具有此名稱的方法。

1、自動生成Locustfile?

你可以使用har2locust工具基于瀏覽器記錄(HAR文件)生成Locustfile。

對于不習(xí)慣編寫自己的Locustfile的初學(xué)者來說,這非常有用,但對于更高級的用例也可以高度自定義。

har2locust安裝:

注意:har2locust仍處于beta版。它可能無法始終生成正確的Locustfile,并且其界面可能在版本之間發(fā)生更改。

2、用戶類(User class)

用戶類表示系統(tǒng)中一個類型的用戶/場景。在進(jìn)行測試運(yùn)行時,您指定要模擬的并發(fā)用戶數(shù),Locust將為每個用戶創(chuàng)建一個實例。您可以向這些類/實例添加任何屬性,但是有一些屬性對于Locust具有特殊的含義:

2.1 等待時間屬性?

用戶的wait_time方法可以在每個任務(wù)執(zhí)行后輕松引入延遲。如果未指定wait_time,則下一個任務(wù)將在上一個任務(wù)完成后立即執(zhí)行。

  • constant為固定的時間

  • between為最小和最大值之間的隨機(jī)時間

例如,要使每個用戶在每個任務(wù)執(zhí)行之間等待0.5到10秒

  • constant_throughput屬性,用于自適應(yīng)時間,以確保任務(wù)(最多)每秒運(yùn)行X次。

  • constant_pacing屬性,用于自適應(yīng)時間,以確保任務(wù)每X秒運(yùn)行一次(它是constant_throughput的數(shù)學(xué)倒數(shù))。

特別提示:

例如,如果您希望Locust在高峰負(fù)載時運(yùn)行500個任務(wù)迭代/秒,則可以使用wait_time = constant_throughput(0.1)和5000個用戶數(shù)。

等待時間只能限制吞吐量,而不能啟動新的用戶以達(dá)到目標(biāo)。因此,在我們的例子中,如果任務(wù)迭代的時間超過10秒,則吞吐量將低于500。

等待時間應(yīng)用于任務(wù)而不是請求。例如,如果您在任務(wù)中指定了wait_time = constant_throughput(2)并執(zhí)行了兩個請求,則您的請求速率/RPS將是每個用戶4個。

還可以直接在類上聲明自己的wait_time方法。例如,以下User類將睡眠一秒鐘,然后是兩秒鐘,然后是三秒鐘,等等。

2.2 weight和fixed_count屬性

如果文件中存在多個用戶類,并且沒有在命令行上指定用戶類,則Locust將生成相等數(shù)量的每個用戶類的實例。您還可以通過將它們作為命令行參數(shù)傳遞到同一個Locustfile中來指定要使用哪些用戶類:

如果您想模擬更多特定類型的用戶,可以在這些類上設(shè)置一個權(quán)重屬性。例如,Web用戶比移動用戶更有可能是三倍:

此外,您還可以設(shè)置fixed_count屬性。在這種情況下,將忽略權(quán)重屬性,并生成確切數(shù)量的用戶。這些用戶首先被生成。在下面的示例中,只會生成一個AdminUser實例,以便更精確地控制請求計數(shù),獨(dú)立于總用戶計數(shù)。

2.3 host屬性?

host屬性是要加載的主機(jī)的URL前綴(即“http://huicewang.com”)。通常,在啟動locust時,可以在Locust的Web UI或命令行上使用--host選項來指定。

如果在用戶類中聲明了host屬性,則在命令行或Web請求中未指定--host時,將使用它。

2.4 tasks屬性?

一個User類可以使用@task裝飾器將任務(wù)聲明為其下的方法,但也可以使用tasks屬性來指定任務(wù),這在下面將詳細(xì)描述。

2.5 environment屬性?

引用用戶正在運(yùn)行的環(huán)境。使用它來與環(huán)境或其包含的運(yùn)行程序交互。例如,要從任務(wù)方法中停止運(yùn)行程序:

如果在獨(dú)立的locust實例上運(yùn)行,則會停止整個運(yùn)行。如果在工作節(jié)點(diǎn)上運(yùn)行,則會停止該特定節(jié)點(diǎn)。

2.6 on_start和on_stop方法?

用戶(和TaskSets)可以聲明on_start方法和/或on_stop方法。當(dāng)用戶開始運(yùn)行時,User將調(diào)用其on_start方法,并在停止運(yùn)行時調(diào)用其on_stop方法。對于TaskSet,當(dāng)模擬用戶開始執(zhí)行該TaskSet時,將調(diào)用on_start方法,并在停止執(zhí)行該TaskSet(調(diào)用interrupt()或用戶被終止)時調(diào)用on_stop。

3、任務(wù)(Tasks)

當(dāng)一個負(fù)載測試開始時,每個模擬用戶將創(chuàng)建一個 User 類的實例,并在自己的 green thread 中開始運(yùn)行。當(dāng)這些用戶運(yùn)行時,它們選擇要執(zhí)行的任務(wù),然后等待一段時間,然后再選擇一個新的任務(wù),如此往復(fù)。

這些任務(wù)是普通的 Python 可調(diào)用函數(shù),如果我們正在對拍賣網(wǎng)站進(jìn)行負(fù)載測試,它們可以執(zhí)行“加載起始頁面”、“搜索某個產(chǎn)品”、“進(jìn)行競標(biāo)”等操作。

3.1 @task 裝飾器

為用戶添加任務(wù)的最簡單方法是使用 task 裝飾器。

@task 可以帶有一個可選的 weight 參數(shù),用于指定任務(wù)的執(zhí)行比例。在下面的例子中,task2 將被選中的概率是 task1 的兩倍:

3.2 tasks 屬性

定義用戶任務(wù)的另一種方法是通過設(shè)置 tasks 屬性。

tasks 屬性可以是 Task 列表,也可以是 <Task : int> 字典,其中 Task 可以是 Python 可調(diào)用函數(shù)或 TaskSet 類。如果任務(wù)是普通的 Python 函數(shù),它們會接收一個參數(shù),即執(zhí)行任務(wù)的 User 實例。

以下是將 User 任務(wù)聲明為普通 Python 函數(shù)的示例:

如果 tasks 屬性指定為列表,則每次要執(zhí)行任務(wù)時,它將從 tasks 屬性中隨機(jī)選擇。但是,如果 tasks 是一個字典,其中 callable 作為鍵,int 作為值,則將隨機(jī)選擇要執(zhí)行的任務(wù),但使用 int 作為比率。因此,對于如下任務(wù):

my_task 將比 another_task 執(zhí)行的概率高 3 倍。

在內(nèi)部,上述字典實際上會被擴(kuò)展成一個列表(并更新 tasks 屬性),看起來像這樣:

然后使用 Python 的 random.choice() 從列表中選擇任務(wù)。

3.3 @tag 裝飾器

通過使用 @tag 裝飾器為任務(wù)打標(biāo)簽,您可以使用 --tags 和 --exclude-tags 參數(shù)選擇在測試期間執(zhí)行哪些任務(wù)??紤]以下示例:

如果您在啟動測試時使用了 --tags tag1,則僅會在測試期間執(zhí)行task1和task2。如果您使用了 --tags tag2 tag3,則僅會執(zhí)行task2和task3。

--exclude-tags則完全相反。因此,如果您使用 --exclude-tags tag3 啟動測試,則僅會執(zhí)行task1、task2和task4。排除始終優(yōu)先于包含,因此如果一個任務(wù)具有您包含和排除的標(biāo)記,它將不會被執(zhí)行。

4、事件?

如果您想要運(yùn)行一些設(shè)置代碼作為測試的一部分,通常將其放在locustfile的模塊級別即可,但有時您需要在運(yùn)行的特定時間執(zhí)行某些操作。為此需求,Locust提供了事件鉤子。

4.1 test_start和test_stop

如果您需要在負(fù)載測試的開始或結(jié)束時運(yùn)行某些代碼,您應(yīng)該使用test_start和test_stop事件。您可以在locustfile的模塊級別設(shè)置這些事件的監(jiān)聽器:

4.2 初始化(init)

初始化事件在每個Locust進(jìn)程開始時觸發(fā)。這在分布式模式下特別有用,因為每個工作進(jìn)程(而不是每個用戶)都需要有機(jī)會進(jìn)行一些初始化。例如,假設(shè)您有一些全局狀態(tài),所有從該進(jìn)程生成的用戶都需要:

5、HttpUser 類?

HttpUser 是最常用的用戶類。它添加了一個 client 屬性,用于發(fā)起 HTTP 請求。

5.1 client 屬性 / HttpSession

client 是 HttpSession 的一個實例。HttpSession 是 requests.Session 的一個子類/包裝類,因此其特性都有很好的文檔說明,應(yīng)該對很多人來說都很熟悉。HttpSession 添加的主要功能是將請求結(jié)果報告給 Locust(成功/失敗、響應(yīng)時間、響應(yīng)長度、名稱)。

它包含所有 HTTP 方法的方法:get、post、put 等等。

就像 requests.Session 一樣,它保留請求之間的 cookies,因此可以輕松地用于登錄網(wǎng)站。

發(fā)起 POST 請求,查看響應(yīng)并隱式地重用我們得到的任何會話 cookie 發(fā)起第二個請求

HttpSession 捕獲 Session 拋出的任何 requests.RequestException(由連接錯誤、超時或類似問題引起),而不是返回 status_code 設(shè)置為 0 且內(nèi)容設(shè)置為 None 的虛擬響應(yīng)對象。

5.2 驗證響應(yīng)(Validating responses)

如果 HTTP 響應(yīng)代碼為 OK(<400),則認(rèn)為請求成功,但通常還有必要對響應(yīng)進(jìn)行一些額外的驗證。

您可以使用 catch_response 參數(shù)、with 語句和 response.failure() 調(diào)用將請求標(biāo)記為失敗。

即使響應(yīng)代碼是錯誤的,您也可以將請求標(biāo)記為成功:

您甚至可以通過引發(fā)異常并在 with 塊之外捕獲它來避免記錄請求。或者您可以拋出 locust 異常,如下面的示例所示,讓 Locust 捕獲它。

5.3 REST/JSON APIs

FastHttpUser提供了現(xiàn)成的rest方法,但您也可以自己實現(xiàn):

5.4 分組請求(Grouping requests)

網(wǎng)站通常具有URL包含某種動態(tài)參數(shù)的頁面。通常,將這些URL組合在一起以顯示用戶統(tǒng)計信息是有意義的。這可以通過將名稱參數(shù)傳遞給HttpSession的不同請求方法來完成。

例如:

在與包裝Requests會話的庫/SDK交互時,可能存在無法將參數(shù)傳遞給請求函數(shù)的情況。通過設(shè)置client.request_name屬性,提供了另一種分組請求的方法。

如果您想以最少的樣板代碼鏈接多個分組,請使用client.rename_request()上下文管理器。

使用catch_response并直接訪問request_meta,甚至可以基于響應(yīng)中的某些內(nèi)容重命名請求。

5.5 HTTP代理設(shè)置(HTTP Proxy settings)

為了提高性能,我們將requests配置為不在環(huán)境中查找HTTP代理設(shè)置,方法是將requests.Session的trust_env屬性設(shè)置為False。如果您不希望這樣做,您可以手動將locust_instance.client.trust_env設(shè)置為True。有關(guān)詳細(xì)信息,請參閱requests的文檔。

5.6 連接池(Connection pooling)

由于每個HttpUser都會創(chuàng)建新的HttpSession,因此每個用戶實例都有自己的連接池。這類似于真實用戶與Web服務(wù)器的交互方式。

但是,如果要在所有用戶之間共享連接,則可以使用單個池管理器。為此,請將pool_manager類屬性設(shè)置為urllib3.PoolManager的實例。

6、TaskSets

TaskSets是一種結(jié)構(gòu)化測試層次式Web站點(diǎn)/系統(tǒng)的方式。您可以在此處閱讀更多信息。

示例

這里有很多l(xiāng)ocustfile的示例

如何構(gòu)造您的測試代碼

重要的是要記住,locustfile.py只是一個普通的Python模塊,由Locust導(dǎo)入。從此模塊中,您可以像在任何Python程序中一樣自由地導(dǎo)入其他Python代碼。當(dāng)前工作目錄會自動添加到python的sys.path中,因此可以使用python import語句導(dǎo)入駐留在工作目錄中的任何python文件/模塊/軟件包。

對于小型測試,將所有測試代碼放在單個locustfile.py中應(yīng)該可以正常工作,但對于較大的測試套件,您可能需要將代碼拆分為多個文件和目錄。

您如何結(jié)構(gòu)化測試源代碼當(dāng)然完全取決于您,但我們建議您遵循Python最佳實踐。這是一個想象中的Locust項目的示例文件結(jié)構(gòu):

項目文件結(jié)構(gòu)

具有多個locustfiles的項目也可以將它們保存在單獨(dú)的子目錄中:

項目文件結(jié)構(gòu)

在任何上述項目結(jié)構(gòu)中,您的locustfile都可以使用以下方式導(dǎo)入公共庫:


Locust核心知識詳解的評論 (共 條)

分享到微博請遵守國家法律
自治县| 阳泉市| 瑞丽市| 万山特区| 涪陵区| 昭觉县| 北安市| 江达县| 柳州市| 汉寿县| 宜川县| 宜宾市| 确山县| 洛浦县| 玛曲县| 安国市| 石楼县| 新源县| 洛川县| 尉氏县| 灵山县| 金湖县| 荣昌县| 綦江县| 庆安县| 亳州市| 上高县| 连城县| 磐安县| 固安县| 霸州市| 郸城县| 扬中市| 泗洪县| 环江| 邳州市| 常熟市| 安福县| 凤山市| 百色市| 平邑县|