Je dois tester le stress d'un système et http://locust.io semble être la meilleure façon de procéder. Cependant, il semble qu'il soit configuré pour utiliser le même utilisateur à chaque fois. J'ai besoin de chaque apparition pour me connecter en tant qu'utilisateur différent. Comment dois-je procéder pour configurer cela? Sinon, existe-t-il un autre système qui serait bon à utiliser?
Auteur de criquets ici.
Par défaut, chaque instance d'utilisateur HttpLocust a un client HTTP qui a son propre session séparée.
Locust n'a pas de fonctionnalité pour fournir une liste d'informations d'identification utilisateur ou similaire. Cependant, vos scripts de test de charge ne sont que du code python, et heureusement, il est trivial de l'implémenter vous-même.
Voici un petit exemple:
# 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
Le code ci-dessus ne fonctionnerait pas lors de l'exécution de Locust distribué, car le même code s'exécute sur chaque nœud esclave et ils ne partagent aucun état. Par conséquent, vous devrez introduire une banque de données externe que les nœuds esclaves pourraient utiliser pour partager des états (par exemple PostgreSQL, redis, memcached ou autre).
Vous pouvez également créer users.py
module pour contenir les informations des utilisateurs dont vous avez besoin dans vos cas de test, dans mon exemple, il contient email
et cookies
. Ensuite, vous pouvez les appeler au hasard dans vos tâches. Voir ci-dessous:
# 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
L'utilisateur et l'agent utilisateur peuvent être appelés par une fonction. De cette façon, nous pourrions distribuer le test avec de nombreux utilisateurs et différents agents utilisateurs.
# 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']]
J'ai adopté une approche légèrement différente lors de la mise en œuvre de cela pour un système distribué. J'ai utilisé un serveur flask très simple auquel j'ai fait un appel get pendant la partie on_start du TaskSet.
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()
De cette façon, j'ai maintenant un point de terminaison que je peux obtenir à http: // localhost: 5000 / sur n'importe quel hôte que je lance. J'ai juste besoin de rendre ce point de terminaison accessible aux systèmes esclaves et je n'aurai pas à me soucier des utilisateurs en double ou d'un certain type d'effet alternatif causé par un ensemble limité de user_info.
Piggy-backing sur la réponse de @ heyman ici. L'exemple de code fonctionnera, mais continuer à démarrer/arrêter les tests finira par effacer le USER_CREDENTIALS
liste, et commencez à lancer des erreurs.
J'ai fini par ajouter ce qui suit:
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
Cela actualise votre liste d'utilisateurs une fois que votre essaim a fini d'éclore.
Gardez également à l'esprit que vous aurez besoin d'une liste plus longue que le nombre d'utilisateurs que vous souhaitez générer.