Saltar al contenido

Manera de usar locust.io proporcionando la lista de usuarios

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *