JMeter – Fixer la durée de répétition d’une requête

Vous utilisez JMeter pour faire un tir de charge (ou autres), et vous devez avoir une requête qui s’exécute à un interval fixe quelque soit le temps de réponse de la requête.

Par exemple, vous devez exécuter une requête chaque 20 secondes, le temps de réponse de la dite requête est 4,5 sec. Donc si on démarre à T0, on a T0+4,5 sec la requête, puis on demande à JMeter de faire une pause pendant (20 sec – 4,5 sec = 15,5 sec), puis une nouvelle requête, etc.

Schéma de répétition d'une requête à interval fixe

Voici comme le faire avec JMeter.

Test Plan Jmeter

Dans l’élément User Defined Variables, on place une variable qui sera la durée fixe (en millisecondes) de l’interval.

Element User Defined Variables

On place également un élément Transaction Controller qui contient l’élément HTTP Request (ou plusieurs éléments HTTP Request). À l’intérieur de l’élément HTTP Request (ou du premier élément), on ajoute un élément User Parameters, dans lequel on ajoute une variable START qui sera initialisée à

${__time(,)}

, c’est à dire au temps en millisecondes de début de la requête.

Element Users Parameters

Ensuite en dernier élément du Transaction Controller, on ajoute un élément Test Action, qui sera chargé de mettre en pause le thread group durant l’intervalle de temps d’attente. Pour cela on définit sa durée avec la formule suivante :

${__longSum(${INTERVALLE},${START},-${__time()})}

Cette fonction fait le calcul du temps à attendre par rapport à la variable START et la variable INTERVALLE.

Element Test Action

On ajoute les autres éléments restants (cookie manager, http request defaults, etc). Puis, on peut lancer un petit tir de contrôle de bon fonctionnement. Ici le Thread Group est à 1-1-4 (1 user, ramp-up à 1 sec, 4 boucles).

Le résultat est ci-dessous. On voit que les requêtes durent en moyenne 5,7 secondes, et que chaque requête est appelée chaque 20 secondes (l’élément Transaction Controller donnant le temps passé de la requête HTTP + du Test Action).

Résultats du tir

Et voilà, avec ce type de scénario, on peut répondre à un besoin du type « je veux que mon utilisateur exécute chaque 20 secondes une requête quelque soit le temps de réponse de la requête »

Le script JMeter est téléchargeable ici.

(2015/08/10) Vous pouvez également utiliser l’élément Compteur de débit constant pour effectuer ce genre d’opération.

./

Flattr this!

3 commentaires

  1. Bertrand GILLIS dit :

    Que se passe-t-il dans votre exemple si le temps de réponse est supérieur aux 20 secondes de l’intervalle ?

    Par exemple :

    – intervalle = 20000ms
    – temps de réponse = 35000ms

    on aurait alors dans l’expression ${__longSum(${INTERVALLE},${START},-${__time()})} une durée négative ?!?!?

  2. Milamber dit :

    Bonne question,

    Et bien l’intervalle d’attente sera « déjà » à une valeur négative, et JMeter ne va pas attendre et passer directement à l’itération suivante (je viens de le tester sur mon scénario de test)

    En d’autres termes, cela donne dans le Summary Report, les temps de l’élément HTTP Request sont égales (à 2 ms près) à l’élément Transaction Controller.

    (dans le code source de Jmeter c’est la méthode Thread.sleep(long) qui est utilisée, donc si c’est négatif, il n’y a pas de sleep – semble-t-il -)

  3. […] ce précédent billet, je montrais une façon de fixer l’intervalle de répétition de ses requêtes, […]