2015-08-31 1 views
0

Я хочу переписать определенную пользователем переменную в Jmeter в beanshell. Я препроцессор triead beanshell, постпреобразователь или образец, но ничего не работало.Настройка JMeter пользовательской переменной в beanshell не работает

Мой код:

vars.put("box_user", "mybox"); 
log.info(vars.get("box_user")); 

Выход правильно, mybox. Но когда я использую переменную в пробоотборнике позже с $ {box_user}, имя пользователя неверно. Он имеет значение начала инициализации.

Что не так?

Вот XML моего Jmeter проекта, попробовал другое переменное имя, но он не работает:

<?xml version="1.0" encoding="UTF-8"?> 
    <jmeterTestPlan version="1.2" properties="2.8" jmeter="2.13 r1665067"> 
    <hashTree> 
    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true"> 
     <stringProp name="TestPlan.comments"></stringProp> 
     <boolProp name="TestPlan.functional_mode">false</boolProp> 
     <boolProp name="TestPlan.serialize_threadgroups">false</boolProp> 
     <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> 
     <collectionProp name="Arguments.arguments"/> 
     </elementProp> 
     <stringProp name="TestPlan.user_define_classpath"></stringProp> 
    </TestPlan> 
    <hashTree> 
     <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true"> 
     <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> 
     <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> 
      <boolProp name="LoopController.continue_forever">false</boolProp> 
      <stringProp name="LoopController.loops">1</stringProp> 
     </elementProp> 
     <stringProp name="ThreadGroup.num_threads">1</stringProp> 
     <stringProp name="ThreadGroup.ramp_time">1</stringProp> 
     <longProp name="ThreadGroup.start_time">1441359197000</longProp> 
     <longProp name="ThreadGroup.end_time">1441359197000</longProp> 
     <boolProp name="ThreadGroup.scheduler">false</boolProp> 
     <stringProp name="ThreadGroup.duration"></stringProp> 
     <stringProp name="ThreadGroup.delay"></stringProp> 
     </ThreadGroup> 
     <hashTree> 
     <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="BeanShell Sampler" enabled="true"> 
      <stringProp name="BeanShellSampler.query">vars.put(&quot;user&quot;, &quot;one&quot;); 
vars.put(&quot;host&quot;, &quot;localhost&quot;);</stringProp> 
      <stringProp name="BeanShellSampler.filename"></stringProp> 
      <stringProp name="BeanShellSampler.parameters"></stringProp> 
      <boolProp name="BeanShellSampler.resetInterpreter">false</boolProp> 
     </BeanShellSampler> 
     <hashTree/> 
     <JDBCDataSource guiclass="TestBeanGUI" testclass="JDBCDataSource" testname="JDBC Connection Configuration" enabled="true"> 
      <stringProp name="dataSource">dbcon</stringProp> 
      <stringProp name="poolMax">10</stringProp> 
      <stringProp name="timeout">10000</stringProp> 
      <stringProp name="trimInterval">60000</stringProp> 
      <boolProp name="autocommit">true</boolProp> 
      <stringProp name="transactionIsolation">DEFAULT</stringProp> 
      <boolProp name="keepAlive">true</boolProp> 
      <stringProp name="connectionAge">5000</stringProp> 
      <stringProp name="checkQuery">Select 1</stringProp> 
      <stringProp name="dbUrl">jdbc:postgresql://localhost:5432/box</stringProp> 
      <stringProp name="driver">org.postgresql.Driver</stringProp> 
      <stringProp name="username">${user}</stringProp> 
      <stringProp name="password">pwd</stringProp> 
     </JDBCDataSource> 
     <hashTree/> 
     <JDBCSampler guiclass="TestBeanGUI" testclass="JDBCSampler" testname="JDBC Request" enabled="true"> 
      <stringProp name="dataSource">dbcon</stringProp> 
      <stringProp name="queryType">Select Statement</stringProp> 
      <stringProp name="query">SELECT 1</stringProp> 
      <stringProp name="queryArguments"></stringProp> 
      <stringProp name="queryArgumentsTypes"></stringProp> 
      <stringProp name="variableNames"></stringProp> 
      <stringProp name="resultVariable"></stringProp> 
      <stringProp name="queryTimeout"></stringProp> 
      <stringProp name="resultSetHandler">Store as String</stringProp> 
     </JDBCSampler> 
     <hashTree/> 
     <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true"> 
      <boolProp name="ResultCollector.error_logging">false</boolProp> 
      <objProp> 
      <name>saveConfig</name> 
      <value class="SampleSaveConfiguration"> 
       <time>true</time> 
       <latency>true</latency> 
       <timestamp>true</timestamp> 
       <success>true</success> 
       <label>true</label> 
       <code>true</code> 
       <message>true</message> 
       <threadName>true</threadName> 
       <dataType>true</dataType> 
       <encoding>false</encoding> 
       <assertions>true</assertions> 
       <subresults>true</subresults> 
       <responseData>false</responseData> 
       <samplerData>false</samplerData> 
       <xml>false</xml> 
       <fieldNames>false</fieldNames> 
       <responseHeaders>false</responseHeaders> 
       <requestHeaders>false</requestHeaders> 
       <responseDataOnError>false</responseDataOnError> 
       <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> 
       <assertionsResultsToSave>0</assertionsResultsToSave> 
       <bytes>true</bytes> 
       <threadCounts>true</threadCounts> 
      </value> 
      </objProp> 
      <stringProp name="filename"></stringProp> 
     </ResultCollector> 
     <hashTree/> 
     </hashTree> 
    </hashTree> 
    </hashTree> 
</jmeterTestPlan> 

Ошибка: НЕУСТРАНИМЫЕ: роли «$ {пользователь}» не существует -> так моя переменная ist not replace, я не знаю, почему

ответ

1

Есть ли вероятность, что вы ссылаетесь на переменную в другой группе Thread? Если да, то вам нужно использовать JMeter Properties вместо нравится:

props.put("box_user", "mybox"); 

, а затем использовать ${__P(box_user,)} для доступа к значению.

Это связано с JMeter переменных видимости Ограничивается текущей группы резьбы, согласно Functions and Variables главе:

Свойства не так же, как переменные. Переменные локальны для потока; свойства являются общими для всех потоков, и их нужно ссылаться с помощью функции __P или __property.

См. How to Use Variables in Different Thread Groups. руководство для получения более подробной информации.

+0

Нет, у меня есть все сэмплеры и конфигурации в одной группе потоков – Peter

+1

В этом случае это должно сработать. Просто проверьте * jmeter.log * на любые ошибки, связанные с Beanshell, или добавьте 'debug();' директива в начале вашего скрипта и проверьте stdout –

0

Видимо, он не установлен. Вы должны поместить пробный отладчик в свою группу потоков и убедиться, что он даже установлен. Сэмплер отладки позволяет видеть все ваши переменные в jmeter. Если вы не видите свою переменную, она не будет установлена.

+0

Привет, я использовал Debug Sampler, там я нашел переменную: TESTDBUSER = sa11, когда я хочу чтобы использовать эту переменную позже в сэмплере с $ {TESTDBUSER}, тогда я получил ошибку Ошибка входа для пользователя $ $ {TESTDBUSER}. Переменная не заменяется – Peter

1

Проблема заключается в выборе времени, а не в том, будет ли beanshell правильно сохранять переменную. См. section 3.9: Execution order о порядке обработки элементов JMeter. В нем четко указано, что элементы конфигурации обрабатываются до всего остального. Вот почему ${user} (определенный в препроцессоре beanshell) не определен в момент обработки конфигурации соединения JDBC.

Я попытался использовать набор данных CSV для заполнения элемента конфигурации базы данных, но кажется, что конфигурация базы данных обрабатывается перед элементом набора данных CSV, поскольку это никогда не работало для меня.

Есть два способа, которые, как я знаю, будут работать для передачи переменных в конфигурацию базы данных.

  1. Простейший метод - это элемент конфигурации, определяемый пользователем (расположенный перед конфигурацией базы данных во всех моих тестах).
  2. Другой способ - передать свойства JMeter при запуске, что можно сделать несколькими способами, затем получить доступ к переменной как ${__P(box_user,)} (или как props.get("box_user"); изнутри beanshell).Чтобы передать свойство при запуске, вы можете добавить его в командной строке с помощью -Jbox_user=one. В качестве альтернативы вы можете добавить его в user.properties (или jmeter.properties, но не делайте этого) в каталоге bin вашей установки jmeter, с новой строкой box_user=one. В качестве альтернативы вы можете указать дополнительный файл свойств в командной строке с номером --addprop pathToFile, где указанный файл будет считаться с тем же форматом, что и jmeter.properties и user.properties.