一、Locust快速 入門
1 . 介紹
Locust 是一種易于使用、可編寫腳本且可擴(kuò)展的性能測(cè)試工具。
您可以在常規(guī) Python 代碼中定義用戶的行為,而不是被困在 UI 或限制性領(lǐng)域特定語(yǔ)言中。
這使得 Locust 可以無(wú)限擴(kuò)展并且對(duì)開(kāi)發(fā)人員非常友好。
- **用普通的舊 Python 編寫測(cè)試場(chǎng)景**
> 如果您希望您的用戶循環(huán)、執(zhí)行某些條件 行為或進(jìn)行某些計(jì)算,您只需使用 Python 提供的常規(guī)編程結(jié)構(gòu)。Locust 在其自己的 greenlet(輕量級(jí)進(jìn)程/協(xié)程)中運(yùn)行每個(gè)用戶。這使您能夠像普通(阻塞)Python 代碼一樣編寫測(cè)試,而不必使用回調(diào)或其他一些機(jī)制。因?yàn)槟愕膱?chǎng)景“只是 python”,所以你可以使用你的常規(guī) IDE,并將你的測(cè)試作為常規(guī)代碼進(jìn)行版本控制。
- **分布式和可擴(kuò)展——支持?jǐn)?shù)十萬(wàn)并發(fā)用戶**
> Locust 使運(yùn)行分布在多臺(tái)機(jī)器上的負(fù)載測(cè)試變得容易。它是基于事件的(使用[gevent](http://www.gevent.org/)),這使得單個(gè)進(jìn)程可以處理數(shù)千個(gè)并發(fā)用戶。雖然可能有其他工具能夠在給定硬件上每秒處理更多請(qǐng)求,但每個(gè) Locust 用戶的低開(kāi)銷使其非常適合測(cè)試高度并發(fā)的工作負(fù)載。
- **基于網(wǎng)絡(luò)的用戶界面**
> Locust 有一個(gè)用戶友好的 Web 界面,可以實(shí)時(shí)顯示測(cè)試進(jìn)度。您甚至可以在測(cè)試運(yùn)行時(shí)更改負(fù)載。它也可以在沒(méi)有 UI 的情況下運(yùn)行,使其易于用于 CI/CD 測(cè)試。
- **可以測(cè)試任何系統(tǒng)**
> 盡管 Locust 主要用于網(wǎng)站/服務(wù),但它也可用于測(cè)試幾乎任何系統(tǒng)或協(xié)議。只需 為您要測(cè)試的內(nèi)容[編寫客戶端](https://docs.locust.io/en/stable/testing-other-systems.html#testing-other-systems)[,或探索社區(qū)創(chuàng)建的一些](https://github.com/SvenskaSpel/locust-plugins#users)客戶端。
- **可入侵**
> Locust 很小而且非常靈活,我們打算保持這種狀態(tài)。如果您想[將報(bào)告數(shù)據(jù)發(fā)送到您喜歡的數(shù)據(jù)庫(kù)和圖形系統(tǒng)](https://github.com/SvenskaSpel/locust-plugins/blob/master/locust_plugins/listeners.py),包裝對(duì) REST API 的調(diào)用以處理系統(tǒng)的細(xì)節(jié)或運(yùn)行[完全自定義的加載模式](https://docs.locust.io/en/stable/custom-load-shape.html#custom-load-shape),沒(méi)有什么能阻止您!
2 .安裝
```python
# 安裝
> pip install locust -i https://pypi.douban.com/simple
# 驗(yàn)證
> locust -V
```
## 3 .編寫locustfile
```python
import time
from locust import HttpUser, task, between
class QuickstartUser(HttpUser):
? ? wait_time = between(1, 5)
? ? @task
? ? def hello_world(self):
? ? ? ? self.client.get("/hello")
? ? ? ? self.client.get("/world")
? ? @task(3)
? ? def view_items(self):
? ? ? ? for item_id in range(10):
? ? ? ? ? ? self.client.get(f"/item?id={item_id}", name="/item")
? ? ? ? ? ? time.sleep(1)
? ? def on_start(self):
? ? ? ? self.client.post("/login", json={"username":"foo", "password":"bar"})
```
### 3.1 必須繼承User
? ? ? ?一個(gè)Locustfile只是一個(gè)普通的Python模塊,它可以從其他文件或包中導(dǎo)入代碼。
```python
class QuickstartUser(HttpUser):
```
? ? ? ?在這里,我們?yōu)槲覀儗⒁M的用戶定義了一個(gè)類。它繼承自HttpUser,給每個(gè)用戶一個(gè)客戶端屬性,也就是HttpSession的一個(gè)實(shí)例,可以用來(lái)向我們要進(jìn)行負(fù)載測(cè)試的目標(biāo)系統(tǒng)發(fā)出HTTP請(qǐng)求。
? ? ? ?**當(dāng)測(cè)試開(kāi)始時(shí),locust會(huì)給它模擬的每個(gè)用戶創(chuàng)建一個(gè)這個(gè)類的實(shí)例,每個(gè)用戶都會(huì)在自己的綠色gevent線程中開(kāi)始運(yùn)行。一個(gè)文件要成為有效的locustfile,必須至少包含一個(gè)繼承自User的類**
------
### 3.2 任務(wù)等待時(shí)間
```python
wait_time = between(1, 5)
```
**我們的類定義了一個(gè)wait_time,它將使模擬用戶在每個(gè)任務(wù)(見(jiàn)下文)執(zhí)行后等待1到5秒。更多信息見(jiàn)wait_time屬性。**
------
### 3.3 任務(wù)
用@task裝飾的方法是你Locust文件的核心。
**對(duì)于每一個(gè)正在運(yùn)行的用戶,Locust會(huì)創(chuàng)建一個(gè)greenlet(微線程),它將調(diào)用這些方法。**
```python
@task
def hello_world(self):
? ? self.client.get("/hello")
? ? self.client.get("/world")
@task(3)
def view_items(self):
```
? ? ? ?我們通過(guò)用@task裝飾兩個(gè)方法來(lái)聲明兩個(gè)任務(wù),其中一個(gè)被賦予較高的權(quán)重(3)。
? ? ? ?當(dāng)我們的QuickstartUser運(yùn)行時(shí),它將從聲明的任務(wù)中挑選一個(gè)--在本例中是hello_world或view_items 并執(zhí)行它。**task任務(wù)是隨機(jī)挑選的,但你可以給它們不同的權(quán)重***。
? ? ? **上面的配置將使Locust挑選view_items的可能性是hello_world的三倍**。
? ? ? **當(dāng)一個(gè)任務(wù)執(zhí)行完畢后,用戶將在其等待時(shí)間內(nèi)睡覺(jué)(在這種情況下是1到5秒)。在它的等待時(shí)間之后,它將挑選一個(gè)新的任務(wù),并不斷重復(fù)。**
注意,只有用@task裝飾的方法才會(huì)被選中,所以你可以用任何你喜歡的方式定義你自己的內(nèi)部輔助方法。
```python
self.client.get("/hello")
```
#### 3.3.1? ?HTTP調(diào)用
self.client屬性使我們可以進(jìn)行HTTP調(diào)用,這些調(diào)用將被Locust記錄下來(lái)。關(guān)于如何進(jìn)行其他類型的請(qǐng)求、驗(yàn)證響應(yīng)等的信息,請(qǐng)參見(jiàn)使用[HTTP客戶端。](https://docs.locust.io/en/stable/writing-a-locustfile.html#client-attribute-httpsession)
注意
> HttpUser不是一個(gè)真正的瀏覽器,因此不會(huì)解析一個(gè)HTML響應(yīng)來(lái)加載資源或渲染頁(yè)面。不過(guò),它將保持對(duì)cookie的跟蹤
```python
@task(3)
def view_items(self):
? ? for item_id in range(10):
? ? ? ? self.client.get(f"/item?id={item_id}", name="/item")
? ? ? ? time.sleep(1)
```
#### 3.3.2 請(qǐng)求分組
在view_items任務(wù)中,我們通過(guò)使用一個(gè)可變的查詢參數(shù)加載10個(gè)不同的URL。為了不在Locust的統(tǒng)計(jì)中得到10個(gè)單獨(dú)的條目--因?yàn)榻y(tǒng)計(jì)是根據(jù)URL分組的--我們使用名稱參數(shù)將所有這些請(qǐng)求分組在一個(gè)名為"/item "的條目下。
#### 3.3.3 任務(wù)初始化和清理
```python
def on_start(self):
? ? self.client.post("/login", json={"username":"foo", "password":"bar"})
```
此外,我們還聲明了一個(gè)on_start方法。當(dāng)每個(gè)模擬用戶開(kāi)始時(shí),將為他們調(diào)用這個(gè)名字的方法。更多信息見(jiàn)on_start和on_stop方法。
------
### 3.4 自動(dòng)生成 locustfile
你可以使用[har2locust](https://github.com/SvenskaSpel/har2locust)來(lái)生成基于瀏覽器記錄(HAR-file)的蝗蟲(chóng)文件。
它對(duì)不習(xí)慣編寫自己的locustfile的初學(xué)者特別有用,但對(duì)更高級(jí)的使用情況也是高度可定制的。
> 注意:
>
> har2locust仍處于測(cè)試階段。它不一定能生成正確的蝗蟲(chóng)文件,而且它的界面在不同的版本之間可能會(huì)有變化。
更多教程,更多實(shí)戰(zhàn)案例,請(qǐng)閱讀:https://edu.csdn.net/course/detail/38449

更多教程,更多實(shí)戰(zhàn)案例,請(qǐng)閱讀:https://edu.51cto.com/course/33521.html