目次
イナゴ
Locust は比較的一般的なパフォーマンス テスト ツールで、最下層は geventに基づいています。公式の紹介では、 これは使いやすく、スクリプト化可能で拡張可能なパフォーマンス テスト ツールであり、UI や制限のあるドメイン固有の言語に陥ることなく、通常の Python コードを使用してユーザーの動作を定義できるようになります。
Locust
無制限のスケーラビリティを備えています (クライアント Python コードが提供されている限り、すべてのプロトコルのパフォーマンス テストに適しています)。
この記事は、パフォーマンス自動化比較プラットフォームを開発する際に関連する内容を学習した記録です。
イナゴを選ぶ理由
特徴 | 説明する |
---|---|
オープンソース無料 | Locust はオープンソース プロジェクトであり、自由に使用およびカスタマイズできます。 |
学びやすく使いやすい | Python で書かれており、学習曲線が緩やかで、豊富なライブラリとコミュニティ サポートが備わっています。 |
高い拡張性と柔軟性 | 必要に応じてテストをカスタマイズして、アプリケーションのパフォーマンスをより正確に評価できます。サードパーティのプラグインが多数あり、拡張も簡単です。 |
リアルタイム統計 | リアルタイム統計機能と Web インターフェイスを提供し、テスト結果の監視と分析を容易にします。 |
統合が簡単 | 継続的統合および継続的展開ツールと簡単に統合して、パフォーマンス テストを自動的に実行できます。 |
大規模な性能テストに最適 | 分散サポートにより、複数のマシンでテストを実行して多数のユーザーをシミュレートすることが簡単になります。これにより、大規模なパフォーマンス テストに最適になります。 |
Locust のコアコンポーネント
マスターノード
テストの開始と停止、タスクの分散、テスト結果の収集と要約など、テスト プロセス全体の調整と管理を担当します。
ワーカーノード
実際にテストタスクを実行するノードは、マスターノードによって割り当てられたタスクに従ってユーザーの動作をシミュレートします。
ウェブUI
ユーザーがテスト結果を表示したり、テストの進行状況を監視したりするのに便利な、視覚的なテスト インターフェイスを提供します。
テストスクリプト (ロードテストスクリプト)
ユーザーの動作をシミュレートするロジックとパラメーターを定義するテスト スクリプトは、ワーカー ノードによって実行されます。
Locust は内部で呼び出しリンクを実行します
タイミング図は次のとおりです。
クリックするとシーケンス図の説明が表示されます
RunnerEventHookEnvironmentUserTaskSetstart()1fire()2環境を作成してユーザー クラスを追加3ユーザーを開始してタスクを実行4run()5リクエストを送信して統計を記録6他のユーザーが終了するまで待つ7戻る8ユーザーとタスクを停止9stop()10fire()11RunnerEventHookEnvironmentUserTaskSet
注: fire() メソッドは、Locust の EventHook クラスのメソッドであり、イベントを起動するために使用されます。Locust のテスト ライフ サイクルでは、テストの開始、テストの終了、ユーザーの開始、ユーザーのタスクの完了など、トリガーできるイベントが複数あります。これらのイベントが発生すると、EventHook クラスは fire() メソッドを呼び出し、そのイベントに登録されているすべてのコールバック関数にイベントを渡します。
イナゴの練習
イナゴのインストール
ステップ | 説明する |
---|---|
クリックして Python3.7 以降のインストールにジャンプします | 新しいバージョンのアノテーションには Python3.7 以降が必要です |
pip install locust |
イナゴをインストールする |
埋め込むlocust |
インストールが成功したかどうかを確認する |
$ locust -V
locust 2.15.1 from /Users/bingohe/Hebinz/venvnew/lib/python3.9/site-packages/locust (python 3.9.17)
開始例
locust を使用してユースケースを作成する場合、構成よりも規約が重要です。
test_xxx (一般的なテスト フレームワーク規則)
dockerfile (docker 規則)
locustfile.py (locust 規則)
# locustfile.py
from locust import HttpUser, task
class HelloWorldUser(HttpUser): # 父类是个User,表示要生成进行负载测试的系统的 HTTP“用户”。每个user相当于一个协程链接 ,进行相关系统交互操作
@task # 装饰器来标记为一个测试任务, 表示用户要进行的操作:访问首页 → 登录 → 增、删改查
def hello_world(self):
wait_time = between(1, 5)
# self.client发送 HTTP 请求,模拟用户的操作
self.client.get("/helloworld")
テストを開始する
GUIモード開始 locust
ファイルのあるディレクトリでlocustfile.py
コマンドを直接実行しlocust
、次にアクセスして、http://0.0.0.0:8089/
次のインターフェイスを確認します。
$ locust
[2023-07-06 16:15:16,868] MacBook-Pro.local/INFO/locust.main: Starting web interface at http://0.0.0.0:8089 (accepting connections from all network interfaces)
[2023-07-06 16:15:16,876] MacBook-Pro.local/INFO/locust.main: Starting Locust 2.15.1
詳細な指標:
- ユーザー数 シミュレートされたユーザーの数。デフォルトは 1 です。
- Spawn rate : 生産数 (1 秒あたり)、 =>jmeter : ランプアップ期間 (秒単位)、デフォルト 1
- ホスト (例: http://www.example.com ) => テスト ターゲット SVR の絶対アドレス
ホストを入力して「開始」をクリックすると、テスト対象のサービスに対してリクエストが行われますhttp://{host}/helloworld
。リクエストの統計は次のとおりです。
「WebUI」タブの説明:
タブ名 | 機能説明 |
---|---|
新しいテスト | このボタンをクリックして、シミュレートされる仮想ユーザーの総数と 1 秒あたりに開始される仮想ユーザーの数を編集します |
統計 | JMeter の Listen に似た集計レポート |
チャート | さまざまな時点での 1 秒あたりの完了リクエスト数 (RPS)、応答時間、仮想ユーザー数などのテスト結果の傾向を示す曲線表示グラフ |
失敗 | 失敗したリクエストのインターフェースを表示する |
例外 | 異常なリクエストの表示インターフェイス |
データのダウンロード | テスト データ ダウンロード モジュールでは、統計、応答時間、例外の 3 種類のダウンロードを CSV 形式で提供します。 |
Webui モードには多くの制限があり、主にデバッグに使用されますが、次に説明するコマンド ライン モードがより一般的に使用されることに注意してください。
コマンドラインモードの開始 locust
locust -f locustfile.py --headless -u 500 -r 10 --host http://www.example.com -t 1000s
フレームワークはコマンドを通じてlocust
実行され、共通パラメータは次のとおりです。
パラメータ | 意味 |
---|---|
-f また --locustfile |
テストスクリプトファイルへのパスを指定します |
--headless |
非 GUI モードでテストを実行する |
-u また --users |
同時ユーザー数を指定する |
-r また --spawn-rate |
ユーザー生成率 (つまり、1 秒あたりに生成されるユーザーの数) を指定します。 |
-t また --run-time |
テストを実行する最大時間 (秒単位) を指定します。 --no-web とともに使用します。 |
--csv |
テスト結果をCSVファイルに出力 |
--html |
テスト結果をHTMLレポートとして出力 |
--host また -H |
テスト対象のサービスのアドレスを指定します |
-L |
ログレベル、デフォルトはINFOです |
チェックポイント(アサーション)
デフォルトでは、Locust は HTTP ステータス コードに基づいてリクエストが成功したかどうかを判断します。200 ~ 399 の範囲の HTTP ステータス コードを持つ応答の場合、Locust はそれらが成功したと見なします。HTTP ステータス コードが 400 ~ 599 の応答の場合、Locust はそれらを失敗として扱います。
応答の内容やその他の条件に基づいてリクエストが成功したかどうかを判断する必要がある場合は、手動でチェックポイントを設定する必要があります。
- self.client によって提供される catch_response=True パラメーターを使用し、locust によって提供される ResponseContextManager クラスの context メソッドを追加して、チェックポイントを手動で設定します。
success
ResponseContextManager には、成功と失敗を宣言する 2 つのメソッド、つまりとがありますfailure
。このうち、失敗メソッドではパラメータを渡す必要があり、その内容が失敗の理由になります。
from locust import HttpUser, task, between
class MyUser(HttpUser):
# 思考时间:模拟真实用户在浏览应用程序时的行为
wait_time = between(1, 5)
@task
def my_task(self):
# 基于Locust提供的ResponseContextManager上下文管理器,使用catch_response=True 参数来捕获响应,手动标记成功或失败,
with self.client.get("/some_page", catch_response=True) as response:
# 检查状态码是否为200且响应中包含 "some_text"
if response.status_code == 200 and "some_text" in response.text:
# 如果满足条件,标记响应为成功
response.success()
else:
# 如果条件不满足,根据具体情况生成错误信息
error_message = "Unexpected status code: " + str(response.status_code) if response.status_code != 200 else "Expected text not found in the response"
# 标记响应为失败,并报告错误信息
response.failure(error_message)
重量比
異なる比率を要求する必要がある場合、Locust では、@task
デコレータでパラメータを設定することでweight
タスクに重みを割り当てることができます。重みが大きいほど、タスクが実行される頻度が高くなります。
from locust import HttpUser, task, between
class MyUser(HttpUser):
wait_time = between(1, 5)
# 设置权重为3,这个任务将被执行的频率更高
@task(3)
def high_frequency_task(self):
self.client.get("/high_frequency_page")
# 设置权重为1,这个任务将被执行的频率较低
@task(1)
def low_frequency_task(self):
self.client.get("/low_frequency_page")
この例では、high_frequency_task
タスクの重みを 3 に設定し、low_frequency_task
タスクの重みを 1 に設定します。これは、タスクを実行するユーザーをシミュレートする場合、タスクがそのタスクの 3 倍の頻度でhigh_frequency_task
実行されることを意味します。low_frequency_task
重みを設定することで、実際のニーズに応じてパフォーマンス テストのさまざまなタスクの実行頻度を調整できます。
クリックすると、Locust のウェイトの実装原理が表示されます。
パラメータ化する
現実の世界では、通常、ユーザーの行動は多様です。異なるデバイス、オペレーティング システム、ネットワーク条件などを使用する場合があります。これらのシナリオをより適切にシミュレートするには、テストでさまざまなパラメーターを使用する必要があります。
パフォーマンス テストでは、パラメータ化は非常に重要な技術的手段です。これにより、異なるデータセットを使用して同じテスト シナリオを実行できるようになり、現実世界のユーザーの行動をより適切にシミュレートできます。一般的に使用されるパラメータ化方法は 2 つあります。
Locust の組み込みパラメーター化機能を使用する
from locust import HttpUser, task, between
from locust.randoms import random_string, random_number
class MyUser(HttpUser):
wait_time = between(1, 5)
@task
def random_data(self):
random_str = random_string(10)
random_num = random_number(0, 100)
self.client.post("/random", json={"text": random_str, "number": random_num})
外部ファイルからパラメータを読み取る
ホワイトリストとして設定された認証セッションを例に挙げます。
import csv
from locust import HttpUser, task
class CSVReader:
def __init__(self, file, **kwargs):
try:
file = open(file)
except TypeError:
pass
self.file = file
self.reader = csv.reader(file, **kwargs) # iterator
def __next__(self):
try:
return next(self.reader)
except StopIteration:
# 如果没有下一行,则从头开始读
self.file.seek(0, 0)
return next(self.reader)
session = CSVReader("session.csv")
class MyUser(HttpUser):
@task
def index(self):
customer = next(ssn_reader)
self.client.get(f"/pay?session={customer[0]}")
鬼ごっこ
ではLocust
、タグ (Tag) はタスクを分類およびフィルタリングするために使用されるメソッドです。タスクにタグを追加すると、Locust
特定のタグを持つタスクのみが実行時に実行されます。これは、特定のシナリオのパフォーマンス テストを実行する場合や、多数のタスクを整理する場合に役立ちます。
使用するシーン
場合によっては、同じファイルに複数のテスト シナリオを記述しますが、実行時に一部のテスト シナリオだけを実行したいことがあります。つまり、テスト ファイルに複数のタスクがある場合、タスクにラベルを付けることでタスクを分類し、@tag
test 、--tags name
ラベルを使用して指定されたタスクを実行します。
タグを使用した例を次に示します。
from locust import HttpUser, task, between, tag
class MyUser(HttpUser):
wait_time = between(1, 5)
# 给任务添加一个名为 "login" 的标签
@tag("login")
@task
def login_task(self):
self.client.post("/login", json={"username": "user", "password": "pass"})
# 给任务添加一个名为 "profile" 的标签
@tag("profile")
@task
def profile_task(self):
self.client.get("/profile")
# 给任务添加两个标签:"shopping" 和 "checkout"
@tag("shopping", "checkout")
@task
def checkout_task(self):
self.client.post("/checkout")
この例では、3 つのタスクのそれぞれに異なるラベルを追加しました。login_task
タスクには"login"
タグがあり、profile_task
タスクには"profile"
タグがあり、checkout_task
タスクには 2 つのタグがあり"shopping"
ます"checkout"
。
Locust を実行するときに、--tags
およびオプションを使用して--exclude-tags
、実行または除外するタグを指定できます。たとえば、"login"
タグを含むタスクのみを実行するには、次を実行できます。
locust --tags login
タグ付きのタスクを除外するには"shopping"
、次のコマンドを実行できます。
locust --exclude-tags shopping
このようにして、コードを変更せずに、必要に応じてシナリオ固有のパフォーマンス テストを実行できます。
クリックすると、Locust 属性でタグを指定する方法が表示されます。
集合場所
ランデブーポイントとは何ですか?
ランデブー ポイントは仮想ユーザーを同期するために使用され、タスクがまったく同時に実行されるようにします。[テストプラン]では、1,000人の同時データ送信に耐えられるシステムが必要な場合がありますが、データ送信操作の前にランデブーポイントを追加することで、仮想ユーザーがデータ送信のためのランデブーポイントに向かう際に、 、同時に実行しているユーザーの数を確認します 集合場所に到着したときに、1000 人未満の場合は、すでに集合場所に到着しているユーザーがここで待機しています 集合場所で待機しているユーザーの数が到達したときテスト計画の要件を満たすために、1,000 人が同時にデータを送信します。
注: Locust フレームワーク自体はランデブー ポイントの概念を直接カプセル化していないため、gevent 同時実行メカニズムと gevent ロックを使用して間接的に実装する必要があります。
Locust でランデブーを実装する前に、まず 2 つの概念を理解します。
gevent
のSemaphore
セマフォlocust
イベントフックインall_locusts_spawned
セマフォ
セマフォは、共有リソースへのアクセスを制御するために使用される同期プリミティブです。これは、コンピューター サイエンスと同時プログラミングにおける重要な概念であり、1960 年代に有名なコンピューター科学者エドガー ダイクストラによって最初に提案されました。セマフォは、マルチスレッド環境またはマルチプロセス環境でクリティカル セクションの問題を解決し、共有リソースへの競合アクセスを防ぐために使用されます。
クリックすると「セマフォ」の実装原理が表示されます
all_locusts_spawned イベント
イベントは Locust において非常に重要な概念です。イベントを使用すると、Locust ライフサイクルの特定の瞬間にカスタム アクションを実行できます。これらのイベントをリッスンして処理することで、Locust の機能を拡張してテストのニーズを満たすことができます。
spawning_complete
これは、Locust 内のイベントであり、すべての Locust ユーザー (ユーザー) が生成されたことを示します。Locust がテストの実行とユーザーの生成を開始すると、徐々にユーザー インスタンスが作成されます。すべてのユーザーが作成されると、spawning_complete
イベントが発生します。このイベントに対して、ログ メッセージの出力、統計の収集、その他のカスタム アクションの実行など、いくつかの特定のアクションを実行できます。
イベントをリッスンするには 、 イベント フックをspawning_complete
使用できます 。locust.events.spawning_complete
例えば:
from locust import events
@events.spawning_complete.add_listener
def on_spawning_complete():
print("All users have been spawned!")
この例では、すべてのユーザーが生成されたときに、「すべてのユーザーが生成されました!」というメッセージを出力します。必要に応じて他の操作を置き換えることができます。
クリックして「Locust」ライフサイクルの他のイベントを表示します
上記の 2 つの概念を理解した後は、次の 2 つの手順を実行するだけです。
- スクリプトの起動時に、all_locust_spawned.acquire() を使用してプロセスをブロックします。
- すべてのユーザーが作成されたときに all_locust_spawned.release() をトリガーする関数を作成します。
サンプルコード:
from locust import HttpUser, task, between
from gevent.lock import Semaphore
from locust import events
all_locust_spawned = Semaphore()
all_locust_spawned.acquire() # 阻塞
class MyUser(HttpUser):
wait_time = between(1, 1)
def on_start(self):
global all_locust_spawned
all_locust_spawned.wait(3) # 同步锁等待时间
@task
def task_rendezvous(self):
self.client.get("/rendezvous")
# 添加集合点事件处理器
@events.spawning_complete.add_listener # 所有的Locust实例产生完成时触发
def on_spawning_complete(**_kwargs):
global all_locust_spawned
all_locust_spawned.release()
配布された
多数の同時ユーザーが必要で、単一のコンピューターではこの状況をシミュレートするのに十分な負荷を生成できない可能性がある場合、分散ストレス テストでこの問題を解決できます。ストレス テストを複数のコンピューターに分散することで、より大きな負荷を生成できます。システムのパフォーマンスをより正確に評価できます。
イナゴの限界
Locust は Python の asyncio ライブラリを使用して非同期 I/O を実装します。これは、マルチコア CPU のパフォーマンスを最大限に活用できることを意味します。ただし、Python の Global Interpreter Lock (GIL) の制限により、単一の Python プロセスはマルチコア CPU を完全に活用できません。
この問題を解決するために、Locust は 1 台のコンピューター上で複数のワーカー ノードを実行することをサポートしており、マルチコア CPU のパフォーマンスを最大限に活用できます。
単一のコンピューター上で複数のスレーブ ノードを実行する場合、各スレーブ ノードは別個のプロセスで実行され、GIL の制限が回避されます。これにより、マルチコア CPU のパフォーマンスを最大限に活用し、より大きな負荷を生成できます。
スタンドアロン マスター/スレーブ モード
注: スレーブ ノードの数は、マシンのプロセッサの数以下である必要があります。
スタンドアロン マスター/スレーブ モードでは、マスター ノードとスレーブ ノードの両方が同じコンピューター上で実行されます。このモードは、ローカル開発環境、またはマルチコア CPU を搭載した単一サーバーでのストレス テストに適しています。スタンドアロン マスター/スレーブ モードで分散ストレス テストを実装する手順は次のとおりです。
-
Locust をインストールする: Locust をコンピュータにインストールし、
pip install locust
コマンドを使用してインストールします。 -
Locust テスト スクリプトを作成する: マスター ノードとスレーブ ノードで実行される Locust テスト スクリプトを作成します。このスクリプトを として保存します
locustfile.py
。 -
マスター ノードを起動する: コンピューター上でコマンドを実行して
locust --master
マスター ノードを起動し、デフォルト ポート (8089) で待機します。 -
スレーブ ノードを開始する: コンピューター上でコマンドを実行して、
locust --worker --master-host 127.0.0.1
スレーブ ノードを開始します。必要に応じて複数のスレーブ ノードを起動できます。 -
分散ストレス テストを実行します。 Locust の Web インターフェイス ( http://127.0.0.1:8089 ) にアクセスしてテストを開始します。
スタンドアロン モードで、各スレーブ ノードを異なる CPU で実行する方法
クリックすると、スタンドアロン モードで各スレーブ ノードが異なる CPU でどのように実行されるかを確認できます。
マルチマシンマスタースレーブモード
動作は基本的にスタンドアロンモードと同様で、LocustのWebインターフェースにアクセスする際はマスターノードのアドレス(http://MASTER_IP_ADDRESS:8089)にアクセスします。
マスターノードとスレーブノードはネットワークを介して通信するためです。したがって、マスターノードとスレーブノードのコンピュータを選択する際には、それらの間のネットワーク接続がスムーズであることを確認する必要があります。また、正確なテスト結果を得るには、マスター ノードとスレーブ ノード間のネットワーク遅延が低いことを確認することが重要です。
分散モードのコマンドパラメータ
コマンドパラメータ | 説明する |
---|---|
--master |
現在の Locust インスタンスをマスター ノードとして実行します。 |
--worker |
現在の Locust インスタンスをワーカー ノードとして実行します。 |
--master-host |
マスターノードのIPアドレスまたはホスト名を指定します。デフォルト値は です 127.0.0.1 。 |
--master-port |
マスターノードのポート番号を指定します。デフォルト値は です 5557 。 |
--master-bind-host |
マスターノードがバインドされている IP アドレスまたはホスト名を指定します。デフォルトは * (すべてのインターフェイス) です。 |
--master-bind-port |
マスターノードがバインドするポート番号を指定します。デフォルト値は です 5557 。 |
--expect-workers |
マスターが接続すると予想されるスレーブ ノードの数を指定します。デフォルト値は です 1 。 |
--expect-workers
このパラメータは、マスター ノードが接続すると予想されるスレーブ ノードの数を指定するために使用されます。実際に接続されているスレーブ ノードの数がこの値に達していない場合、マスター ノードは十分な数のスレーブ ノードが接続されるまで待機し続けます。
実際に分散ストレステストを実行すると、マスターノードのWebインターフェース上に接続されているスレーブノードの数が表示されます。実際に接続されているスレーブ ノードの数が --expect-workers
指定した値に達していない場合は、Web インターフェイスに警告メッセージが表示され、マスター ノードがさらにスレーブ ノードの接続を待っていることを通知します。
ドッカーランイナゴ
コンテナ内で locust を実行することの利点と欠点は明らかです。
アドバンテージ | 説明 |
---|---|
環境の一貫性 | Docker は、さまざまなマシン上で実行されている Locust 環境の一貫性を保証します。 |
導入が簡単 | Docker を使用すると、Locust の展開プロセスが簡素化されます。 |
拡張しやすい | Docker をコンテナ オーケストレーション ツールと組み合わせて使用すると、Locust スレーブ ノードの自動スケーリングが可能になります。 |
隔離 | Docker 容器提供了一定程度的隔离性,将 Locust 运行环境与宿主机系统隔离。 |
缺点 | 描述 |
---|---|
性能开销 | Docker 容器可能存在一定程度的性能损失,与在宿主机上直接运行 Locust 相比。 |
学习曲线 | 对于不熟悉 Docker 的用户,可能需要一定时间学习 Docker 的基本概念和使用方法。 |
系统资源占用 | 运行 Docker 容器需要消耗一定的系统资源(如 CPU、内存、磁盘空间等)。 |
但是以下这些场景使用 Docker 来运行 Locust 是一个更好的选择:
-
分布式压力测试:在分布式压力测试中,需要在多台计算机上运行 Locust 主节点和从节点。使用 Docker 可以确保所有节点的运行环境一致,简化部署过程。
-
云环境部署:如果你需要在云环境(如 AWS、Azure、GCP 等)中进行压力测试,使用 Docker 可以简化部署过程,并充分利用云平台提供的容器服务(如 Amazon ECS、Google Kubernetes Engine 等)。
-
CI/CD 集成:如果你需要将压力测试集成到持续集成/持续部署(CI/CD)流程中,使用 Docker 可以简化集成过程。许多 CI/CD 工具(如 Jenkins、GitLab CI、Travis CI 等)都支持 Docker 集成。
-
避免环境冲突:如果你的开发或测试环境中已经安装了其他 Python 应用程序,可能会出现依赖项冲突。使用 Docker 可以将 Locust 运行环境与宿主机系统隔离,避免潜在的环境冲突。
-
团队协作:在团队协作过程中,使用 Docker 可以确保每个团队成员都使用相同的 Locust 运行环境,从而避免因环境差异导致的问题。
具体使用步骤
-
首先,确保你已经安装了 Docker。如果尚未安装,请参考 Docker 官方文档 以获取适用于你的操作系统的安装说明。
-
编写一个 Locust 测试脚本。例如,创建一个名为
locustfile.py
的文件,内容如下:
from locust import HttpUser, task, between
class MyUser(HttpUser):
wait_time = between(1, 5)
@task
def my_task(self):
self.client.get("/")
- 使用以下命令从 Docker Hub 拉取官方的 Locust 镜像:
docker pull locustio/locust
- 使用以下命令在 Docker 中运行 Locust。
docker run --rm -p 8089:8089 -v $PWD:/mnt/locust locustio/locust -f /mnt/locust/locustfile.py --host TARGET_HOST
在这个命令中,我们将当前目录(包含 locustfile.py
文件)挂载到 Docker 容器的 /mnt/locust
目录。然后,我们使用 -f
参数指定要运行的 Locust 测试脚本,并使用 --host
参数指定目标主机地址。
- 访问 Locust 的 Web 界面。在浏览器中打开
http://localhost:8089
,你将看到 Locust 的 Web 界面。在这里,你可以开始压力测试并查看结果。
通过以上步骤,你可以在 Docker 中运行 Locust,无需在本地环境中安装 Locust。
总之,在需要确保环境一致性、简化部署过程、集成到 CI/CD 流程、避免环境冲突或团队协作的场景下,使用 Docker 来运行 Locust 是一个很好的选择。通过使用 Docker,你可以轻松地在不同的计算机或云环境中运行压力测试,从而实现更大规模的分布式压力测试。
高性能 FastHttpUser
Locust 的默认 HTTP 客户端使用http.client
。如果计划以非常高的吞吐量运行测试并且运行 Locust 的硬件有限,那么它有时效率不够。
FastHttpUser
是 Locust
提供的一个特殊的用户类,用于执行 HTTP 请求。与默认的 HttpUser 不同,FastHttpUser 使用 C 语言库 gatling 编写的 httpclient 进行 HTTP 请求, 有时将给定硬件上每秒的最大请求数增加了 5 到 6 倍。在相同的并发条件下使用FastHttpUser能有效减少对负载机的资源消耗从而达到更大的http请求。
优势
-
性能:
FastHttpUser
的主要优势是性能。由于它使用 C 语言库进行 HTTP 请求,它的性能通常比默认的HttpUser
更高。这意味着在相同的硬件资源下,你可以使用FastHttpUser
生成更大的负载。 -
资源占用:与默认的
HttpUser
相比,FastHttpUser
通常具有较低的资源占用(如 CPU、内存等)。这意味着在进行压力测试时,你可以在同一台计算机上运行更多的并发用户。 -
更高的并发能力:由于
FastHttpUser
的性能和资源占用优势,它可以更好地支持大量并发用户的压力测试。这对于需要模拟大量并发用户的场景(如高流量 Web 应用程序、API 等)非常有用。
然而需要注意的是FastHttpUser
也有一些局限性。例如,它可能不支持某些特定的 HTTP 功能(如自定义 SSL 证书、代理设置等)。在选择使用 FastHttpUser
时,需要权衡性能优势和功能支持。如果测试场景不需要大量并发用户,或者需要特定的 HTTP 功能,使用默认的 HttpUser
可能更合适。
以下是一个使用 FastHttpUser
的 Locust 测试脚本示例:
from locust import FastHttpUser, task, between
class MyFastHttpUser(FastHttpUser):
wait_time = between(1, 5)
@task
def my_task(self):
self.client.get("/")
测试gRPC
等其他协议
locust 并非 http 接口测试工具 , 只是内置了 “HttpUser” 示例 ,理论上来说,只要提供客户端,它可以测试任何协议。
其他
主流性能测试工具对比
下面是 Locust、JMeter、Wrk 和 LoadRunner 四款性能测试工具的优缺点和支持的功能的对比表格:
工具名称 | 优点 | 缺点 | 支持的功能 |
---|---|---|---|
Locust | - 简单易用,支持 Python 语言 - 可以在代码中编写测试场景,灵活性高 - 可以使用分布式部署,支持大规模测试 - 支持 Web 和 WebSocket 测试 |
- 功能相对较少,不支持 GUI - 对于非 Python 开发人员不太友好 - 在大规模测试时需要手动管理分布式节点 |
- HTTP(S)、WebSocket 测试 - 支持断言、参数化、数据驱动等功能 - 支持分布式测试 |
JMeter | - 功能丰富,支持多种协议 - 支持 GUI,易于使用 - 支持分布式部署,支持大规模测试 - 支持插件扩展,可以扩展功能 |
- 性能较差,不适合高并发测试 - 内存占用较高,需要较大的内存 - 学习曲线较陡峭 |
- HTTP(S)、FTP、JDBC、JMS、LDAP、SMTP、TCP、UDP 等多种协议的测试 - 支持断言、参数化、数据驱动等功能 - 支持分布式测试 |
Wrk | - 性能优异,支持高并发测试 - 支持 Lua 脚本编写,灵活性高 - 支持多种输出格式,方便结果分析 |
- 比較的少数の機能、GUI サポートなし - HTTP プロトコルのテストのみ - 急峻な学習曲線 |
- HTTP(S) テスト - アサーション、パラメータ化、データ駆動型などをサポートします。 |
ロードランナー | ・機能が豊富で複数プロトコルに対応 ・GUI対応で使いやすい ・分散導入対応、大規模テスト対応 ・機能を拡張できるプラグイン拡張機能に対応 |
- 価格が高く、小規模チームには適さない - 学習曲線が急である - Windows 以外のプラットフォームのサポートが十分ではない |
- HTTP(S)、FTP、JDBC、JMS、LDAP、SMTP、TCP、UDPなどの各種プロトコルのテスト - アサーション 、パラメータ化、データドライブなどの機能をサポート - 分散テストをサポート |
これらのツールの長所と短所およびサポートされている機能は相対的なものにすぎず、具体的な用途は実際のニーズとシナリオに応じて選択する必要があることに注意してください。
データ取得方法
【メッセージ777】
ソース コードやその他のチュートリアル資料を入手したいお友達は、いいね + コメント + ブックマーク、トリプルしてください。
3回連続でコメント欄に個別メッセージを送ります〜