web-dev-qa-db-fra.com

JMeter modifie les en-têtes HTTP pendant le test

J'essaie de tester un service HTTP avec JMeter. Le service HTTP nécessite une authentification via un mécanisme de jeton de support simple. J'essaie de procéder comme suit:

  1. Demande d'authentification POST
  2. Stocker le jeton en tant que variable
  3. Définissez l'en-tête HTTP d'autorisation sur la variable stockée
  4. Demander des ressources protégées
  5. Évaluer les performances

Jusqu'à présent, j'ai pu publier la demande, obtenir le jeton, l'extraire avec regex, l'enregistrer dans une variable et affirmer que la variable est correctement définie.

Le problème est d'obtenir la variable dans l'en-tête HTTP. Dans le "Header Manager", la valeur est définie comme suit:

Header Manager Attempt

Malheureusement, lorsque les prochaines demandes sont émises, leur en-tête d'autorisation a la valeur "Bearer". La recherche sur Internet m'a amené à croire que les en-têtes sont configurés avant le début du thread , ce qui expliquerait le "porteur"

Mon échantillonnage/regroupement/imbrication est le suivant:

JMeter Nesting

Tous les tests échouent pour obtenir une ressource restreinte, qui échoue avec un 400, car l'en-tête d'autorisation est mal formé.

J'ai l'impression de manquer quelque chose de vraiment évident et/ou d'aborder ce problème dans le mauvais sens.

22
Bennett

Modifier en août 2017:

  • Bien que cette réponse soit correcte et acceptée par l'auteur, elle est trop complexe et la bonne réponse devrait être celle ci-dessous qui est beaucoup plus simple et maintenable https://stackoverflow.com/a/43283700/460802 .

Vous pouvez construire dynamiquement votre en-tête d'autorisation en utilisant Beanshell PreProcessor comme suit:

  1. Ajouter vide HTTP Header Manager en tant qu'enfant de votre demande qui nécessite une autorisation
  2. Ajoutez Beanshell PreProcessor en tant qu'enfant de la même demande avec le code suivant:

    import org.Apache.jmeter.protocol.http.control.Header;
    
    sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("BEARER")));
    

Cela va construire un en-tête entièrement dynamique en utilisant la variable BEARER.

  • sampler est un raccourci vers la classe HTTPSamplerProxy qui donne accès à l'instance Sampler parent
  • vars est l'instance de la classe JMeterVariables qui permet un accès en lecture/écriture à toutes les variables JMeter disponibles dans les limites du contexte actuel (généralement le groupe de thread actuel)

Voir Comment utiliser BeanShell: le composant intégré préféré de JMeter guide pour plus de détails sur les scripts Beanshell et le type de livre de recettes Beanshell.

31
Dmitri T

Voir ce message sur le forum: http://www.jmeter-archive.org/Variables-in-HTTP-headers-td4579331.html

Vous devez déplacer votre connexion sous un contrôleur. Dans mon cas, j'ai utilisé un contrôleur une seule fois. Ensuite, après le contrôleur, vous pouvez ajouter le gestionnaire d'en-tête HTTP avec l'en-tête d'autorisation en tant que "Bearer $ {BEARER}" et il lira votre variable. C'est mieux que l'autre réponse car vous n'avez alors pas besoin de dupliquer le préprocesseur BeanShell sous chaque demande. Mon arbre ressemblait à ceci:

JMeter Tree

10
Ed Greaves