Ce que JMeter fait très bien
Générer de la charge concurrente. Groupes de threads, montée en charge progressive, générateurs distribués. C'est ce pour quoi il a été conçu et il reste l'une des meilleures options gratuites.
Une large couverture de protocoles. Bien au-delà de HTTP, ce qui compte pour les systèmes d'entreprise dotés de couches de messagerie et de base de données.
Être déjà installé. Ce n'est pas un mérite technique, et c'est une vraie raison pour laquelle les équipes l'utilisent.
Là où les tests d'API avec JMeter deviennent laborieux
Les plans de test sont en XML
Relire une modification dans une pull request est quasiment impossible.
Les conflits de fusion dans un fichier .jmx sont une souffrance à part entière.
Les assertions sont superficielles par défaut
Le code de réponse et la recherche de sous-chaînes couvrent les cas courants, et guère plus.
Tout ce qui touche à la structure passe par un élément de script.
L'état se gère à la main
Extracteurs, variables et contrôleurs, tout est câblé à la main.
Le graphe de dépendances réside dans la structure du plan au lieu d'être déclaré.
La répartition qui fonctionne
Gardez JMeter pour la question de la capacité : comment le service se comporte sous une concurrence soutenue, où la latence se dégrade, ce qui cède en premier. C'est à cela qu'il sert, et rien ici ne suggère de le remplacer.
Confiez l'exactitude fonctionnelle à un outil qui traite les sessions, les valeurs capturées, l'ordonnancement et le nettoyage comme des éléments du produit plutôt que comme des composants à assembler. Ces quatre points sont décrits dans la documentation sur les tests d'API.
Une chose qui vaut la peine d'être faite dans JMeter malgré tout
Ajoutez des assertions sur le corps des réponses à vos plans de charge, ne serait-ce que sur un échantillon de requêtes. Un test de charge qui ne vérifie que les codes de statut affichera une exécution impeccable pendant que le service renvoie des résultats vides, et « rapide et faux » est le pire résultat possible, parce que personne n'ira vérifier.
Mettre en place la couche fonctionnelle
Terminal
npm install -g @testsprite/testsprite-cli
testsprite setup
Le tableau de bord couvre le même périmètre pour qui ne souhaite pas d'installation locale, et l'ensemble des commandes disponibles se trouve dans le dépôt CLI.
Le problème du .jmx, énoncé clairement
Si la couverture fonctionnelle vieillit mal dans JMeter, ce ne sont pas les assertions qui sont en cause, c'est le format de fichier, et il vaut la peine d'être concret sur les raisons.
Un plan de test, c'est du XML généré par une interface graphique. Ouvrir une pull request qui modifie une seule assertion produit un diff fait d'éléments réordonnés et d'identifiants générés : la relecture devient un acte de foi. Deux personnes qui modifient le même plan dans la même semaine produisent un conflit de fusion qu'il est plus simple de résoudre en jetant l'un des deux côtés qu'en le lisant. Et comme la relecture est impraticable, le plan accumule des modifications que personne n'a examinées.
C'est un coût réel, et il reste invisible tant qu'une seule personne est responsable du plan, ce qui est précisément la situation dans laquelle la plupart des suites JMeter sont construites.
Des cadences différentes
La charge avant les livraisons et après les changements d'architecture. L'exactitude sur chaque pull request, parce que c'est là qu'une régression coûte le moins cher à corriger.
La GitHub App est un webhook que vous configurez dans le tableau de bord TestSprite. Elle écoute l'événement de déploiement que votre pipeline produit déjà, si bien que rien ne change dans votre dépôt.
GitHub Actions place l'étape au sein de votre propre workflow, configurée depuis le terminal.
Ce que TestSprite retire du plan de charge
La couverture fonctionnelle qui s'est retrouvée dans JMeter parce que JMeter était déjà là. Les plans sont générés à partir d'une passe de découverte et de votre spécification, décrits en langage clair au lieu d'être assemblés élément par élément, et relus dans une pull request au lieu d'être enfouis dans du XML généré.
Auto-Authentication maintient les sessions actives pendant toute l'exécution, Dynamic Variables transporte les valeurs d'un appel à l'autre, Dependency Chains déduit l'ordre d'exécution de ce que chaque cas exige et produit, et Auto-Cleanup supprime exactement ce que l'exécution a créé. Ce sont les briques que vous construisez aujourd'hui avec des extracteurs, des variables, des contrôleurs et des groupes de threads tearDown.
Vos plans de charge restent exactement tels quels, à faire ce que JMeter fait vraiment très bien. Le gain, c'est que l'exactitude est vérifiée à chaque pull request au lieu de l'être avant les livraisons, et que la modification d'une assertion devient quelque chose qu'une deuxième personne peut relire.
JMeter peut-il faire des tests d'API fonctionnels ?
Oui, et l'ergonomie joue contre vous. Les plans en XML, les assertions superficielles par défaut et la gestion manuelle de l'état en sont le prix.
Faut-il remplacer JMeter ?
Pas pour la charge. Remplacez la couverture fonctionnelle qui s'y est retrouvée par accident, et gardez les plans de charge.
Et Taurus ou JMeter DSL ?
Les deux améliorent considérablement l'expérience d'écriture. Ils ne changent rien à ce pour quoi l'outil est optimisé.
Peut-on exécuter les deux en CI ?
Oui. Ils répondent à des questions différentes sur des cadences différentes, et aucun des deux n'a besoin de connaître l'autre.
TestSprite génère-t-il de la charge ?
Non. Il vérifie l'exactitude, y compris les cas limites. La concurrence soutenue, c'est le terrain de JMeter.
Gardez les plans de charge, déplacez l'exactitude.
Les tests d'API avec JMeter fonctionnent parce que JMeter est déjà là, pas parce qu'il est adapté. Gardez-le pour la capacité, ajoutez des assertions sur le corps des réponses aux plans de charge que vous avez déjà, et confiez l'exactitude fonctionnelle à un outil conçu pour la session, l'état, l'ordonnancement et le nettoyage.