JMeter- Besoin d'un peu plus de liberté ? Voici LOCUST !

Apache JMeter est un outil formidable et très populaire.

De mon point de vue, JMeter peut avoir certaines limites en termes de liberté totale pour les tests de charge. Voyons maintenant comment Locust se compare à cet aspect. Dans cet article, nous allons faire une comparaison directe entre JMeter et Locust pour comprendre leurs différences et leurs capacités.

Examinons de plus près la comparaison entre JMeter et Locust.

JMeter est un outil de test de charge très répandu, connu pour sa polyvalence dans le test des performances des applications et services web. Il offre un ensemble complet de fonctionnalités, mais certains utilisateurs peuvent rencontrer des contraintes et une courbe d'apprentissage plus raide en raison de son interface utilisateur et de sa configuration complexes.

En revanche, Locust est un outil de test de charge moderne, basé sur Python, qui privilégie la simplicité et la facilité d'utilisation. Il permet aux utilisateurs d'écrire des scénarios de test sous forme de code, ce qui s'avère bénéfique pour les développeurs qui préfèrent plus de contrôle et de flexibilité dans leurs tests. Grâce à son approche simple et intuitive, Locust a gagné en popularité auprès des développeurs et des équipes d'assurance qualité.

Alors que JMeter dispose d'une large gamme de plugins et de fonctionnalités intégrées pour l'extensibilité et la personnalisation, l'approche basée sur le code de Locust offre aux développeurs une plus grande flexibilité dans la personnalisation des scénarios de test et l'intégration avec d'autres outils et bibliothèques.

En fin de compte, le choix entre JMeter et Locust dépendra des besoins spécifiques et des préférences de l'équipe de test, ainsi que de la nature des scénarios de test de charge qu'elle souhaite mener.

Quelles sont les limitations ?

La programmation de scripts n'est pas autorisée dans JMeter. En outre, l'exécution d'un grand nombre de services et d'API sur une seule machine présente des limites. Pour utiliser efficacement le plugin d'auto-corrélation, il est fortement recommandé d'exécuter un test de charge en mode non-GUI et de s'assurer que toutes les instances de JMeter sont fermées pendant le test. En outre, la copie d'éléments, tels qu'un extracteur Regex, entre différentes versions de JMeter peut entraîner une erreur.

Voici la magie de Locust :

Écrire des scénarios de test utilisateur en Python pur et dur

Pas besoin d'interfaces utilisateur encombrantes ou de XML volumineux - il suffit de coder comme vous le feriez normalement. Basé sur des coroutines au lieu de callbacks, votre code ressemble et se comporte comme du code Python normal et bloquant.

Distribué et évolutif - supporte des centaines de milliers d'utilisateurs

Locust permet d'exécuter des tests de charge répartis sur plusieurs machines. Étant basé sur les événements, même un nœud Locust peut gérer des milliers d'utilisateurs dans un seul processus. Cela s'explique en partie par le fait que même si vous simulez autant d'utilisateurs, tous n'utilisent pas activement votre système. Souvent, les utilisateurs sont inactifs et cherchent à savoir ce qu'ils doivent faire ensuite. Requêtes par seconde != nombre d'utilisateurs en ligne.

Interface Web

Il dispose d'une interface utilisateur HTML+JS soignée qui affiche les détails pertinents du test en temps réel. Et comme l'interface est basée sur le web, elle est multiplateforme et facilement extensible.

Piratable

Locust est petit et très facile à hacker et nous avons l'intention de le garder ainsi. Toutes les tâches lourdes des E/S événementielles et des coroutines sont déléguées à l'événement. La fragilité des outils de test alternatifs est la raison pour laquelle nous l'avons créé.

Une solution intéressante en a découlé :

Locust a toujours démontré sa remarquable capacité à simuler efficacement des millions d'utilisateurs simultanés, ce qui en fait un choix exceptionnellement fiable pour les tests de charge. En outre, Battlelog, l'application web pour les jeux Battlefield, s'appuie notamment sur Locust pour ses tests de charge, fournissant ainsi une preuve concrète de ses performances et de sa fiabilité à l'épreuve du feu.

Essayons cela :

Première étape : Locust est disponible sur PyPI et peut être installé avec pip.

pour python 2.7

$ python -m pip install locustio

pour Python 3 :

python3 -m pip install locustio

Si vous voulez la version la plus récente, vous pouvez utiliser pip pour l'installer directement depuis notre dépôt Git. Par exemple, pour installer la branche master avec Python 3 :

$ python3 -m pip install -e git://github.com/locustio/locust.git@master#egg=locustioL

pour s'assurer que vous êtes bien entré dans

locust --help

Faisons une fonction de connexion simple pour vous faciliter la tâche.

Mission : Fonction de connexion via Rest Services

from locust import HttpLocust, TaskSet, taskfrom locust import clientsfrom locust.clients import HttpSessionimport requestsglobal BaseUrlclass auth():BaseUrl = 'https://[Votre-serveur]-api.domain.co' #Définitions de l'API d'authentification def login( self,userName,passWord):s = HttpSession('https://[Votre-serveur]-api.domain.co') response = s.post('https://[Votre-serveur]-api.domain.co/auth/login', {'username':userName, 'password':passWord}) return response def getLogUser( self,accress_token):s = HttpSession('https://[Votre-serveur]-api.domain.co') response = s.get('https://[Votre-serveur]-api.domain.co/profile', headers={'access_token':accress_token}) return response

Ces deux services comme vous le voyez

-Demande de connexion (Post) avec les paramètres Username et password

-Demande (Get) pour obtenir les informations du profil de l'utilisateur.

Ce dont nous avons besoin ensuite, c'est d'envoyer les paramètres à cette API et de créer une certaine charge 🙂 .

Tout d'abord, nous avons besoin d'un gestionnaire de données externe pour les informations d'identification. Dans mon cas, j'ai conservé un fichier CSV pour stocker les différentes informations d'identification des utilisateurs. Essayons de lire et de pousser les données vers les APIs

class runnerAgent(TaskSet) :global json_data global accress_token global path global ccLogin global API_KEY global getAr global VarCD @task def Login(self): #Objet du fichier global conf = config.config() path = conf.getLocation() #objet de Admin Authlogin = authAgent.authAgent() PWConbv = util.util() #radis Cache InitializationRcache = redis.Redis(host='127.0.0.1', port=6379, db=0) with open('//oadTestv0.1/globe/credentials.csv') as csv_file :csv_reader = csv.reader(csv_file, delimiter=',') for row in csv_reader :print(' Login Agent with Username--->'+row[0]+' Who has Password --->'+row[1]) #login Request Loginresponse=login.login(row[0],row[1]) print Loginresponse --> (*) assert Loginresponse.status_code is 200, 'Unexpected response code : ' + Loginresponse.status_code json_data =json.loads(Loginresponse.text) accress_token =json_data['content']['access_token'] ccLogin =json_data ['content']['ccLogin'] agentID=json_data['content']['id'] print agentID ObjectAgent =json.dumps({ 'UserName':row[0],'PassWord':row[1],'ccLogin':ccLogin,'id':agentID,'accress_token':accress_token}) Rcache.set(row[0],ObjectAgent) API_KEY = conf.getAPI_key() print API_KEY if Loginresponse.status_code==200: login.AutoLog(accress_token) else :login.login(row[0],EncriptedPW)class LoginWithUniqueUsersTest(HttpLocust) :task_set = runnerAgent

Pour le premier essai, ne nous préoccupons pas du cache #radis ou d'autres lectures JSON. Essayons simplement d'affirmer le code de réponse - > (*)

Exécuter le test : Il y a deux méthodes pour exécuter le test

-Avec l'interface graphique

$ locust -f locust_files/my_locust_file.py --host=https://example.com

Vous obtiendrez le port en cours d'exécution sur votre machine locale :

Une fois que vous avez démarré Locust en utilisant l'une des lignes de commande ci-dessus, vous devriez ouvrir un navigateur et le diriger vers http://127.0.0.1:8089 (si vous exécutez Locust localement), et en même temps, les salutations seront quelque chose comme ceci :

Dans le contexte des tests de charge, une classe de criquets représente un utilisateur individuel ou, au sens figuré, un criquet en essaim. Locust engendre ou fait éclore une instance de la classe de criquets pour chaque utilisateur.

Au cours du processus de test de charge, la classe de criquets joue un rôle important dans la caractérisation efficace de chaque utilisateur et de son comportement. Pour ce faire, la classe de criquets doit définir plusieurs attributs qui représentent et simulent avec précision les actions et les interactions des utilisateurs avec le système.

Vous pouvez également consulter les statistiques en temps réel.

JMeter vs Locust

-Sans interface graphique

locust -f my_locust_file.py  --clients=02 --hatch-rate=01  --host=http://example.com  --no-web 

La console affichera le résumé pour vous.

JMeter vs Locust