Locust 介紹
Locust 是一個易於使用、分佈式的負載測試工具,它能夠對網站或其餘系統進行負載測試,並計算出一個系統可以承受多少的併發用戶。Locust徹底基於事件,所以能夠在一臺機器上支持數千名併發用戶,與其餘基於事件的應用相比,它不使用回調。與jmeter、loadrunner相比,Locust不須要笨重的UI或臃腫的xml,全部的用戶行爲都是經過手動編寫代碼在實現,基於協程而不是回調。不過,Locust有一個整潔的HTML用戶界面,用來實時顯示測試結果的相關數據。python
Locust 有如下幾個特色:web
- 分佈式和可擴展的-支持成千上萬的用戶(基於協程)
- 基於web的用戶界面(具備跨平臺和易於擴展的特色)
- 可控制(全部事件I/O和協程任務都委託給gevent來替代測試工具執行)
Locust安裝
Locust支持版本Python2.7、3.3、3.4、3.5、3.6windows
Locust 在pypi上可用,可用經過pip或easy_install安裝。瀏覽器
pip install locustio 服務器
或 併發
easy_install locustio分佈式
安裝ZeroMQ工具
若是您打算運行分佈在多個進程/機器上的Locust,那就須要安裝pyzmq:post
Pip install pyzmq性能
或
Easy_install pyzmq
在windows上安裝locust:
在Windows上,若是正確設置了構建環境,則運行pip install locustio可能會失敗。 在這種狀況下,在Windows上運行Locust的最簡單方法是首先爲pyzmq安裝預構建的二進制包(也可能爲gevent和greenlet安裝)。
你能夠在這裏找到一個非官方的預製python包集合:http://www.lfd.uci.edu/~gohlke/pythonlibs/
當您下載了預先構建的.whl文件時,可使用如下命令安裝它:
pip install pyzmq 16.0.2 cp36 cp36m win32.whl
一旦你完成了,你應該可以只是pip安裝locustio。在Windows上運行Locust應該能夠很好地開發和測試負載測試腳本。
可是,在運行大規模測試時,建議您在Linux機器上執行此操做,由於gevent在Windows下的性能不好。
安裝好後,使用locust --help 查看是否安裝成功。
下面是一個簡單的locustfile.py的簡單示例:
from locust import HttpLocust, TaskSet def login(l): l.client.post("/login", {"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) class WebsiteUser(HttpLocust): task_set = UserBehavior min_wait = 5000 max_wait = 9000
這裏咱們定義了許多Locust任務,它們是帶有一個參數的普通Python callables(一個Locust類實例)。 這些任務是在tasksattribute中的TaskSet類下收集的。 而後咱們有一個表明用戶的HttpLocust類,咱們在其中定義模擬用戶在執行任務之間應該等待多長時間,以及TaskSet類應該定義用戶的「行爲」。py:class:`TaskSet <locust.core.TaskSet>`s 能夠嵌套。
HttpLocust類繼承自Locust類,並添加了一個客戶端屬性,該屬性是HttpSession的一個實例,可用於發出HTTP請求。
咱們能夠經過更方便的方式聲明任務的另外一種方式是使用@taskdecorator.如下代碼等同於上述代碼:
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 login(self): self.client.post("/login", {"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)之間以及其餘用戶行爲之間指定每一個模擬用戶的最小和最大等待時間。
啓動locust
要使用上面的Locust文件運行Locust,若是它名爲locustfile.py並位於當前工做目錄中,咱們能夠運行:
locust --host=http://localhost.com
若是Locust文件位於子目錄下和/或名稱不一樣於locustfile.py,請使用它來指定它 -f :
locust -f locust_files/my_locust_file.py --host=http://localhost.com
而後咱們將啓動任意數量的從屬進程:
locust -f locust_files/my_locust_file.py --slave --host=http://localhost.com
若是咱們想在多臺機器上運行分佈式Locust,咱們還必須在啓動從機時指定主機(在運行分佈在單臺機器上的Locust時不須要這樣作,由於主機主機默認爲127.0.0.1):
locust -f locust_files/my_locust_file.py --slave --master-host=192.168.0.100 --host=http://localhost.com
您可能但願經過csv文件記錄您的Locust結果。 在這種狀況下,有兩種方法能夠作到這一點:
首先,在運行Web服務器時,您能夠從localhost檢索csv:localhost:8089/stats/requests/csv 和 localhost:8089/stats/distribution/csv。 其次,您可使用標誌運行Locust,該標誌將按期保存csv文件。 若是您計劃使用--no-web標誌以自動方式運行Locust,這將特別有用。
locust -f locust_files/my_locust_file.py --csv=foobar --no-web -n10 -c1
若是您但願更快(或更慢)寫入,您還能夠自定義寫入的頻率:
import locust.statslocust.stats.CSV_STATS_INTERVAL_SEC = 5 # default is 2 seconds
打開Locust的Web界面
使用上述命令行之一啓動Locust後,應打開瀏覽器並將其指向http://127.0.0.1:8089(若是您在本地運行Locust)。 那麼你應該進入這樣的歡迎: