web-dev-qa-db-ja.com

ユーザーリストを指定してlocust.ioを使用する方法

システムのストレステストを行う必要があります http://locust.io は、これを行うための最良の方法のようです。ただし、毎回同じユーザーを使用するように設定されているようです。別のユーザーとしてログインするには、各スポーンが必要です。それを設定するにはどうすればよいですか?または、使用に適した別のシステムはありますか?

30
jloosli

イナゴの著者はこちら。

デフォルトでは、各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など)を導入する必要があります。

48
heyman

または、users.pyモジュールは、テストケースで必要なユーザー情報を保持します。この例では、emailcookiesを保持しています。次に、タスクでランダムにそれらを呼び出すことができます。下記参照:

# 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']] 
14
Mesut GÜNEŞ

これを分散システムに実装するとき、私は少し異なるアプローチをとりました。 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の制限されたセットによって引き起こされるある種のラウンドロビン効果について心配する必要はありません。

4
user2943791

ここで@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

これにより、スウォームが孵化を完了すると、ユーザーリストが更新されます。

また、スポーンするユーザーの数よりも長いリストが必要になることにも注意してください。

4
Grey Vugrin