1. 程式人生 > >locust效能測試安裝

locust效能測試安裝

Locust簡介

Locust是一款易於使用的分散式使用者負載測試工具。它用於對網站(或其他系統)進行負載測試,並確定系統可以處理多少併發使用者。
這個想法是,在測試期間,一群蝗蟲(Locust)會攻擊你的網站。您定義了每個蝗蟲Locust(或測試使用者)的行為,並且實時地從Web UI監視群集過程。這將有助於您在讓真正的使用者進入之前進行測試並識別程式碼中的瓶頸。
Locust完全基於事件,因此可以在一臺計算機上支援數千個併發使用者。與許多其他基於事件的應用程式相比,它不使用回撥。相反,它通過協程(gevent)機制使用輕量級過程。每個蝗蟲蜂擁到你的網站實際上是在自己的程序內執行(或者是greenlet,這是正確的)。這允許您在Py​​thon中編寫非常富有表現力的場景,而不會使程式碼複雜化。

** gevent是第三方庫,通過greenlet實現協程。greenlet是python的並行處理的一個庫。 python 有一個非常有名的庫叫做 stackless ,用來做併發處理, 主要是弄了個叫做tasklet的微執行緒的東西, 而greenlet 跟stackless的最大區別是greenlet需要你自己來處理執行緒切換, 就是說,你需要自己指定現在執行哪個greenlet再執行哪個greenlet。**

環境安裝

Locust支援Python 2.7, 3.4, 3.5, and 3.6的版本,小編的環境是python3.6直接用pip安裝就行 pip install locustio

報錯

下載安裝Microsoft visual c++14.0 ,安裝完成後,重新安裝locust

locust裡面請求是基於requests的,每個方法請求和requests差不多,請求引數、方法、響應物件和requests一樣的使用,之前學過requests庫的,這裡就非常簡單了

  • requests.get 對應client.get
  • requests.post 對應client.post
# 儲存為demo.py
# coding:utf-8
from locust import HttpLocust,TaskSet,task

class BlogDemo(TaskSet): '''使用者行為:開啟我的部落格首頁demo'''  @task(1) def open_blog(self): # 定義requests的請求頭 header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"} r = self.client.get("/yoyoketang", headers=header, verify=False) print(r.status_code) assert r.status_code == 200 class websitUser(HttpLocust): task_set = BlogDemo min_wait = 3000 # 單位毫秒 max_wait = 6000 # 單位毫秒 if __name__ == "__main__": import os os.system("locust -f demo.py --host=https://www.cnblogs.com")

程式碼註解:
新建一個類BlogDemo(TaskSet),繼承TaskSet,該類下面寫一些準備請求的行為(訪問的介面)
裡面的self.client呼叫get和post方法,跟requests是一樣的
@task裝飾該方法表示為使用者行為。括號裡面引數表示該行為挑選執行的權重,數值越大,執行頻率越高,不設定預設是1

WebsiteUser()類用於設定效能測試。
task_set :指向一個定義了的使用者行為類。
min_wait :使用者執行任務之間等待時間的下界,單位:毫秒。
max_wait :使用者執行任務之間等待時間的上界,單位:毫秒。

啟動locust

啟動locust可以直接在pycharm裡面執行上面的程式碼,執行後編輯器出現兩行
[2018-09-12 23:23:57,500] DESKTOP-HJ487C8/INFO/locust.main: Starting web monitor at *:8089
[2018-09-12 23:23:57,500] DESKTOP-HJ487C8/INFO/locust.main: Starting Locust 0.9.0

也可以通過cmd執行

$ locust -f demo.py --host=https://www.cnblogs.com

 

 

  • Number of users to simulate 設定虛擬使用者總數
  • Hatch rate (users spawned/second) 每秒啟動虛擬使用者數
  • 點選Start swarming 開始執行效能測試

三個圖示分別是

  • 吞吐量/每秒響應事務數(rps)實時統計
  • 平均響應時間/平均事務數實時統計
  • 虛擬使用者數執行

有很多網站不登入的話,是無法訪問到裡面的頁面的,這就需要先登入了
實現場景:先登入(只登入一次),然後訪問頁面->我的地盤頁->產品頁->專案頁

官方案例

下面是一個簡單的locustfile.py的簡單示例:

from locust import HttpLocust, TaskSet

def login(l):
    l.client.post("/login", {"username":"ellen_key", "password":"education"}) def logout(l): l.client.post("/logout", {"username":"ellen_key", "password":"education"}) def index(l): l.client.get("/") def profile(l): l.client.get("/profile") class UserBehavior(TaskSet): tasks = {index: 2, profile: 1} def on_start(self): login(self) def on_stop(self): logout(self) class WebsiteUser(HttpLocust): task_set = UserBehavior min_wait = 5000 max_wait = 9000

這裡我們定義了許多Locust任務,它們是帶有一個引數(Locust類例項)的普通Python callables 。這些任務收集在tasks屬性的TaskSet類下 。然後我們有一個代表使用者的 類,我們在其中定義模擬使用者在執行任務之間應該等待多長時間,以及哪個 類應該定義使用者的“行為”。 類可以繼承HttpLocust、TaskSet、TaskSet

HttpLocust類從繼承 Locust的類,並把它新增一個客戶端屬性,它是的一個例項 HttpSession,可用於使HTTP請求。

另一種我們可以宣告任務的方法,通常是更方便,就是使用 @task裝飾器。以下程式碼與上述程式碼相同:

from locust import HttpLocust, TaskSet, task

class UserBehavior(TaskSet): def on_start(self): """ on_start is called when a Locust start before any task is scheduled """ self.login() def on_stop(self): """ on_stop is called when the TaskSet is stopping """ self.logout() def login(self): self.client.post("/login", {"username":"ellen_key", "password":"education"}) def logout(self): self.client.post("/logout", {"username":"ellen_key", "password":"education"})  @task(2) def index(self): self.client.get("/")  @task(1) def profile(self): self.client.get("/profile") class WebsiteUser(HttpLocust): task_set = UserBehavior min_wait = 5000 max_wait = 9000

在Locust類(以及HttpLocust 因為它是一個子類),也可以讓一個在指定最小和最大等待時間毫秒,每個模擬使用者之間的任務執行(min_wait和MAX_WAIT)以及其他使用者的行為。預設情況下,時間是在min_wait和max_wait之間統一隨機選擇的,但是可以通過將wait_function設定為任意函式來使用任何使用者定義的時間分佈。例如,對於指數分佈的等待時間平均為1秒:

import random

class WebsiteUser(HttpLocust): task_set = UserBehaviour wait_function = lambda self: random.expovariate(1)*1000