Este grupo especializado luego de algunos días de investigación y de juntar de información, obtuvimos la solución, deseamos que todo este artículo sea de utilidad en tu proyecto.
Solución:
Autor de langostas aquí.
De forma predeterminada, cada instancia de usuario de HttpLocust tiene un cliente HTTP que tiene su propia sesión separada.
Locust no tiene ninguna función para proporcionar una lista de credenciales de usuario o similar. Sin embargo, sus scripts de prueba de carga son solo código Python y, afortunadamente, es trivial implementarlo usted mismo.
He aquí un breve ejemplo:
# 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
El código anterior no funcionaría cuando se ejecuta Locust distribuido, ya que el mismo código se ejecuta en cada nodo esclavo y no comparten ningún estado. Por lo tanto, tendría que introducir algún almacén de datos externo que los nodos esclavos podrían usar para compartir estados (por ejemplo, PostgreSQL, redis, memcached o algo más).
Alternativamente, puede crear users.py
módulo para contener la información de los usuarios que necesita en sus casos de prueba, en mi ejemplo, contiene email
y cookies
. Luego, puede llamarlos al azar en sus tareas. Vea abajo:
# 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
El usuario y el agente de usuario pueden ser llamados por una función. De esta forma, podríamos distribuir la prueba con muchos usuarios y diferentes usuarios-agentes.
# 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']]
Adopté un enfoque ligeramente diferente al implementar esto para un sistema distribuido. Utilicé un servidor de matraces muy simple al que hice una llamada durante la parte on_start del 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 esta manera, ahora tengo un punto final que puedo obtener en http: // localhost: 5000 / en cualquier host que ejecute esto. Solo necesito hacer que este punto final sea accesible para los sistemas esclavos y no tendré que preocuparme por usuarios duplicados o algún tipo de efecto round robin causado por tener un conjunto limitado de user_info.
Reseñas y calificaciones del tutorial
No se te olvide dar recomendación a esta sección si lograste el éxito.