Load testing by Python Locust

更新於 發佈於 閱讀時間約 15 分鐘
raw-image

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/

Docs: http://docs.locust.io/en/stable/

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

設定concurrent users and spawn rate

即時會有統計數據可以看

即時會有統計數據可以看

requests per second and response time charts

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 - 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比較少比較好釐清問題,早點測試早點發現問題先處理成本也會比較低,祝福大家系統的品質透過測試都能越來越好。

留言
avatar-img
留言分享你的想法!
avatar-img
Sean Hsiao的沙龍
27會員
82內容數
Sean Hsiao的沙龍的其他內容
2025/04/23
2025年第一季財報電話會議重點摘要,包含特斯拉電動車銷售、自動駕駛、能源業務、Optimus機器人、以及關稅政策等重要資訊。財報顯示電動車銷售營收下滑20%,但能源業務持續成長,並預計2026年Robotaxi業務將指數型成長。Elon Musk預計5月起減少政府工作時間,回歸特斯拉。
Thumbnail
2025/04/23
2025年第一季財報電話會議重點摘要,包含特斯拉電動車銷售、自動駕駛、能源業務、Optimus機器人、以及關稅政策等重要資訊。財報顯示電動車銷售營收下滑20%,但能源業務持續成長,並預計2026年Robotaxi業務將指數型成長。Elon Musk預計5月起減少政府工作時間,回歸特斯拉。
Thumbnail
2025/04/02
當市場出現回檔修正,新聞與股市論壇總是充斥著各種聳動標題——「美國關稅政策引發經濟不確定性」、「AI 泡沫即將破裂」、「熊市來臨」等,使得許多投資人開始動搖,質疑自己的投資決策。此時與其恐慌,不如靜下心來,重新檢視幾個基本問題:是因為股價的漲跌來決定是否持有股票,還是真正了解並信任自己所投資的公司?
Thumbnail
2025/04/02
當市場出現回檔修正,新聞與股市論壇總是充斥著各種聳動標題——「美國關稅政策引發經濟不確定性」、「AI 泡沫即將破裂」、「熊市來臨」等,使得許多投資人開始動搖,質疑自己的投資決策。此時與其恐慌,不如靜下心來,重新檢視幾個基本問題:是因為股價的漲跌來決定是否持有股票,還是真正了解並信任自己所投資的公司?
Thumbnail
2025/03/31
家裡面也有即將邁入青春期的小孩,老婆也對小孩的教育以及未來非常緊張,總想著怎麼做、怎樣陪伴,才可以對小孩更好。剛好最近聽到股癌推薦這部關於青春期的影集《Adolescence》,就趁著假日看了一下。 看完《Adolescence》,心裡久久不能平靜。隔天早上醒來,想到——如果發生在自己孩子身上,必
Thumbnail
2025/03/31
家裡面也有即將邁入青春期的小孩,老婆也對小孩的教育以及未來非常緊張,總想著怎麼做、怎樣陪伴,才可以對小孩更好。剛好最近聽到股癌推薦這部關於青春期的影集《Adolescence》,就趁著假日看了一下。 看完《Adolescence》,心裡久久不能平靜。隔天早上醒來,想到——如果發生在自己孩子身上,必
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
👨‍💻 簡介 最近想要透過小實作來撰寫筆記,達到做中學的效果,因此就來實作個小爬蟲順便結合前面學到的package做一個小複習。
Thumbnail
👨‍💻 簡介 最近想要透過小實作來撰寫筆記,達到做中學的效果,因此就來實作個小爬蟲順便結合前面學到的package做一個小複習。
Thumbnail
本文將引導您使用簡單的 Header 組件,學習如何使用 render 和 screen 來渲染和查詢元素。我們將探索如何測試文字和字元計數功能,並使用 userEvent 模擬使用者操作。了解如何使用斷言來確保測試結果正確。同時,我們將處理包含 fetch 的異步測試,並介紹 waitFor 函數
Thumbnail
本文將引導您使用簡單的 Header 組件,學習如何使用 render 和 screen 來渲染和查詢元素。我們將探索如何測試文字和字元計數功能,並使用 userEvent 模擬使用者操作。了解如何使用斷言來確保測試結果正確。同時,我們將處理包含 fetch 的異步測試,並介紹 waitFor 函數
Thumbnail
Hi,大家好。我是茶桁。 上一节课,我们详细的介绍了文件读写的流程和原理,并用Python进行实际操作了一下。 那么这节课呢,我们利用之前所学的内容,尝试做一个小练习:建立一个登录注册系统。上节课我们在结尾的时候讲练习内容贴了出来,还记得要求吗?  实现功能:  1. 用户输入用户名和密码以及
Thumbnail
Hi,大家好。我是茶桁。 上一节课,我们详细的介绍了文件读写的流程和原理,并用Python进行实际操作了一下。 那么这节课呢,我们利用之前所学的内容,尝试做一个小练习:建立一个登录注册系统。上节课我们在结尾的时候讲练习内容贴了出来,还记得要求吗?  实现功能:  1. 用户输入用户名和密码以及
Thumbnail
使用顯性等待,以及讓我們的自動化網頁看起來有像測試的樣子 另外,readmoo電子書真的很方便啊
Thumbnail
使用顯性等待,以及讓我們的自動化網頁看起來有像測試的樣子 另外,readmoo電子書真的很方便啊
Thumbnail
相信有在開發Web應用的朋友應該對於Postman這套工具相當熟悉, 這套工具可以協助我們在產品尚未完成之前可以先進行一些基本的介接測試,甚至我們可以使用Postman去呼叫雲端的API,像是Google的語音辨識、文字翻譯、字典查詢…,這類大廠相信也都開放許多標準API(Application P
Thumbnail
相信有在開發Web應用的朋友應該對於Postman這套工具相當熟悉, 這套工具可以協助我們在產品尚未完成之前可以先進行一些基本的介接測試,甚至我們可以使用Postman去呼叫雲端的API,像是Google的語音辨識、文字翻譯、字典查詢…,這類大廠相信也都開放許多標準API(Application P
Thumbnail
一個網站可能除了首頁以外還會有其他的相關網站 例如/admin ,login/ ,home.php ,/root/等等 但是又不一定於是互聯網上就有一些words清單 像是 裡面就有存放各種可能的目錄名稱 例如給定一個網址在網址尾端增加/admin"有可能"就會連到後台 但是人手工一個一個去試去猜實
Thumbnail
一個網站可能除了首頁以外還會有其他的相關網站 例如/admin ,login/ ,home.php ,/root/等等 但是又不一定於是互聯網上就有一些words清單 像是 裡面就有存放各種可能的目錄名稱 例如給定一個網址在網址尾端增加/admin"有可能"就會連到後台 但是人手工一個一個去試去猜實
Thumbnail
Locust 介紹 An open source load testing tool. Define user behaviour with Python code, and swarm your system with millions of simultaneous users. 如果你也是py
Thumbnail
Locust 介紹 An open source load testing tool. Define user behaviour with Python code, and swarm your system with millions of simultaneous users. 如果你也是py
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News