Load testing by Python Locust

閱讀時間約 15 分鐘

Locust 介紹

An open source load testing tool. Define user behaviour with Python code, and swarm your system with millions of simultaneous users.
如果你也是python 使用者,這邊介紹一個效能測試的工具locust,他是直接用python code去寫測試script,自由度比較高,不像老牌測試工具jmeter 是需要GUI操作,假設我們有一個登入情境,密碼是需要RSA加密,那用python 可以去引用一些第三方library去完成這個任務,或是一些比較複雜行為,如果是jmeter沒有在他功能範圍內,就不知道要怎麼使用。
Official Site: https://locust.io/
Installation
pip install locust

Write a locust script

這邊一個範例是先登入拿取token後去測試/files API
from locust import HttpUser, task, between
import json
from test_data import *
import random


class WebsiteTestUser(HttpUser):
wait_time = between(0.5, 1)
host = "http://host_address"

def on_start(self):
        """ on_start is called when a Locust start before any task is scheduled """
if len(USER_CREDENTIALS) > 0:
account, password = USER_CREDENTIALS.pop()
self.access, self.refresh = self.login_to_get_token(account, password)

def on_stop(self):
""" on_stop is called when the TaskSet is stopping """
pass

def login_to_get_token(self, account, password):
path = '/login'
headers = {'Content-Type': 'application/json'}
payload = {
"email": account,
"password": password
}
resp = self.client.post(url=path, headers=headers, data=json.dumps(payload))

return resp.json()['access_token'], resp.json()['refresh_token']

def refresh_token(self, token):
url = "/refreshToken"
headers = {'Content-Type': 'application/json'}
payload = {"refresh_token": token}
resp = self.client.post(url, headers=headers, data=json.dumps(payload))
self.access = resp.json()['access_token']
self.refresh = resp.json()['refresh_token']

@task(1)
def get_file(self):
uuid_list = [
'7ca74e17-ac8a-48fc-84ed-0e947cb4c333',
'666e4a5b-6704-41e9-b08d-b18dd1d50c0f',
'c8c17345-d533-41b0-bbd5-5e39d023fcb6',
]
path = f'/files/{random.choice(uuid_list)}'
headers = {'Content-Type': 'application/json', 'Authorization': f'Bearer {self.access}'}
with self.client.get(url=path, headers=headers, catch_response=True) as response:
if response.status_code == 401 and response.json()['status'] == "UnauthorizedError":
self.refresh_token(self.refresh)
他就是一個正常的python module,我們可以直接import 需要的packages
from locust import HttpUser, task, between
import json
from test_data import *
import random
這邊define一個class 繼承HttpUser,讓我們可以用來發送 HTTP requests去測試我們要測試的API或系統。between 讓simulated users在一個隨機等待時間範圍區間發送requests,也可以用constant去固定每個task中間的等待時間。
class WebsiteTestUser(HttpUser):
wait_time = between(0.5, 1)
@task decorator 可以對要測試的task設定權重比例,Locust會creates a greenlet (micro-thread)讓每一個模擬的user去呼叫我們主要要被測試的task methods,其他沒有@task decorator的internal methods如範例中的refresh_token 就只會在我們要呼叫的時候被使用,self.client attribute 可以用來發送 HTTP calls,也會被記錄在locust報告的統計資訊中。
@task(1)
def get_file(self):
    ...
    with self.client.get(url=path, headers=headers, catch_response=True) as response:
    ...

Run the script with GUI

locust -f locust_file.py
然後可以打開browser 到預設的port 8089, http://localhost:8089/ 去設定預期要模擬的人數跟每一秒要增加多少人到預期的量。
設定concurrent users and spawn rate
即時會有統計數據可以看
requests per second and response time charts
也能在過程中去增減模擬的使用者

Running without the web UI

如果不用web UI也可以用terminal帶一些需要用到的flag去跑,--headless 代表不用web UI,-u代表要幾個users,-r代表spawn rate,-t 代表要跑多少時間,--html代表要產生的html report。
locust -f locust_file.py --headless -u 5 -r 1 -t 360s --html test_report.html
也可以用設定config file的方式去跑
locust --config=/load_testing/config.conf
config file example
locustfile = /load_testing/locust_file.py
headless = true
host = http://example.com
users = 10
spawn-rate = 1
run-time = 10s
html = locust_report.html

Trigger locust test with Gitlab CI

Gitlab CI - run pipeline
也可以利用Gitlab CI 設定variables在config file上,去跑測試
config file example
locustfile = /builds/project_name/load_testing/RUN_TARGET.py
headless = true
host = https://example.com
users = RUN_USERS
spawn-rate = 1
run-time = RUN_TIME
html = locust_report.html
Gitlab CI Yaml example
stages:
- test
locust:
stage: test
variables:
TARGET: ""
USERS: "1"
TIME: "10s"
before_script:
- cat /builds/project_name/load_testing/__locust.conf
- sed -e 's/RUN_TARGET/'$TARGET'/1' -e 's/RUN_USERS/'$USERS'/1' -e 's/RUN_TIME/'$TIME'/1' /builds/project_name/load_testing/__locust.conf > /builds/project_name/load_testing/locust_run.conf
- cat /builds/project_name/load_testing/locust_run.conf
script:
- locust --config=/builds/project_name/load_testing/locust_run.conf
rules:
- if: $TARGET
allow_failure: true
artifacts:
when: always
paths:
- locust_report.html
expire_in: 1 week
Another Gitlab CI Yaml example 不用config file也不用variables
stages:
- test
locust:
stage: test
image: /runner-image/qa-python:3.7.7-20220719
variables:
GIT_SSL_NO_VERIFY: "1"
script:
- locust -f load_testing/test1.py --headless -u 10 -r 1 -t 360s --html report1.html
- locust -f load_testing/test2.py --headless -u 10 -r 1 -t 360s --html report2.html
- locust -f load_testing/test3.py --headless -u 10 -r 1 -t 360s --html report3.html
rules:
- changes:
- requirements.txt
allow_failure: true
artifacts:
when: always
paths:
- report1.html
- report2.html
- report3.html
expire_in: 1 week

總結

這邊簡單介紹效能測試工具locust,也介紹了幾種方式去跑這個測試工具,透過效能測試我們可以知道我們測試的系統大概可以承受多少的交易量,反應時間是否有達到使用者都能順暢使用的標準,或是業務上應該要達到的標準,超出負荷的時候,系統是怎麼樣回應,下降回可承受的量是否能回復正常運行,在跑長時間測試的時候看看回應是不是都是很穩定,是否有不如預期的行為產生,看看是硬體資源(CPU/Memory/Disk IO)是否需要調整,看看網路端是否異常,DB連線數量上面是否被限制,又或是程式碼效能需要再調整,總之效能測試是一種很重要的非功能性測試,開發人員或測試人員可以在開發好一個API的時候就先測試看看,比較底層的API或服務,可能dependency比較少比較好釐清問題,早點測試早點發現問題先處理成本也會比較低,祝福大家系統的品質透過測試都能越來越好。
20會員
65內容數
留言0
查看全部
發表第一個留言支持創作者!
Sean Hsiao的沙龍 的其他內容
電動車龍頭 特斯拉 Tesla, Inc 相信大家一提到電動車就會直覺聯想到特斯拉,特斯拉到目前為止也是全球電動車銷量冠軍,他的出現以及科技創新也對全球車市以及對傳統車廠帶來一定的壓力與影響,也讓我們消費者多了更多選擇,這邊分享一下在現任CEO, Elon Musk 接手特斯拉之前,之前的創辦人Ma
FIFA World Cup Qatar 2022 四年一度的世界盃今天在卡達開啟序幕,地主隊卡達對上厄瓜多開賽不到五分鐘 馬上就遇到經典問題,什麼是越位? 足球比賽中,進攻一方在踢或觸及球的瞬間(球門球、角球和界外擲球除外),進攻方球員比對方球員(守門員除外)離對方球門線更近,而且有干擾對方、干
電動車龍頭 特斯拉 Tesla, Inc 相信大家一提到電動車就會直覺聯想到特斯拉,特斯拉到目前為止也是全球電動車銷量冠軍,他的出現以及科技創新也對全球車市以及對傳統車廠帶來一定的壓力與影響,也讓我們消費者多了更多選擇,這邊分享一下在現任CEO, Elon Musk 接手特斯拉之前,之前的創辦人Ma
FIFA World Cup Qatar 2022 四年一度的世界盃今天在卡達開啟序幕,地主隊卡達對上厄瓜多開賽不到五分鐘 馬上就遇到經典問題,什麼是越位? 足球比賽中,進攻一方在踢或觸及球的瞬間(球門球、角球和界外擲球除外),進攻方球員比對方球員(守門員除外)離對方球門線更近,而且有干擾對方、干
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
▪︎咒語描述: 遊戲的Loading page。上面有2個按鈕,分別是:Enter、Back, 寫實3D插畫風格。 故事內容是關於: <一隻小象坐在一朵雲彩上> 在一片遙遠的土地上,有一個被世人遺忘的秘密森林。森林上面常常有一朵雲彩,雲彩上面,坐著一隻小象。
Thumbnail
之前賽門寫了一篇關於如何購買便宜的SIM卡並且註冊開通,但後來我又再次去了菲律賓我希望可以持續使用我已經註冊的SIM卡跟號碼,要如何使用呢? 還有如果我想要購買上網包,要怎麼買怎麼選比較划算? 一開始我也不懂,但後來我研究了幾次終於搞懂,這篇就來教大家怎麼儲值跟買划算的網路包
Thumbnail
In the current UI/UX web design & app design trends, loading animations have become an indispensable element.
Thumbnail
最近正好在研究「silero-vad」這套工具, 但根據官方教學,預設的載入方式會從網路上進行下載模型的動作: model, utils = torch.hub.load(repo_or_dir='snakers4/silero-vad',
Thumbnail
10月主打萬聖節,雖然我已經沒有玩飄流了,但是想到以前做的面板裡面好像都沒有萬聖節,所以就乾脆來做一個。 之前通常都只做道具欄,選擇是多樣了,但最後也只能套用一種,感覺有點浪費,所以這次變成做一個道具欄+應景的Load畫面。
Thumbnail
這篇文章將會講述場景 (Scene) 轉換的程式,將會介紹載入場景的兩種主要方法,並且詳細介紹同步載入的程式與範例。
Thumbnail
本筆記會以簡單的例子說明,如何在Laravel中進行unit test 與 feature test。 phpunit.xml則是設定檔,可以設定哪些檔案要做測試,哪些要排除在外等等。 使用命令建立新的test case: 建立feature test: 建立unit test: 執行測試:
Thumbnail
Loadteam如何使用? 它屬於放置型的程式,並不需要做任何的動作,只要讓他在背景執行便可以了。 只要電腦不關機,網路不斷開,那就會自動運行,好處是可以利用多於一台電腦挖礦,然後集合收益在同一個帳號,這樣的話便能把收益最大化了。 Loadteam如何出金? Loadteam開戶優惠 【個人網站】
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
▪︎咒語描述: 遊戲的Loading page。上面有2個按鈕,分別是:Enter、Back, 寫實3D插畫風格。 故事內容是關於: <一隻小象坐在一朵雲彩上> 在一片遙遠的土地上,有一個被世人遺忘的秘密森林。森林上面常常有一朵雲彩,雲彩上面,坐著一隻小象。
Thumbnail
之前賽門寫了一篇關於如何購買便宜的SIM卡並且註冊開通,但後來我又再次去了菲律賓我希望可以持續使用我已經註冊的SIM卡跟號碼,要如何使用呢? 還有如果我想要購買上網包,要怎麼買怎麼選比較划算? 一開始我也不懂,但後來我研究了幾次終於搞懂,這篇就來教大家怎麼儲值跟買划算的網路包
Thumbnail
In the current UI/UX web design & app design trends, loading animations have become an indispensable element.
Thumbnail
最近正好在研究「silero-vad」這套工具, 但根據官方教學,預設的載入方式會從網路上進行下載模型的動作: model, utils = torch.hub.load(repo_or_dir='snakers4/silero-vad',
Thumbnail
10月主打萬聖節,雖然我已經沒有玩飄流了,但是想到以前做的面板裡面好像都沒有萬聖節,所以就乾脆來做一個。 之前通常都只做道具欄,選擇是多樣了,但最後也只能套用一種,感覺有點浪費,所以這次變成做一個道具欄+應景的Load畫面。
Thumbnail
這篇文章將會講述場景 (Scene) 轉換的程式,將會介紹載入場景的兩種主要方法,並且詳細介紹同步載入的程式與範例。
Thumbnail
本筆記會以簡單的例子說明,如何在Laravel中進行unit test 與 feature test。 phpunit.xml則是設定檔,可以設定哪些檔案要做測試,哪些要排除在外等等。 使用命令建立新的test case: 建立feature test: 建立unit test: 執行測試:
Thumbnail
Loadteam如何使用? 它屬於放置型的程式,並不需要做任何的動作,只要讓他在背景執行便可以了。 只要電腦不關機,網路不斷開,那就會自動運行,好處是可以利用多於一台電腦挖礦,然後集合收益在同一個帳號,這樣的話便能把收益最大化了。 Loadteam如何出金? Loadteam開戶優惠 【個人網站】