Я выполняю нагрузочное тестирование API, используя базовую настройку в JMeter.
Идея здесь в том, что группа Thread порождает группу клиентов/потоков, и каждый из этих клиентов имеет группу циклов, которые выполняются параллельно (используя Bzm - параллельный контроллер).
Каждый цикл представляет собой какое-то действие, которое может выполнять пользователь, и каждый цикл имеет унифицированный контроллер таймера для настройки того, как часто данное действие выполняется для каждого клиента.
Одно из действий состоит из двух вызовов, первый (1) извлекает некоторые идентификаторы, которые затем извлекаются с помощью экстрактора JSON и немного модифицируются с помощью постпроцессора BeanShell. Затем результат постпроцессора используется в качестве параметра для следующего вызова (2).
Проблема, с которой я столкнулся, заключается в том, что в моем сводном отчете отображается гораздо больше результатов первого HTTP-запроса (1), чем второго (2). Я ожидаю, что они всегда будут вызываться одинаковое количество раз.
Я предполагаю, что все это сводится к тому, что мне не хватает базового понимания потока и параллелизма (и, возможно, таймеров) в JMeter, но я не смог понять это, поэтому мне нужна помощь.
Это настройка, представьте, что есть несколько циклов.
Thread group
+
|
+------ ---+ Parallel controller
| +
| |
| +-----------+ Loop
| +
| +----------+ Transaction
| | +
| | |
| | +---------+ Uniform random timer
| | +
| | |
| | |
| | +
| | (1) HTTP request
| | +
| | +---------+ JSON extractor
+ | | +
| | |
Summary Report | | +
| | BeanShell Post processor
| |
| |
| |
| +
|
| (2) HTTP request
|
|
|
Loop +----------------------------------+
|
|
Итак, я понял это. Все сводится к пониманию структуры тестов, погружение в документацию очень помогло, так как она очень подробная.
Это соответствующая часть:
Обратите внимание, что таймеры обрабатываются перед каждым сэмплером в осциллографе в какие они обнаружены; если в одной области есть несколько таймеров, все таймеры будут обрабатываться перед каждым сэмплером. Таймеры только обрабатывается вместе с семплером. Таймер, которого нет в тот же объем, что и сэмплер, вообще не будет обрабатываться. Чтобы применить таймер к одному сэмплеру, добавьте таймер как дочерний элемент пробоотборник. Таймер будет применен до выполнения семплера. К применить таймер после семплера, либо добавить его к следующему семплеру, либо добавьте его как дочерний элемент сэмплера действий управления потоком.
https://jmeter.apache.org/usermanual/component_reference.html#таймеры
Еще одна чрезвычайно важная вещь, которую нужно понять, это то, что некоторые строительные блоки (по отношению к древовидной структуре) являются иерархическими, некоторые упорядочены, а некоторые являются и тем, и другим. Подробно это описано здесь https://jmeter.apache.org/usermanual/test_plan.html#scoping_rules
В целом мою проблему можно решить, поместив Единый случайный таймер в качестве дочернего элемента первого HTTP-вызова (1), заставив его влиять только на этот вызов, или добавив действие управления потоком в качестве родственного элемента после второго вызова (2) и добавление к нему универсального случайного таймера в качестве дочернего элемента.