引言
前面已經對市場上一些比較熱門的性能測試工具進行了對比,這裏主要介紹Locust性能測試框架的使用,如果你喜歡編碼,學習Python自動化測試的時候,同時又能學習一款性能測試工具,何樂而不爲呢。
https://github.com/locustio/locust 13000+星
簡介
Locust是易於使用的分佈式用戶負載測試工具。它旨在對網站(或其他系統)進行負載測試,並確定系統可以處理多少個併發用戶。
這個想法是,在測試期間,大量的模擬用戶會攻擊您的網站。您可以使用Python代碼定義每個用戶的行爲,並且可以通過Web UI實時監視羣集過程。這將幫助您在允許真正的用戶進入之前測試測試並確定代碼中的瓶頸。
Locust完全基於事件,因此可以在一臺計算機上支持數千個併發用戶。與許多其他基於事件的應用程序相比,它不使用回調。相反,它通過gevent使用輕量級進程。羣集您站點的每個蝗蟲實際上都在其自己的進程中運行(正確地說,是Greenlet)。
這使您可以在Python中編寫非常有表現力的場景,而不會使回調複雜化代碼。————官方文檔:https://locust.io
簡單來說:
1、支持分佈式;
2、純python腳本,易上手;
3、擴展性高;
4、單機支持高併發數;
5、WebUI可視化監控;
...
環境配置
python 3.6.5
pip3
IDE:Pycharm2019.3
安裝locustio
pip install locustio
查看是否安裝成功:
如果指定最新版本可以這樣操作:
pip3 install -i https://pypi.douban.com/simple/ locustio==0.14.6
版本信息
gevent 是在python中實現協程的第三方庫,協程又叫微線程Coroutine。
flask 是python 的一個web開發框架。
requests 是python中可進行http(s)請求的操作庫。
msgpack 是一種快速、緊湊的二進制序列化格式,適用於類似Json的數據。
pyzmq 可用於Locust分佈運行在多個進程/機器上。
注意:版本version:0.11.0不支持between函數
案例
locust框架裏面的請求跟python的requests庫使用方法基本一致,對應關係如下:
requests.get 對應client.get
requests.post 對應client.post
Locust 不同於 jmeter 可以用 GUI 來創建壓測腳本。Locust 需要自己編寫 python 腳本,壓測負載腳本主要包含兩個子類UserTask和WebsiteUser,一個用戶行爲類,用於定義用戶的具體行爲,一個設置用戶性能測試類。
兩個類分別繼承TaskSet和Httplocust類,擁有這兩個父類的公共屬性和方法。
# -*- coding: utf-8 -*-
'''
@author: Leo
@software: pycharm
@file: demo_2.py
@time: 2020/6/12 0012 23:12
@Desc:
'''
__author__ = 'Leo'
import os
from locust import HttpLocust,TaskSet,task,between
import urllib3
"""
使用Python3 requests發送HTTPS請求,已經關閉認證(verify=False)情況下,控制檯會輸出以下錯誤, 忽略報錯的方法如下:
InsecureRequestWarning: Unverified HTTPS request is being made.
Adding certificate verification is strongly advised.
See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
"""
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
class Locust_baidu(TaskSet):
"""
定義Locust_baidu類,繼承TaskSet類,用於定義測試任務
"""
# @task()裝飾的方法爲一個事務。方法的參數用於指定該行爲的執行權重。參數越大每次被虛擬用戶執行的概率越高。如果不設置默認爲1,@task
@task(1)
def baidu(self):
"""
創建baidu方法,訪問百度首頁,並校驗req返回值
task是任務裝飾器,參數爲運行次數的比例
即1表示一個Locust實例被挑選執行的權重,數值越大,執行頻率越高
"""
req = self.client.get("/") # 訪問百度首頁,並獲取對應的req
if req.status_code == 200: # 校驗返回的status_code,成功則會返回200
print("success")
else:
print("fail")
class WebsiteUser(HttpLocust):
"""
HttpLocust類繼承Locust類,而Locust類繼承了HttpSession類,HttpSession使用率requests.Session,所以用client方法請求登錄後,會保存登錄狀態,
具有session記憶功能
"""
# 指定定義用戶行爲的類,包含一組任務
task_set = Locust_baidu
# 設置用戶執行任務之間等待的上下限,單位秒
wait_time = between(3,6)
# # 等同於上面wait_time,單位毫秒
# min_wait = 3000
# max_wait = 6000
if __name__ == '__main__':
os.system("locust -f demo_2.py --host=https://www.baidu.com")
運行結果:
可以看出來,腳本主要包含兩個類,一個是WebsiteUser(繼承自HttpLocust,而HttpLocust繼承自Locust),另一個是Locust_baidu(繼承自TaskSet)。所以Locust性能測試腳本中主要是靠TaskSet類和Locust類來實現所有的業務場景。
Locust類其實好比一羣蝗蟲,每個蝗蟲就是一個Locust類的實例,而TaskSet類就是蝗蟲的大腦,控制着蝗蟲的行爲。也就是我們測試中實際場景中的任務集合。
總結
這就是Locust的最基本使用,感興趣的可以瞭解一下。
如果對python測試開發相關技術感興趣的夥伴,歡迎加入測試開發學習交流QQ羣:696400122,不積跬步,無以至千里。