как реализовать случайную функцию на основе пользовательского начального числа?
Мне нужно создать функцию/компонент генератора случайных чисел для jmeter на основе пользовательского начального числа, чтобы иметь возможность точно воспроизвести тестовый прогон, который использует __RandomFunctions(). Он должен работать так же, как встроенные случайные функции, такие как __RandomDate() и т. д., но на основе начального случайного начального значения.
Глядя на источник Jmeter, кажется, что все встроенные случайные функции (__RandomDate и т. д.) используют ThreadLocalRandom, который не использует собственное начальное число. Я также рассматривал возможность создания плагина, но это не поможет, поскольку мне нужно использовать его как функцию из различных сэмплеров. Итак, каков наилучший способ создать экземпляр нового объекта Random с начальным значением, а затем вызвать его с помощью random.nextLong из различных сэмплеров? Он не обязательно должен быть глобальным, вполне подойдет случайный объект для каждого потока. Как мне сделать это проще всего?
Для этого вы можете использовать функцию __groovy(), что-то вроде:
${__groovy(new Random(12345).nextInt(),)}
Вы можете написать свой собственный плагин JMeter реализуя вышеуказанную функциональность.
Вы можете запросить улучшение
Вы можете предложить вклад в существующую функцию Random, чтобы ввести «начальный» параметр.
Дорогой, я не настолько телепат, чтобы гадать, как ты собираешься использовать сгенерированное значение. Если вы хотите сгенерировать ее только один раз и повторно использовать позже, измените функцию, чтобы она выглядела как ${__groovy(new Random(12345).nextInt(),foo)}
, а затем используйте ${foo}
там, где вам нужно передать значение. Дополнительную информацию см. в статье Функции Apache JMeter. Введение . Также можно сохранить экземпляр класса Random в свойствах JMeter ( jmeter.apache.org/usermanual/properties_reference.html) и вызывать его оттуда, где это необходимо.
Извините, я очень ценю вашу помощь и прошу прощения за неясное описание. К сожалению, это решение не решит мою проблему, поскольку мне нужно создать экземпляр объекта Random(seed) для каждого потока и иметь возможность вызывать его (т. е. nextLong) из различных сэмплеров. Пример JDBC SQL: выберите c1 из t1, где c1 = ${__myRandomFunc()}, и следующий вызов сгенерирует следующее случайное значение на основе того же начального значения. Таким образом, все рандомизированные значения будут точно воспроизводимы. Я предполагаю, что альтернативой было бы создание списка случайных значений и выбор по одному из этого списка.
Вы можете добавить JSR223 Sampler в начало теста и использовать там следующий код: vars.putObject("random", new Random(12345))
. Вызовите функцию ${__groovy(vars.getObject('random').nextInt(),)}
везде, где вам нужно «случайное» значение. vars
означает JMeterVariables экземпляр класса, более подробную информацию см. в статье 8 лучших классов Java JMeter, которые следует использовать с Groovy.
1. Невозможно использовать для этого заводную функцию, поскольку она будет создавать экземпляр нового объекта для каждого вызова, а использование одного и того же начального числа будет генерировать одно и то же случайное число. 2. AFAIU плагин нельзя вызвать из другого семплера или я здесь не прав? 3-4. Вероятно, это занимает много времени (понятно), поэтому мой вопрос был 4. где (метод класса и т. д.) нам предпочтительно создавать экземпляр нового Random, чтобы его можно было использовать так же, как __RandomDate() и т. д.?