Test de stress avec Locust écrit en Python

Cet article est le deuxième jour de Brainpad Advent Calender 2019

Bonjour @ est nissy0409240 Je suis ingénieur chez BrainPad Cela fait moins d'un mois en 2019 Comment va tout le monde

J'ai pu aller au Tokyo Dome en privé cette année C'était une année émouvante image.png En parlant de Tokyo Dome, baseball En parlant de baseball, de lanceurs et de frappeurs Dans cette entrée indépendamment d'une telle préface Je vais vous présenter les fonctions de base de Locust, un outil de test de charge qui vous permet d'écrire des scénarios en Python.

Qu'est-ce que le criquet

Locust est un outil de test de charge Python qui possède également une interface graphique. La plus grande fonctionnalité par rapport aux autres outils de test de charge est que vous pouvez écrire des scénarios en Python. Cela ressemble à un jeu de mots, mais vous pouvez aussi dire que vous devez écrire un scénario en Python.

Cliquez ici pour divers liens tels que des documents officiels

À propos, Locust est un mot anglais qui signifie batta ou criquet.

image.png L'illustration est Tonosamabatta

Comment installer

Je vais l'installer immédiatement Pour installer, exécutez simplement la commande suivante

$ brew install libev
$ python3 -m pip install locustio

Exécutez la commande $ locust --help après l'exécution, et si l'aide est affichée, l'installation est réussie.

image.png L'illustration est la sauterelle

Créer un scénario

Le scénario est écrit dans un script Python. Il n'y a aucune restriction sur le nom du fichier lui-même. Cependant, si vous ne spécifiez pas le nom du fichier au démarrage, celui avec le nom de fichier locustfile.py sera exécuté. S'il n'y a pas de restrictions de nom de fichier, il est recommandé d'utiliser le nom de fichier locustfile.py.

Ci-dessous un exemple

from locust import HttpLocust, TaskSet, task, between


class WebsiteTasks(TaskSet):
    @task
    def index(self):
        self.client.get('/')
        

class WebsiteUser(HttpLocust):
    task_set = WebsiteTasks
    wait_time = between(5, 15)

Au fait, le serveur API que vous recevez est comme ça

from wsgiref.simple_server import make_server

import json


def api(environ, start_response):
    status = '200 OK'
    headers = [
        ('Content-type', 'application/json; charset=utf-8'),
        ('Access-Control-Allow-Origin', '*'),
    ]
    start_response(status, headers)

    return [json.dumps({'message':'hoge'}).encode("utf-8")]

with make_server('', 3000, api) as httpd:
    print("Serving on port 3000...")
    httpd.serve_forever()

image.png L'illustration est Shoryo Bata

Commencez

Commencez par la commande suivante

$ locust
[2019-12-01 00:56:13,884] locust.main: Starting web monitor at *:8089
[2019-12-01 00:56:13,885] locust.main: Starting Locust 0.9.0

Dans l'exemple ci-dessus, je ne cours avec aucune option

Fichier avec le scénario que vous souhaitez exécuter avec l'option -f Vous pouvez spécifier le point de terminaison que vous souhaitez atteindre avec l'option -H

Par défaut, le processus Locust démarre sur le port 8089 Il est possible de changer le port de démarrage avec l'option -P.

Si vous le spécifiez correctement Commencer comme ça

$ locust -f locustfile.py -H http://localhost:3000 -P 8089
[2019-12-02 03:38:42,717] locust.main: Starting web monitor at *:8089
[2019-12-02 03:38:42,718] locust.main: Starting Locust 0.13.2

image.png L'illustration est un criquet bouilli

Essai

Lorsque vous accédez à http: // localhost: 8089 depuis votre navigateur après le démarrage Vous pouvez accéder à l'interface graphique suivante

スクリーンショット 2019-12-02 3.39.14.png Le point de terminaison que vous souhaitez atteindre et que vous avez spécifié plus tôt est défini par défaut スクリーンショット 2019-12-02 3.08.26.png * Si l'hôte n'est pas spécifié au démarrage, l'hôte sera vide.

Certains éléments de réglage sont vides, alors entrez les valeurs suivantes 100 à "Nombre d'utilisateurs à simuler" 1 pour "Taux d'éclosion"

La signification de chacun est la suivante

Number of users to simulate:Combien de clients créer(Synonyme du nombre de requêtes envoyées par seconde au maximum)
Hatch rate:Vitesse de création du client(Chaque seconde)
Host:Point de terminaison de destination

Cette fois, envoyez une requête à http: // localhost: 3000, en augmentant de 1 client chaque seconde. À ce moment, le nombre maximum de clients sera porté à 100. Exécuter sous la condition

スクリーンショット 2019-12-02 23.36.11.png

Après la saisie, appuyez sur le bouton "Démarrer l'essaimage" pour exécuter la demande

スクリーンショット 2019-12-02 21.40.38.png

Si vous souhaitez terminer l'exécution, appuyez sur le bouton STOP en haut à droite du navigateur Après avoir appuyé sur, STATUS devient STOPPED et vous pouvez confirmer qu'il est terminé.

スクリーンショット 2019-12-02 21.42.49.png

image.png L'illustration est une horde de batta et de sauterelles

Métrique

Vous pouvez également voir les métriques dans l'onglet Graphiques スクリーンショット 2019-12-02 22.00.39.png スクリーンショット 2019-12-02 22.01.34.png Il s'agit d'une mesure lorsque vous augmentez d'un client par seconde, et si vous augmentez jusqu'à 100 clients, continuez à demander avec 100 clients tel quel

Ensuite, voyons ce qui se passe lorsque la demande échoue. Cette fois, je vais essayer d'arrêter le processus du serveur API au milieu

スクリーンショット 2019-12-02 22.44.48.png スクリーンショット 2019-12-02 22.43.59.png スクリーンショット 2019-12-02 22.44.18.png スクリーンショット 2019-12-02 22.44.38.png Vous pouvez vérifier comme ça sur chaque onglet Comment augmenter le nombre de demandes ayant échoué et le ratio d'échecs par rapport au nombre total de demandes Vous pouvez également vérifier pourquoi il a échoué dans l'onglet Échecs.

Vous pouvez également télécharger les résultats à partir de l'onglet Données de téléchargement. スクリーンショット 2019-12-02 23.23.27.png

Le contenu du fichier téléchargé est comme ceci スクリーンショット 2019-12-02 23.24.55.png

image.png L'illustration est un personnage de Bata

Conclusion

Comme mentionné ci-dessus, nous avons introduit Locust, bien qu'il n'ait que des fonctions de base. Adieu l'illustration du frappeur Merci de rester avec nous jusqu'à la fin

image.png

référence

https://qiita.com/yamionp/items/17ffcc465272ad83c490 https://inside.pixiv.blog/east/5407 https://blog.htmlhifive.com/2015/08/14/web-server-load-testing-tools-2-locust/ https://docs.locust.io/en/stable/installation.html https://docs.locust.io/en/stable/quickstart.html https://co3k.org/blog/load-test-by-locust

Recommended Posts

Test de stress avec Locust écrit en Python
Jugement des nombres premiers avec Python
Jugement des nombres premiers avec python
Grattage au sélénium en Python
Exploitez LibreOffice avec Python
Grattage avec chromedriver en python
Algorithme en Python (jugement premier)
Débogage avec pdb en Python
Gérer les sons en Python
Grattage avec du sélénium en Python
Analyse des contraintes symétriques axiales avec Python
Grattage avec Tor en Python
Tweet avec image en Python
Combiné avec ordinal en Python
Test de charge Websocket avec Locust
Gacha écrit en Python -BOX Gacha-
Définir le test python dans jenkins
Veriloggen et cocotb sont utilisés pour concevoir et tester Verilog en Python uniquement.
Cool Lisp écrit en Python: Hy
Tester avec des nombres aléatoires en Python
GOTO en Python avec Sublime Text 3
Travailler avec LibreOffice en Python: import
Scraping avec Selenium en Python (Basic)
Analyse CSS avec cssutils en Python
Numer0n avec des objets fabriqués avec Python
Ouvrez UTF-8 avec BOM en Python
Programme de diagnostic de compatibilité écrit en python
Utiliser rospy avec virtualenv dans Python3
Sortie du journal de test unitaire avec python
Ecrire le code de test du sélénium en python
Utiliser Python mis en pyenv avec NeoVim
Heatmap avec dendrogramme en Python + matplotlib
Lire des fichiers en parallèle avec Python
Test statistique (test multiple) en Python: scikit_posthocs
Générer un mot de passe pour le manuel avec python
Utiliser OpenCV avec Python 3 dans Window
Jusqu'à traiter de python dans Atom
Logique gacha simple écrite en Python
Démarrez avec Python avec Blender
Travailler avec des images DICOM en Python
Convertir des fichiers écrits en python, etc. en pdf avec la coloration syntaxique
Préparez un environnement de test de charge distribué avec l'outil de test de charge Python Locust
Convertir un script Python écrit dans PyTorch en exe avec PyInstaller
Écrire de la documentation dans Sphinx avec Python Livereload
Obtenez des données supplémentaires vers LDAP avec python
Code de vérification de la série Fourier écrit en Python
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
Essayez de vous connecter à qiita avec Python
Tester les programmes non fonctionnalisés Python avec GitLab CI
Python3> dans le mot clé> Vrai avec une correspondance partielle?
Contrôle exclusif avec fichier de verrouillage en Python
Surveillance des appareils effectuée par Python On-box de IOS-XE
Test WebUI avec Python2.6 + Selenium 2.44.0 - paramètre de profil
Ecrire le test dans la docstring python
Essayez de travailler avec des données binaires en Python
Générer des données de test japonais avec Python Faker
Dessinez Nozomi Sasaki dans Excel avec python
Probabilité de transition de la chaîne de Markov écrite en Python
Conseils pour gérer les binaires en Python
Programme d'analyse des contraintes FEM 2D par Python