Estoy buscando mover mi secuencia de comandos de Python de subprocesos múltiples a Locust.
Una explicación simple de lo que hace mi script es:
Cuando comencé a investigar Locust, me di cuenta de que la única forma de realizar cada tarea en su propio intervalo específico, necesitaría crear un conjunto de tareas por tarea.
Esto planteó un problema de cómo comparto la cookie de autenticación para el usuario generado dado entre conjuntos de tareas. Dado que, a la larga, también necesito compartir datos de respuesta entre el conjunto de tareas para el usuario generado dado, ya que difiere entre los usuarios generados.
En el código de muestra a continuación, todos los usuarios generados por Locust comparten el mismo "storage.cookie". ¿Hay alguna manera de mantener storage.cookie única por usuario, compartirla con todos los conjuntos de tareas para el usuario generado por langosta? ¿Locust informa sobre qué usuario está ejecutando la tarea actualmente?
from __future__ import print_function from locust import Locust, TaskSet, task, HttpLocust import json def auth(l): payload = {"username":"some_username","password":"some_password"} resp = l.client.post('/auth', data = json.dumps(payload)) storage.cookie = # get auth cookie from resp def do_i_auth(l): if len(storage.cookie) == 0: auth(l) class storage(object): cookie == '' class first_call(TaskSet): def on_start(self): do_i_auth(self) @task def get_api_a(self): headers = {"Cookie":storage.cookie} self.client.get('/api_a', headers) class second_call(TaskSet): def on_start(self): do_i_auth(self) @task def get_api_b(self): headers = {"Cookie":storage.cookie} self.client.get('/api_b', headers) class api_A(HttpLocust): task_set = first_call min_wait = 5000 max_wait = 5000 class api_B(HttpLocust): task_set = second_call min_wait = 10000 max_wait = 10000
Puede intentar que su función de autorización devuelva la cookie y que se almacene en cada clase por separado. Algo como esto:
from __future__ import print_function from locust import Locust, TaskSet, task, HttpLocust import json def auth(l): payload = {"username":"some_username","password":"some_password"} resp = l.client.post('/auth', data = json.dumps(payload)) cookie = # get auth cookie from resp return cookie class first_call(TaskSet): cookie = "" def on_start(self): self.cookie = auth(self) @task def get_api_a(self): headers = {"Cookie":self.cookie} self.client.get('/api_a', headers)
Creo que la solución aquí es no tener clases separadas para cada llamada, sino tener las llamadas como métodos en una sola clase. De esa manera, puede almacenar las cookies en los objetos (referenciados a través self.cookie
).
Esto funcionó para mí:
https://gist.github.com/MatrixManAtYrService/1d83abd54adc9d4181f9ebb98b9799f7
Recientemente implementé cookies en un script de prueba de carga de aplicaciones DotNet.
Las cookies deben pasarse mediante objetos de diccionario.
cookiedict={} cookiedict['Key1'] = 'Value1' cookiedict['Key2'] = 'Value2' #Auth API self.auth_response = self.gettoken(cookiedict) self.token = self.auth_response.cookies['RequestVerificationToken'] self.cookies = self.auth_response.cookies #Login API cookiedict['RequestVerificationToken'] = self.token ` self.login_response=self.login(self.user_name,self.password,self.token,cookiedict)
También tenga en cuenta que también necesita usar HttpSession
from locust.clients import HttpSession self.requests = HttpSession(consumer_cfg.rest_api_url) executor = self.requests.post if method == 'PUT': executor = self.requests.put elif method == 'GET': executor = self.requests.get self._request_proceed(method='GET', url=url, data=formdata,catch_response=catch_response, cookies = CookiesSent,allow_redirects = True)