python性能測試工具locust


 

1.概述:

1.我們對目前比較流行的幾款壓測工具進行了調研。Jmeter與LoadRunner基於多線程實現並發,多線程由操作系統決定,由於上下文切換頻繁、內核調度頻繁,單台機器很難產生大量線程並發。以多線程方式運行會有很多線程切換的開銷,故而考慮多協程方式實現,

Jmeter由Java語言編寫,並不支持協程機制。Python語言通過async/await的方式實現協程,而Locust正是基於python。

 2..Locust 完全是基於事件的,因此在一台機器上支持數千個並發用戶是可能的。與許多其他基於事件的應用程序不同,它不使用回調。相反它通過 gevent 使用輕量級協程。這允許您用 Python 編寫非常有表現力的場景,而不用回調使代碼復雜化。

 

2.壓測工具對比:

當你想做性能測試的時候,你會選擇什么樣的測試工具呢?是會選擇wrk?jmeter?locust?還是loadrunner呢?

 備注:服務端數據可以通過nmon_analyser或者Grafana監控

 

3.優缺點說明:

 3.1jmeter采用線程並發機制,但其主要依靠增加線程數提高並發量,當單機模擬數以千計的並發用戶時,對於CPU和內存的消耗比較大,jmeter本身具有以下優點和缺點:

 優點:①界面可視化操作,可以使用錄制腳本方式對較為復雜的用戶流建模,還可以創建斷言來驗證測試行為是否通過;

    ②表格、圖形、結果樹等多類可視化數據分析和報告輸出;

    ③支持http、ftp、tcp等多種協議類型測試;

    ④支持分布式壓力測試,但對於上萬的用戶並發測試需要多台測試機支持,資源要求比較大;

    ⑤可以用於測試固定吞吐量下的系統性能,例如在100QPS(QPS:每秒查詢率)下系統的響應時間和資源消耗;

缺點:①jmeter的GUI模式消耗資源較大,當需要測試高負載時,需要先使用GUI工具來生成XML測試計划,然后在非GUI模式下導入測試計划運行測試,並且關閉不需要的偵聽器(收集數據與展示測量的組件),因為偵聽器也會消耗掉本用於生成負載的大量資源。測試結束后后,需要將原始結果數據導入GUI以才能查看結果。

 

3.2.locust是一個的簡單易用的分布式負載測試工具,主要用來對網站進行負載壓力測試。locust使用python語言開發,測試資源消耗遠遠小於java語言開發的jmeter。且其支持分布式部署測試,能夠輕松模擬百萬級用戶並發測試。

優點:①locust借助於協程實現對用戶的模擬,相同物理資源(機器cpu、內存等)單台負載機可模擬的負載數遠超jmeter

    ②相比jmeter需要界面點擊錄制復雜場景的麻煩,locust只需用戶使用python編寫用戶場景完成測試;

    ③不同與jmeter復雜的用戶使用界面,locust的界面干凈整潔,可以實時顯示測試的相關細節(如發送請求數、失敗數和當前發送請求速度等);

    ④locust雖然是面向web應用測試的,但是它可以用來測試幾乎所有系統。給locust編寫一個客戶端,可以滿足你所有的測試要求;

缺點同wrk一樣,locust測試結果輸出不如jmeter的測試結果展示類型多;

 

4.Locust的指標體系:

(1)響應時間
反應系統處理效率指標,從開始到完成某項工作所需要時間的度量,響應時間通常隨着負載的增加而增加;
(2)吞吐率(QPS)

 表示“每秒查詢數”,是一台服務器每秒能夠相應的查詢次數,是對一個特定的查詢服務器在規定時間內的處理流量。
     備注:QPS 每秒鍾發送的請求的數量。(一個事務可能包含多個請求)

(3)事務處理能力(TPS在locust中為RPS)

表示服務器每秒處理的事物數,它是衡量系統處理能力的重要指標 (每秒處理請求數)
 
備注:
  性能測試評判點_性能指標:
TPS,響應時間(平均響應時間,完成90%請求響應時間),錯誤/成功率
 
 

 ##___________________________Locust環境搭建_________________________________________________________________________

 1.安裝locust:

pip3 install locust

檢查是否安裝成功,執行命令:locust --v

 

2.腳本實例:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from locust import HttpUser, TaskSet, task
# 定義用戶行為類
class UserBehavior(TaskSet):
    @task  # 任務項
    def test_login(self):
        header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}
        url = '/login.htm'
        res = self.client.get(url,headers=header, verify=False)
        #斷言方式一
        #assert res.status_code == 200
        #斷言方式二
        if res.status_code == 200:
            print('登陸成功!')
        else:
            print('登陸失敗!')

class WebSiteUser(HttpUser):
    tasks = [UserBehavior]
    #host = "https://www.cnblogs.com"
    max_wait = 5000
    min_wait = 1000



if __name__ == "__main__":
    import os
    os.system("locust -f test.py --host=https://www.cnblogs.com")#這樣寫可以直接運行文件,也可以命令調用文件

多個接口測試腳本

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from locust import  HttpUser,TaskSet,task

class UserBehavior(TaskSet):
    @task
    def chen_users(self):
        headers = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}##設置請求Headers頭部
        #請求輸入參數
        p = {"game_id":"20210708110"}
        url='/subcontract'
        res=self.client.post(url=url,headers=headers,params=p)
        if res.status_code == 200:
            print('登陸成功!')
        else:
            print('登陸失敗!')

    @task(1)
    def test_groups(self):
        headers = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}##設置請求Headers頭部
        res=self.client.get("/getcontract", headers= headers)
        if res.status_code == 200:
            print('test登陸成功!')
        else:
            print('test登陸失敗!')


class WebsiteUser(HttpUser):
    tasks = [UserBehavior]
    min_wait = 3000
    max_wait = 6000



if __name__ == "__main__":
    import os
    os.system("locust -f test.py --host=http://106.55.29.87:8000")
View Code

UserBehavior 類繼承TaskSet 類,用於描述用戶行為。

  • @task約定該方法為一個事件,一部分的數字表示請求比例,上面的比例為2:1 默認1:1

  • test_users()方法表示一個用戶行為,這里是請求user接口。

  • test_groups()方法表示請求group接口。

  • client.get()用於指定請求的路徑。

網站用戶類用於設置性能測試。

  • task_set:一個定義的用戶行為類。

  • min_wait:執行事務之間用戶等待時間的下界(單位:毫秒)。

  • max_wait:執行事務之間用戶等待時間的上界(單位:毫秒)。

 

3.執行測試:

   web模式:

使用命令行啟動測試: locust -f test.py --host=https://www.cnblogs.com .................................................... .......普通啟動
locust -f  E:\test\dalan_sparrow\sparrow\test.py --host=https://www.cnblogs.com --web-port 8091 ...............啟動時指定端口
如果要運行分布式Locust,必須在啟動從機時指定主機(運行分布在單台機器上的Locust時不需要這樣做,因為主機默認為127.0.0.1):
locust -f testscript/locusttest.py --slave --master-host=192.168.0.100 --host=https://cnblogs.com
如果要運行分布在多個進程中的Locust,通過指定-master以下內容來啟動主進程 :
locust -f testscript/locusttest.py --master --host=https://www.cnblogs.com

no web 模式:
1. locust -f load_test.py --host=https://www.baidu.com --no-web -c 10 -r 2 -t 1m
2. locust -f  D:\PycharmProjects\UItest\locust_scripts\locust_test2.py --no-web -c 1 -r 1 -t 10s --csv=d:

           啟動參數:

              --no-web 表示不使用Web界面運行測試。

             -c 設置虛擬用戶數。

             -r 設置每秒啟動虛擬用戶數。

             -t 設置設置運行時間。

             --csv運行結果保存目錄

備注:

1.Locust no-web模式執行命令提示locust: error: unrecognized arguments: -no-web -c 的問題

解決:將命令參數--no-web 更改為 --headless,將命令中指定用戶並發數的參數 -c 改為 -u即可。

     

執行測試后在瀏覽器打開localhost:8089可以看到如下頁面:

  • Number of users to simulate:設置模擬用戶數。

  • Hatch rate(users spawned/second):每秒產生(啟動)的虛擬用戶數。

  • 單擊“Start swarming”按鈕,開始運行性能測試

 

運行之后可以看到主界面如下:

性能測試參數如下。

  • Type:請求的類型,例如GET/POST。

  • Name:請求的路徑。

  • request:當前請求的數量。

  • fails:當前請求失敗的數量。

  • Median:響應時間的中間值,即50%的響應時間在這個數值范圍內,單位為毫秒;

  • Average:平均值,單位毫秒,所有請求的平均響應時間。

  • Min:請求的最小服務器響應時間,單位毫秒。

  • Max:請求的最大服務器響應時間,單位毫秒。

  • Content Size:單個請求的大小,單位字節。

  • reqs/sec:每秒鍾請求的個數。即QPS

 

 點擊 Charts 菜單可以查看性能圖表

圖表含義如下:

  • Total Request per Second :每秒的請求數

  • Average Response Time: 平均響應時間

  • Number of Users: 用戶數



 
        

 

相關連接:

https://blog.csdn.net/weixin_38320674/article/details/108505688 ....................QPS、TPS、並發用戶數、吞吐量關系

https://zhuanlan.zhihu.com/p/282824807  ........................locust代碼案例

https://www.cnblogs.com/shenh/p/12424990.html ....................locust環境流程(包含分布式)

https://www.cnblogs.com/imyalost/p/9758189.html ......................locust基本環境流程

https://www.cnblogs.com/yoyoketang/p/9642242.html .................先登錄場景案例

https://testerhome.com/topics/12712 .............................................Locust 簡單例子

https://mp.weixin.qq.com/s?__biz=MzAxNjg3MTU4OQ==&mid=2247484282&idx=1&sn=f529a433410dde29ffb86efd792956aa ................locust匯總(包含no web模式)

https://testerhome.com/topics/24873 .......................................重新定義 Locust 的測試報告_性能監控平台

https://mp.weixin.qq.com/s/tIVdUfQlCnsKVC0VMLynLQ .............從0到1開展性能測試必備的性能測試要點!

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM