質問: Webアプリの負荷テストをするために、JMeterでテスト計画を作っているのですが、 WebアプリのPOSTデータでUUIDをランダムにPOSTする必要があるため、BSF PreProcessorでUUIDをランダム生成し、POSTの中で使おうとしています。 複数回のHTTPリクエストで同じUUIDを使ってPOSTしてほしいのですが、なぜかPreProcessorが何度も実行されているようで、UUIDがHTTPリクエスト毎に変わってしまう問題にぶち当たりました。 テスト計画の構成は ``` スレッドグループ -Pre Processor(この中でJavaScriptを使ってUUIDをランダム生成しvars.putでパラメータ化。パラメータ名は連番を与える) -ユーザーパラメータ(ユーザー毎の値を設定。authkeyなど) -HTTPリクエスト(JSONをPOST。ここで連番のパラメータ名のUUIDを使う。) -ループコントローラ --HTTPリクエスト(上記のPOSTに関連したJSONをPOST。この際に同じUUIDを使う。ループのカウントで連番のパラメータ名を指定) ``` です。 ループ内のUUIDが変わってしまうため、POSTデータの関連性が失われてWebアプリのテストが正常に行えないのです。 UUIDを最初のリクエストで全部投げて、以降のループでUUID毎に1つずつ詳細内容をPOSTするため、パラメータ名は連番です。(例:UUID1, UUID2....) なのでユーザーパラメータで${__UUID()}を使って羅列するのは非常に厳しいです。 ググってみても、Pre Processorの挙動について書かれた記事が見当たりません。 どなたか解決策を知っている方、教えてください。 よろしくお願いします。
回答: ドキュメントとしては、4.7 Pre-Processor Elementsからリンクされている、4.10 Scoping Rulesに以下のようにあります。 * JMeterのテスト計画を構成する要素は、 主に ordered (順列的) (controller と sampler) であると考えられるものと、 hierarchical (階層的) (それ以外) なものに分類できる > > Some elements in the test trees are strictly hierarchical (Listeners, Config Elements, Post-Procesors, Pre-Processors, Assertions, Timers), and some are primarily ordered (controllers, samplers). > > > + Pre-Processorは、種別としては hierarchical である * hierarchical な要素は、その親要素に属するすべてのリクエストに適用される > > If its parent is a Controller, then it affects all requests that are descendants of that Controller. > > > * 各リクエストを処理する時には、テスト計画のツリーを自分の位置から根っこまで親から親へと辿っていき、訪問した要素に属する configuration (hierarchical) 要素を集めて適用する、と考えると分かりやすい > > imagine each Request being passed up the tree branches, to its parent, then to its parent's parent, etc, and each time collecting all the configuration elements of that parent > > > このセクションにテスト計画の例があるほか、4.9 Execution Orderにも実行順の例があります: 以下のテスト計画があったとすると * Controller + Post-Processor 1 + Sampler 1 + Sampler 2 + Timer 1 + Assertion 1 + Pre-Processor 1 + Timer 2 + Post-Processor 2 以下のように実行される: ``` Pre-Processor 1 Timer 1 Timer 2 Sampler 1 Post-Processor 1 Post-Processor 2 Assertion 1 Pre-Processor 1 Timer 1 Timer 2 Sampler 2 Post-Processor 1 Post-Processor 2 Assertion 1 ```