システムのストレステストを行う必要があります http://locust.io は、これを行うための最良の方法のようです。ただし、毎回同じユーザーを使用するように設定されているようです。別のユーザーとしてログインするには、各スポーンが必要です。それを設定するにはどうすればよいですか?または、使用に適した別のシステムはありますか?
イナゴの著者はこちら。
デフォルトでは、各HttpLocustユーザーインスタンスには、独自のセッションを含むHTTPクライアントがあります。
Locustには、ユーザーの認証情報などのリストを提供する機能はありません。ただし、負荷テストスクリプトはpythonコードのみであり、幸いにもこれを自分で実装するのは簡単です。
以下に短い例を示します。
# locustfile.py
from locust import HttpLocust, TaskSet, task
USER_CREDENTIALS = [
("user1", "password"),
("user2", "password"),
("user3", "password"),
]
class UserBehaviour(TaskSet):
def on_start(self):
if len(USER_CREDENTIALS) > 0:
user, passw = USER_CREDENTIALS.pop()
self.client.post("/login", {"username":user, "password":passw})
@task
def some_task(self):
# user should be logged in here (unless the USER_CREDENTIALS ran out)
self.client.get("/protected/resource")
class User(HttpLocust):
task_set = UserBehaviour
min_wait = 5000
max_wait = 60000
同じコードが各スレーブノードで実行され、状態を共有しないため、上記のコードはLocust分散を実行している場合は機能しません。したがって、スレーブノードが状態を共有するために使用できる外部データストア(PostgreSQL、redis、memcachedなど)を導入する必要があります。
または、users.py
モジュールは、テストケースで必要なユーザー情報を保持します。この例では、email
とcookies
を保持しています。次に、タスクでランダムにそれらを呼び出すことができます。下記参照:
# locustfile.py
from locust import HttpLocust, TaskSet, task
from user_agent import *
from users import users_info
class UserBehaviour(TaskSet):
def get_user(self):
user = random.choice(users_info)
return user
@task(10)
def get_siparislerim(self):
user = self.get_user()
user_agent = self.get_user_agent()
r = self.client.get("/orders", headers = {"Cookie": user[1], 'User-Agent': user_agent})
class User(HttpLocust):
task_set = UserBehaviour
min_wait = 5000
max_wait = 60000
ユーザーとユーザーエージェントは関数から呼び出すことができます。このようにして、多くのユーザーとさまざまなユーザーエージェントでテストを配布できます。
# users.py
users_info = [
['[email protected]', 'cookies_created_by_each_user'],
['[email protected]', 'cookies_created_by_each_user'],
['[email protected]', 'cookies_created_by_each_user'],
['[email protected]', 'cookies_created_by_each_user'],
['[email protected]', 'cookies_created_by_each_user'],
['[email protected]', 'cookies_created_by_each_user'],
['[email protected]', 'cookies_created_by_each_user'],
['[email protected]', 'cookies_created_by_each_user'],
['[email protected]', 'cookies_created_by_each_user'],
['[email protected]', 'cookies_created_by_each_user'],
['[email protected]', 'cookies_created_by_each_user']]
これを分散システムに実装するとき、私は少し異なるアプローチをとりました。 TaskSetのon_start部分でget呼び出しを行った非常に単純なflaskサーバーを利用しました。
from flask import Flask, jsonify
app = Flask(__name__)
count = 0 #Shared Variable
@app.route("/")
def counter():
global count
count = count+1
tenant = count // 5 + 1
user = count % 5 + 1
return jsonify({'count':count,'tenant':"load_tenant_{}".format(str(tenant)),'admin':"admin",'user':"load_user_{}".format(str(user))})
if __name__ == "__main__":
app.run()
このようにして、これを実行するどのホストでも http:// localhost:5000 / で取得できるエンドポイントを取得しました。このエンドポイントをスレーブシステムからアクセスできるようにするだけでよく、ユーザーの重複や、user_infoの制限されたセットによって引き起こされるある種のラウンドロビン効果について心配する必要はありません。
ここで@heymanの答えに便乗。サンプルコードは機能しますが、テストの開始/停止を続けると、最終的にUSER_CREDENTIALS
リストを表示し、エラーをスローし始めます。
私は以下を追加してしまいました:
from locust import events # in addition to the other locust modules needed
def hatch_complete_handler(**kw):
global USER_CREDENTIALS
USER_CREDENTIALS = generate_users() # some function here to regenerate your list
events.hatch_complete += hatch_complete_handler
これにより、スウォームが孵化を完了すると、ユーザーリストが更新されます。
また、スポーンするユーザーの数よりも長いリストが必要になることにも注意してください。