sea min_wait examples stress-testing locust

stress-testing - min_wait - locust sea



Manera de utilizar locust.io proporcionando la lista de usuarios (4)

Necesito realizar pruebas de estrés en un sistema y http://locust.io parece ser la mejor manera de hacerlo. Sin embargo, parece que está configurado para usar el mismo usuario cada vez. Necesito que cada engendro inicie sesión como un usuario diferente. ¿Cómo hago para configurar eso? Alternativamente, ¿hay otro sistema que sería bueno usar?


Alternativamente, puede crear el módulo users.py para almacenar la información de los usuarios que necesita en sus casos de prueba, en mi ejemplo, contiene email y cookies . Entonces puedes llamarlos al azar en tus 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 manera, podríamos distribuir la prueba con muchos usuarios y diferentes agentes de usuario.

# 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'']]


El autor de la langosta aquí.

De forma predeterminada, cada instancia de usuario de HttpLocust tiene un cliente HTTP que tiene su propia sesión independiente .

Locust no tiene ninguna característica para proporcionar una lista de credenciales de usuario o similar. Sin embargo, sus scripts de prueba de carga son solo código de Python, y afortunadamente es trivial implementar esto usted mismo.

Aquí hay 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 al ejecutar 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).


Piggy-backing en @ heyman respuesta aquí. El código de ejemplo funcionará, pero continuar con las pruebas de inicio / parada borrará la lista USER_CREDENTIALS y comenzará a USER_CREDENTIALS errores.

Acabé agregando lo siguiente:

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

Esto actualiza su lista de usuarios una vez que su enjambre termina de eclosionar.

También tenga en cuenta que necesitará una lista más larga que la cantidad de usuarios que desea generar.


Tomé 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.