前言:說起性能測試,大家想到的基本上都是工具jmeter和loadrunner多少也對執行性能測試的方式有一點認識,這些工具基本都實現了請求-響應-結果統計分析這樣完整的測試鏈路,用戶方面只需組織這些現成的插件即可實現性能測試過程,但是這些都不是對python友好的工具,對於python系用戶來說不能用python接入和封裝是一件很讓人掃興的事情,“Locust是使用Python語言編寫實現的開源性能測試工具,簡潔、輕量、高效,並發機制基於gevent協程,可以實現單機模擬生成較高的並發壓。
那么什么是Locust呢?翻譯過來就是蝗蟲,支持Python 2.7、3.4、3.5和3.6。
理論:
1、Locust是一個易於使用,分布式,用戶負載測試工具。它旨在測試web站點(或其他系統)的負載測試,並計算系統能夠處理多少並發用戶。在測試期間,我們定義一群蝗蟲會攻擊你的網站,每個蝗蟲(或者測試用戶)的行為是由您定義的,集群過程是由web UI實時監控的。
這將幫助您在允許真正的用戶進入之前進行測試並識別代碼中的瓶頸。蝗蟲完全是基於事件的,因此可以在一台機器上支持數千個並發用戶。與其他許多基於事件的應用程序不同,它不使用回調。相反,它通過gevent使用輕量級過程。每個蝗蟲都在自己的進程中運行(正確地說,是綠色的)。這允許我們在Python中編寫非常有表現力的場景,而不用回調使代碼變得復雜。
2、用普通的Python編寫用戶測試場景不需要笨拙的ui或膨脹的xml,只需像通常那樣編寫代碼即可。基於coroutines而不是回調,代碼看起來和行為都像正常的,阻塞Python代碼。分布式和可伸縮—支持成千上萬的用戶,蝗蟲支持在多台機器上運行負載測試。由於基於事
件,即使一個Locust節點也可以在一個進程中處理數千個用戶。這背后的部分原因是,即使您模擬了那么多用戶,也不是所有用戶都在積極地攻擊您的系統。通常,用戶都不知道下一步該做什么。每秒請求數!=在線用戶數。基於web的UILocust有一個簡潔的HTML+JS用戶界面,實時顯示相關的測試細節。由於UI是基於web的,所以它是跨平台的,易於擴展。可以測試任何系統盡管蝗蟲是面向web的,但它幾乎可以用來測試任何系統。只要寫一個客戶,不管你想測試什么,用蝗蟲攻擊它!這是超級簡單!打算保持這種狀態。所有繁重的任務都被委派給gevent。其他測試工具的脆弱性是開發者創建蝗蟲的原因。
3、 locust產生是因為開發者厭倦了現有的解決辦法。他們都沒有解決正確的問題,沒有抓住要點,他們之前嘗試了Apache JMeter和Tsung。這兩種工具都可以使用,我們在工作中多次使用過前者。JMeter有一個UI,你可能會認為它是一件好事。但是,您很快就會意識到,通過一些點單擊界面“編碼”測試場景是一個PITA。其次,JMeter是線裝書。這意味着對於您想要模擬的每個用戶,您都需要一個單獨的線程。不用說,在一台機器上對成千上萬的用戶進行基准測試是不可行的。另一方面,Tsung並沒有這些線程問題,因為它是用Erlang編寫的。它可以利用光束本身提供的重量輕的過程,並愉快地放大。但是在定義測試場景時,Tsung和JMeter一樣有限。它提供了一個基於xml的DSL來定義用戶在測試時的行為。完成時顯示任何類型的圖形或報告都需要我們對測試生成的日志文件進行后期處理。只有這樣,你才能了解測試是如何進行的。不管怎樣,他們在創造蝗蟲的時候已經試圖解決這些問題。
一、安裝:
1、Locust在PyPI上可用,可以通過pip或easy_install安裝:pip install locustio
2、查看Locust可用選項:locust --help
3、在Windows上安裝蝗蟲在Windows上,運行pip安裝locustio應該可以工作。但是,如果沒有,很有可能可以通過首先為pyzmq、gevent和greenlet安裝預構建的二進制包來修復它。下載地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/,當你下載了.whl文件后,你 可以通過以下命令安裝:pip install name-of-file.whl
補充知識點:增加打開文件的最大數量限制機器上的每個HTTP連接都打開一個新文件(技術上是一個文件描述符)。操作系統可以為可打開的文件的最大數量設置一個低限制。如果限制小於測試中模擬用戶的數量,就會發生故障。將操作系統的默認最大文件數量限制增加到 比您希望運行的模擬用戶數量更高的數量。如何做到這一點取決於正在使用的操作系統。
注意:在Windows上運行蝗蟲應該可以很好地開發和測試負載測試腳本。但是,在運行大規模測試時,建議您在Linux機器上這樣做,因為gevent在Windows下的性能很差。
二、大家最關心的是如何使用locust去實戰,這一節先說一下基礎入門的,下面的代碼是完成一個查詢訂單列表接口的性能測試,有倆種編寫方式,先說第一種:
# 從locust中導入HttpLocust類(代表用戶),TaskSet(任務集類) from locust import HttpLocust, TaskSet # 查詢商品列表的接口 def test1(s): s.client.get('http://www.raincard.cn/api/v1/goods/list/admin/query') # 查詢訂單列表的接口 def test2(s): s.client.get('http://www.raincard.cn/api/v1/order/list/admin/query') class UserBehavior(TaskSet): # 創建一個子類繼承TaskSet任務集類(任務集類可以定義事件的各種屬性) tasks = {test2:2,test1:1} # 定義test2和test1事件的隨機比例,執行時會按照這個比例隨機請求這倆個事件 """ 創建一個子類繼承HttpLocust類,HttpLocust類它代表一個用戶,我們在其中定義一個模擬用戶在執行任務之間應該等待多長時間, 以及什么TaskSet類應該定義用戶的“行為”。任務集類可以嵌套。HttpLocust類繼承自Locust類,並添加了一個客戶端屬性, 該屬性是HttpSession的一個實例,可以用來發出HTTP請求。 """ class WebsiteUser(HttpLocust): host = 'http://www.raincard.cn/management/' # 在此處定義被測系統的地址 task_set = UserBehavior min_wait = 5000 # 執行倆個任務之間的最小等待時間 max_wait = 9000 # 執行倆個任務之間的最大等待時間
第二種方式:
""" 我們可以聲明任務的另一種方式(通常更方便)是使用@task """ from locust import HttpLocust, TaskSet, task class UserBehavior(TaskSet): @task(2) # 這個裝飾器代表test1這個任務執行的比例2,相對於test2來說是它的倆倍,也就是隨機請求時概率更大,因為是模擬用戶 #我們也不知道用戶操作哪個任務更頻繁,所以隨機 def test1(self): self.client.get('http://www.raincard.cn/api/v1/goods/list/admin/query') @task(1) def test2(self): self.client.get('http://www.raincard.cn/api/v1/order/list/admin/query') class WebsiteUser(HttpLocust): host = 'http://www.raincard.cn/management/' task_set = UserBehavior min_wait = 5000 max_wait = 9000
二、模擬用戶任務場景寫好以后,接下來就是運行,我啟動第二種方式文件:通過命令端啟動
我在window下寫的,cmd打開命令端:locust -f D:\Locust\locustfile.py --host=https://example.com (host后面是自己定義的被測系統的地址,用於標識的,在UI界面上等會可以看到,作用不大,如果在代碼中已經定義好了,此處host就就不用再定義了)
因為host我已經在代碼中已經定義好了,所以換這個啟動方式:locust -f D:\Locust\locustfile.py
三、看運行的ui界面,截圖如下:
后面我會繼續針對代碼這部分深入講解,今天只是入門,有興趣的可以關注下,最近更新會比較頻繁