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

locust性能測試安裝

all 等待時間 pin python3.6 等待 用戶數 fun apple des

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

locust性能測試安裝