Load testing avec K6

Lors d’un de mes derniers articles, j’ai montré comment tester une application Web avec l’utilisation de JMeter.

Dernièrement j’ai vu une vidéo de Nick Chapsas sur K6 et ça m’a convaincu de tester la librairie.

Il existe plusieurs types de tests lorsque nous souhaitons tester notre applications en termes de charge :

  • Smoke testing : teste si votre application peut encaisser la charge minimale d’utilisateurs
  • Load testing : Evaluer la performance pour un nombre d’utilisateurs(nombre d’utilisateurs prévus sur l’application) ou de requêtes et tout ça dans un contexte simultané.
  • Stress testing et spike testing : Tester les limites de l’application dans des conditions extrêmes comme une soudaine montée en charge du nombre d’utilisateurs ou de requêtes.
  • Soak/endurance testing : Evaluer les performances sur une longue période de test pour un nombre d’utilisateurs raisonnables.

Pourquoi tester les performances ?

  • Parce que la satisfaction de l’utilisateur est primordiale et que c’est lui qui va déterminer l’adoption (ou non) de votre application et rien ne l’irrite plus que d’attendre.
  • Vous avez besoin de savoir si votre app tient la route avec un traffc plus gros et surtout parce que quand vous testez au cours du développement, vous êtes seul sur votre machine.
  • Cela vous prépare à une hausse du trafic inattendue.
  • Cela augmente votre scalabilité du coup car vous savez que vous pourrez tenir le choc.
  • Parce que tout ne peut être identifié avec des tests unitaires ou d’intégration 😉

Nous en arrivons à K6 !

J’avais présenté JMeter qui est un outil simple et extrêmement puissant mais j’ai découvert K6 tout récemment et je vous en fais donc profiter 😀

K6 pour windows(dans mon cas) s’installe via cette url.

Une fois installé, vous pouvez créer vos premiers tests. Il suffit de créer un fichier JS dans votre solution idéalement.

J’ai donc repris ma solution qui implémentait une API avec des appels pour récupérer des livres de 3 façons différentes dans laquelle j’ai implémenté un petit test tout simple.

import http from "k6/http";
import { check, sleep } from "k6";

// Common things
const API_URL = "https://localhost:7125";

// Test setup
export let options = {
    vus: 10,
    duration: '30s'
};

// Test scenario
export default function () {


    //call simple DTO endpoint
    let callBookSimpleDTO = http.get(`${API_URL}/BookSimpleDTO`)

    check(
        callBookSimpleDTO,
        { "call simple book DTO is 200": (r) => r.status == 200 }
    );

    //call simple DTO endpoint
    let callBookFullDTO = http.get(`${API_URL}/BookFullDTO`)

    check(
        callBookFullDTO,
        { "call full book DTO is 200": (r) => r.status == 200 }
    );

    //call simple DTO endpoint
    let callGetBookFullDTOWithProject = http.get(`${API_URL}/GetBookFullDTOWithProject`)

    check(
        callGetBookFullDTOWithProject,
        { "call callGetBookFullDTOWithProject is 200": (r) => r.status == 200 }
    );

    // Short break between iterations
    sleep(0.5);
}

Dans le code ci-dessus, la partie importante est la partie

export let options = {
vus: 10,
duration: ’30s’
};

Elle détermine via vus , les virtuals users et la durée du test car comme nous l’avons vu, nous pourrons déterminer des tests « d’endurance ».

et voici le résultat lorsque j’exécute le test en lançant la commande : k6 run Sampletest.js

Pour revenir aux options, elles permettent de configurer différents types de tests et même d’implémenter des scénarios.

C’est la que K6 prend un avantage sur JMeter car il permet le mélange de tests de charge et de tests unitaires de nos API 😎

Jetez un coup d’oeil à la doc pour exemples plus avancés mais de mon avis, K6 offre de grandes possibilités et est avant tout simple à utiliser.

https://k6.io/docs/

Si vous voulez des exemples de tous les types de test avec les options, je les ai déposés sur le repository créé pour cela ici.

Have fun coding !