web-dev-qa-db-ja.com

JMeterはテスト中にHTTPヘッダーを変更します

JMeterでHTTPサービスをテストしようとしています。 HTTPサービスでは、単純なベアラートークンメカニズムによる認証が必要です。私は次のように進めようとしています:

  1. POST認証リクエスト
  2. トークンを変数として保存
  3. Authorization HTTPヘッダーを保存された変数に設定します
  4. 保護されたリソースをリクエストする
  5. パフォーマンスを評価する

これまで、リクエストをポストし、トークンを取得し、正規表現でトークンを抽出し、変数に保存して、変数が適切に設定されていることをアサートすることができました。

問題は、変数をHTTPヘッダーに入れることです。 「Header Manager」では、値は次のように設定されます。

Header Manager Attempt

残念ながら、次のリクエストが発行されると、認証ヘッダーの値は「Bearer」になります。インターネットを検索した結果、ヘッダーは スレッドが開始する前に構成されている であると信じ込まされました。これにより、「ベアラー」

私のサンプリング/グループ化/ネストは次のとおりです。

JMeter Nesting

すべてのテストがパスして、制限されたリソースを取得しますが、承認ヘッダーの形式が正しくないため、400で失敗します。

私は本当に明らかな何かを見逃している、および/またはこの問題に間違った方法でアプローチしているように感じます。

22
Bennett

2017年8月に編集:

  • この答えは素晴らしく、著者によって受け入れられていますが、それは複雑すぎて、正しい答えははるかにシンプルで保守しやすいものでなければなりません https://stackoverflow.com/a/43283700/460802

次のように Beanshell PreProcessor を使用して、認証ヘッダーを動的に構築できます。

  1. emptyHTTPヘッダーマネージャーを、承認が必要な要求の子として追加します。
  2. 次のコードを使用して、同じリクエストの子としてBeanshell PreProcessorを追加します。

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

これは、BEARER変数を使用して完全に動的なヘッダーを構築します。

  • samplerHTTPSamplerProxy クラスの省略形で、親Samplerインスタンスへのアクセスを提供します
  • varsJMeterVariables クラスのインスタンスであり、現在のコンテキスト(通常は現在のスレッドグループ)の境界内で使用可能なすべてのJMeter変数への読み取り/書き込みアクセスを許可します。

BeanshellスクリプトとBeanshellクックブックの種類の詳細については、 BeanShellの使用方法:JMeterのお気に入りの組み込みコンポーネント ガイドを参照してください。

31
Dmitri T

このフォーラムの投稿を参照してください: http://www.jmeter-archive.org/Variables-in-HTTP-headers-td4579331.html

ログインをコントローラーの下に移動する必要があります。私の場合、Only Once Controllerを使用しました。次に、コントローラーの後に、「Bearer $ {BEARER}」としてAuthorizationヘッダーを持つHTTPヘッダーマネージャーを追加すると、変数を読み取ります。これは、すべてのリクエストでBeanShell PreProcessorを複製する必要がないため、他の回答よりも優れています。私のツリーは次のようになりました。

JMeter Tree

10
Ed Greaves