Использование UltimateThreadGroup с Java API дает исключение Nullpointer

#jmeter #jmeter-plugins

#jmeter #jmeter-плагины

Вопрос:

Я пытаюсь использовать UltimateThreadGroup с Java API JMeter, я создаю объект UltimateThreadGroup, как в приведенном ниже коде [2], и добавляю его в хэш-дерево. Наконец, передайте его на выполнение движку JMeter.

Но это дает следующее исключение NullPointerException в середине выполнения. Когда я отлаживал код, проблема, похоже, исходит из следующего метода класса JMeterThread.

общедоступный JMeterThread(тест хэш-дерева, монитор JMeterThreadMonitor, примечание ListenerNotifier, логическое значение isSameUserOnNextIteration)

Но проблема возникает в разных строках кода от выполнения к выполнению. Так что трудно понять, что вызывает NullPointer.

У кого-нибудь есть идея о том, что здесь происходит? Ценю ваши ответы.

[1]

     2020-11-03 13:08:20 DEBUG TestCompiler:273 - adding controller: kg.apc.jmeter.threads.UltimateThreadGroup@30b2b76f to sampler config
2020-11-03 13:08:22 ERROR JMeterThread:319 - Test failed!
java.lang.NullPointerException
    at org.apache.jmeter.threads.AbstractThreadGroup.addTestElement(AbstractThreadGroup.java:122)
    at org.apache.jmeter.threads.AbstractThreadGroup.addTestElementOnce(AbstractThreadGroup.java:131)
    at org.apache.jmeter.threads.TestCompiler.subtractNode(TestCompiler.java:151)
    at org.apache.jorphan.collections.HashTree.traverseInto(HashTree.java:997)
    at org.apache.jorphan.collections.HashTree.traverseInto(HashTree.java:994)
    at org.apache.jorphan.collections.HashTree.traverse(HashTree.java:976)
    at org.apache.jmeter.threads.JMeterThread.initRun(JMeterThread.java:704)
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:252)
    at java.lang.Thread.run(Thread.java:748)
  

[2]

 UltimateThreadGroup ultimateThreadGroup = new UltimateThreadGroup();
ultimateThreadGroup.setName(threadGroupName);
ultimateThreadGroup.setProperty(AbstractThreadGroup.ON_SAMPLE_ERROR, AbstractThreadGroup.ON_SAMPLE_ERROR_CONTINUE);
PowerTableModel dataModel = new PowerTableModel(UltimateThreadGroupGui.columnIdentifiers, UltimateThreadGroupGui.columnClasses);
dataModel.addRow(new Integer[]{2, 4, 10, 60, 10});
dataModel.addRow(new Integer[]{3, 4, 10, 120, 10});
CollectionProperty prop = JMeterPluginsUtils.tableModelRowsToCollectionProperty(dataModel, UltimateThreadGroup.DATA_PROPERTY);
ultimateThreadGroup.setData(prop);
ultimateThreadGroup.setEnabled(setEnabled);
ultimateThreadGroup.setProperty(TestElement.TEST_CLASS, UltimateThreadGroup.class.getName());
ultimateThreadGroup.setProperty(TestElement.GUI_CLASS, UltimateThreadGroupGui.class.getName());
  

Ответ №1:

  1. Сначала вам нужно создать экземпляр контроллера цикла, например:

     LoopController loopController = new LoopController();
    loopController.setLoops(1);
    loopController.setFirst(true);
    loopController.setProperty(TestElement.TEST_CLASS, LoopController.class.getName());
    loopController.setProperty(TestElement.GUI_CLASS, LoopControlPanel.class.getName());
    loopController.initialize();
      
  2. Во-вторых, вам нужно добавить контроллер цикла с шага 1 в вашу конечную группу потоков:

     ultimateThreadGroup.setSamplerController(loopController);
      

Дополнительная информация:

В дальнейшем просто сравните файл .jmx, который вы генерируете программно, с тем, который создается графическим интерфейсом JMeter, Вы сможете увидеть, какие поля, свойства и т. Д. Отсутствуют

Комментарии:

1. Спасибо, Дмитрий, добавление контроллера цикла решило проблему с NullPointerException

2. Пришлось установить контроллер цикла как loopController.setLoops(-1), иначе он не будет учитывать определенные нами временные интервалы и выполнит только один цикл