Locust 介紹
Locust 是一個易於使用、分布式的負載測試工具,它可以對網站或其他系統進行負載測試,並計算出一個系統能夠承受多少的並發用戶。Locust完全基於事件,因此可以在一台機器上支持數千名並發用戶,與其他基於事件的應用相比,它不使用回調。與jmeter、loadrunner相比,Locust不需要笨重的UI或臃腫的xml,所有的用戶行為都是通過手動編寫代碼在實現,基於協程而不是回調。不過,Locust有一個整潔的HTML用戶界面,用來實時顯示測試結果的相關數據。
Locust 有以下幾個特點:
- 分布式和可擴展的-支持成千上萬的用戶(基於協程)
- 基於web的用戶界面(具有跨平台和易於擴展的特點)
- 可控制(所有事件I/O和協程任務都委托給gevent來替代測試工具執行)
Locust安裝
Locust支持版本Python2.7、3.3、3.4、3.5、3.6
Locust 在pypi上可用,可用通過pip或easy_install安裝。
pip install locustio
或
easy_install locustio
安裝ZeroMQ
如果您打算運行分布在多個進程/機器上的Locust,那就需要安裝pyzmq:
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 pyzmq16.0.2cp36cp36mwin32.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)。 那么你應該進入這樣的歡迎: