Accueil » Non classé » Créer des tests de montée en charge avec Artillery.io

Créer des tests de montée en charge avec Artillery.io

Server load

Les tests de montée en charge font partie des tests à effectuer régulièrement sur son site web. Un test de montée en charge permet de mesurer la résistance d’un site lors d’une augmentation très importante du nombre de visiteurs et a pour but principal de déterminer la capacité maximale d’accueil du site testé.

Quand faire un test de montée en charge

Le test de montée en charge / TMC est uniquement à but prévisionnel, afin de s’assurer du bon fonctionnement du site web, application, serveur. Il y a plusieurs raisons pour organiser un test de montée en charge :

  • Migration de serveur
  • Mise en production / Ajout d’une fonctionnalité majeure
  • Création / Refonte d’un site
  • L’arrivée d’une grosse échéance (soldes, fêtes de fin d’année, opération commerciale, …)

Bien entendu, il peut y avoir d’autres raisons pour organiser un TMC, et il peut être réalisé comme un simple contrôle de routine afin de s’assurer de la qualité et de la capacité du site à accueil n visiteurs en même temps, il ne peut pas faire de mal 🙂

Créer son premier test de montée en charge avec Artillery

Artillery est un projet Open Source dont le dépôt est disponible sur Github (https://github.com/artilleryio/artillery) écrit en NodeJS et qui est assez simple d’utilisation grâce à la configuration des tests de montée en charge en YAML. On peut également agir sur les Headers HTTP très simplement, notamment pour l’authentification basique, utilisation de variables d’environnement etc…

Principes élémentaires d’Artillery

Voici les 3 principes essentiels d’Artillery qui vous permettront de mieux comprendre comment il fonctionne et ainsi appréhender au mieux sa configuration.

Les phases

C’est l’élément directeur d’un test. Une phase permet de gérer l’intensité du test, ainsi, vous pouvez décider de la durée de la phase, du nombre de visiteurs virtuels et s’ils arrivent par paquet. Avec plusieurs phases on peut donc faire varier l’intensité et la durée lors du run, généralement, on configure une intensité croissante. Pour une phase, Artillery exécute donc les scénarios paramétrés en même temps.

Les scénarios

Un scénario permet de définir plusieurs paramètres, plusieurs flows et permet de coller aux habitudes de vos visiteurs. Avec plusieurs scénarios, vous pouvez aussi correspondre à plusieurs profils : anonymes, clients connectés et y définir les actions correspondantes (inscription, recherche, commande, …).

Les Flows

Un Flow est un enchaînement d’appels HTTP à réaliser lors d’un scénario. Chaque Flow représente donc être un verbe HTTP (GET, POST, DELETE, PUT, PATCH) et on peut y manipuler les cookies, les formulaires, authentification basique, les redirections, etc.

Installation d’Artillery

Rien de plus simple, ouvrez votre terminal et saisissez ce qui suit

npm install -g artillery

Vous pouvez ainsi voir la version installée

artillery -V

Artillery.io version utilisée

Test rapide en ligne de commande

Artillery permet d’écrire un scénario complet mais permet aussi de lancer un test en ligne de commande, de cette manière

artillery quick --count 10 -n 20 https://artillery.io/

Cette commande permet de lancer 20 visiteurs simultanés pendant 10 secondes sur le site officiel d’Artillery.io

Écriture du premier scénario

Créez un fichier qui se nomme test.yml et ouvrez le dans votre éditeur préféré, Visual Studio Code pour moi.

Voici un exemple très simple, où, j’indique l’URL du site à tester, ainsi que 3 phases de tests et 2 scénarios, sur une URL protégée par une authentification basique.

config:
  target: 'https://preprod.exemple.fr'
  tls:
    rejectUnauthorized: false
  phases:
    - duration: 10
      arrivalRate: 1
      name: "Phase 1"
    - duration: 10
      arrivalRate: 40
      rampTo: 10
      name: "Phase 2"
    - duration: 20
      arrivalRate: 80
      name: "Phase 3"
scenarios:
  - name :  Accueil
    weight: 3/10
    flow:
    - get:
        url: "/"
        auth:
          user: login
          pass: passwd
  - name :  Catégorie ID 989
    weight: 7/10
    flow:
    - get:
        url: "/898-chien"
        auth:
          user: login
          pass: passwd

Pour chaque phase, j’indique le nom de visiteurs arrivalRate ainsi que la durée de la phase duration. On peut définir si besoin la « rampe » qui permet de programmer l’arriver des visiteurs virtuels par paquet de 10.

Pour chaque scénario, j’indique un nom, le endpoint, ici une page d’accueil et ma plus grosse catégorie (vous pouvez également y mettre une URL entière, qui surchargera l’URL définie en haut du scénario).

Ce qui est pour moi important pour un scénario est la notion de poids, j’ai mis 3/10 pour le premier et du coup 7/10 pour le second. Ce qui veut dire que lors de chaque phase, 70 % de mes utilisateurs arriveront sur la catégorie et le reste, 30 % donc, arriveront sur ma page d’accueil. Ce poids vous permet de coller au plus proche des habitudes de vos clients / visiteurs.

Dans le tableau tls je permets aussi à Artillery de passer outre mon certificat SSL auto-signé (comme c’est souvent le cas pour les sites de dev/préproduction).

Exécution du test

Rien de plus simple, il suffit de lancer

artillery run test.yml

Ou la suivante pour générer un rapport au format JSON

artillery run -o test_report.json test.yml

La seconde commande vous permet de sortir un fichier au format JSON qui vous donnera la possibilité de générer un reporting HTML complet et largement plus lisible pour le commun des mortels

artillery report test_report.json

Voici le rendu :

On voit un décrochage du temps de réponse à la fin du test, bien chargé, mais aucune réponse en erreur ! It sounds good !!

Report HTML Artillery

Test de montée en charge sur une API

Si vous voulez tester la capacité de votre API à tenir le charge, c’est aussi possible avec Artillery !

Il vous permet simplement de lui donner la réponse attendue, le format attendu et même les valeurs que vous attendez de votre API !

…
scenarios:
  - name: Get pets
    flow:
      - get:
          url: "/pets"
          capture:
            - json: "$.name"
              as: name
          expect:
            - statusCode: 200
            - contentType: json
            - hasProperty: results
            - equals:
              - "Tiki"
              - "{{ name }}"

…

Ici, il faut donc que la réponse de l’API soit un code HTTP 200 (code de succès), que le content type soit du JSON, que la propriété “results” soit présente et enfin que la variable « name » soit égal à “Tiki”.

Ce que j’apprécie avec Artillery

  • Configuration aisée en YAML
  • Prise en compte de paramètres qui nous facilitent la vie (certificat auto signé, authentification basique, variables)
  • Possibilité de varier la charge
  • Manipulation du body JSON, pour tester une API simplement !
  • Statistiques assez détaillées et explicites

Bien entendu, je ne fais qu’exposer une toute petite partie des possibilités d’Artillery, la documentation est complète et détaillée et vous permettra d’en apprendre plus sur cet excellent outil.

Image par mohamed Hassan de Pixabay

Merci à WeScale pour la découverte d’Artillery.io !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.