Author: pmouawad Date: Sat Sep 8 16:27:24 2018 New Revision: 1840368 URL: http://svn.apache.org/viewvc?rev=1840368&view=rev Log: Bug 61834 - Function Helper Dialog : Improve tests by showing variables and keeping them available between evaluations Bugzilla Id: 61834
Modified: jmeter/trunk/src/core/org/apache/jmeter/functions/gui/FunctionHelper.java jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties jmeter/trunk/xdocs/changes.xml Modified: jmeter/trunk/src/core/org/apache/jmeter/functions/gui/FunctionHelper.java URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/functions/gui/FunctionHelper.java?rev=1840368&r1=1840367&r2=1840368&view=diff ============================================================================== --- jmeter/trunk/src/core/org/apache/jmeter/functions/gui/FunctionHelper.java (original) +++ jmeter/trunk/src/core/org/apache/jmeter/functions/gui/FunctionHelper.java Sat Sep 8 16:27:24 2018 @@ -53,6 +53,11 @@ import org.apache.jmeter.gui.util.JSynta import org.apache.jmeter.gui.util.JTextScrollPane; import org.apache.jmeter.gui.util.VerticalPanel; import org.apache.jmeter.testelement.property.PropertyIterator; +import org.apache.jmeter.threads.JMeterContext; +import org.apache.jmeter.threads.JMeterContextService; +import org.apache.jmeter.threads.JMeterThread; +import org.apache.jmeter.threads.JMeterVariables; +import org.apache.jmeter.threads.ThreadGroup; import org.apache.jmeter.util.JMeterUtils; import org.apache.jmeter.util.LocaleChangeEvent; import org.apache.jmeter.util.LocaleChangeListener; @@ -68,6 +73,10 @@ public class FunctionHelper extends JDia private static final Logger log = LoggerFactory.getLogger(ClientJMeterEngine.class); + private static final String GENERATE = "GENERATE"; + + private static final String RESET_VARS = "RESET_VARS"; + private JLabeledChoice functionList; private ArgumentsPanel parameterPanel; @@ -75,6 +84,10 @@ public class FunctionHelper extends JDia private JLabeledTextField cutPasteFunction; private JSyntaxTextArea resultTextArea; + + private JSyntaxTextArea variablesTextArea; + + private JMeterVariables jMeterVariables = new JMeterVariables(); public FunctionHelper() { super((JFrame) null, JMeterUtils.getResString("function_helper_title"), false); //$NON-NLS-1$ @@ -117,18 +130,31 @@ public class FunctionHelper extends JDia JPanel resultsPanel = new VerticalPanel(); JPanel generatePanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); JPanel displayPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + JPanel variablesPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); cutPasteFunction = new JLabeledTextField(JMeterUtils.getResString("cut_paste_function"), 35, null, false); //$NON-NLS-1$ generatePanel.add(cutPasteFunction); JButton generateButton = new JButton(JMeterUtils.getResString("generate")); //$NON-NLS-1$ + generateButton.setActionCommand(GENERATE); generateButton.addActionListener(this); generatePanel.add(generateButton); + + JButton resetVarsButton = new JButton(JMeterUtils.getResString("function_helper_reset_vars")); //$NON-NLS-1$ + resetVarsButton.setActionCommand(RESET_VARS); + resetVarsButton.addActionListener(this); + generatePanel.add(resetVarsButton); + resultTextArea = JSyntaxTextArea.getInstance(5,60); resultTextArea.setToolTipText(JMeterUtils.getResString("function_helper_dialog_result_warn")); displayPanel.add(new JLabel(JMeterUtils.getResString("result_function"))); displayPanel.add(JTextScrollPane.getInstance(resultTextArea)); + + variablesTextArea = JSyntaxTextArea.getInstance(10,60); + variablesPanel.add(new JLabel(JMeterUtils.getResString("function_helper_dialog_variables"))); + variablesPanel.add(JTextScrollPane.getInstance(variablesTextArea)); resultsPanel.add(generatePanel); resultsPanel.add(displayPanel); + resultsPanel.add(variablesPanel); this.getContentPane().add(resultsPanel, BorderLayout.SOUTH); this.pack(); @@ -175,22 +201,44 @@ public class FunctionHelper extends JDia @Override public void actionPerformed(ActionEvent e) { - String functionName = functionList.getText(); - Arguments args = (Arguments) parameterPanel.createTestElement(); - String functionCall = buildFunctionCallString(functionName, args); - cutPasteFunction.setText(functionCall); - GuiUtils.copyTextToClipboard(cutPasteFunction.getText()); - CompoundVariable function = new CompoundVariable(functionCall); - try { - resultTextArea.setText(function.execute().trim()); - } catch(Exception ex) { - log.error("Error calling function {}", functionCall, ex); - resultTextArea.setText(ex.getMessage() + ", \nstacktrace:\n "+ - ExceptionUtils.getStackTrace(ex)); - resultTextArea.setCaretPosition(0); + String actionCommand = e.getActionCommand(); + if(GENERATE.equals(actionCommand)) { + String functionName = functionList.getText(); + Arguments args = (Arguments) parameterPanel.createTestElement(); + String functionCall = buildFunctionCallString(functionName, args); + cutPasteFunction.setText(functionCall); + GuiUtils.copyTextToClipboard(cutPasteFunction.getText()); + CompoundVariable function = new CompoundVariable(functionCall); + JMeterContext threadContext = JMeterContextService.getContext(); + threadContext.setVariables(jMeterVariables); + threadContext.setThreadNum(1); + threadContext.getVariables().put(JMeterThread.LAST_SAMPLE_OK, "true"); + ThreadGroup threadGroup = new ThreadGroup(); + threadGroup.setName("FunctionHelper-Dialog-ThreadGroup"); + threadContext.setThreadGroup(threadGroup); + + try { + resultTextArea.setText(function.execute().trim()); + } catch(Exception ex) { + log.error("Error calling function {}", functionCall, ex); + resultTextArea.setText(ex.getMessage() + ", \nstacktrace:\n "+ + ExceptionUtils.getStackTrace(ex)); + resultTextArea.setCaretPosition(0); + } + + variablesTextArea.setText(variablesToString(jMeterVariables)); + } else { + jMeterVariables = new JMeterVariables(); + variablesTextArea.setText(variablesToString(jMeterVariables)); } } + private String variablesToString(JMeterVariables jMeterVariables) { + StringBuilder sb = new StringBuilder(); + jMeterVariables.entrySet().forEach(e->sb.append(e.getKey()).append("=").append(e.getValue()).append("\r\n")); + return sb.toString(); + } + private String buildFunctionCallString(String functionName, Arguments args) { StringBuilder functionCall = new StringBuilder("${"); functionCall.append(functionName); Modified: jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties?rev=1840368&r1=1840367&r2=1840368&view=diff ============================================================================== --- jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties (original) +++ jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties Sat Sep 8 16:27:24 2018 @@ -374,6 +374,8 @@ ftp_save_response_data=Save File in Resp ftp_testing_title=FTP Request function_dialog_menu_item=Function Helper Dialog function_helper_dialog_result_warn=If function uses variables or a running context, results will not reflect reality +function_helper_dialog_variables=Current JMeter Variables +function_helper_reset_vars=Reset Variables function_helper_title=Function Helper function_name_param=Name of variable in which to store the result (required) function_name_paropt=Name of variable in which to store the result (optional) Modified: jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties?rev=1840368&r1=1840367&r2=1840368&view=diff ============================================================================== --- jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties (original) +++ jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties Sat Sep 8 16:27:24 2018 @@ -369,6 +369,8 @@ ftp_testing_title=Requ\u00EAte FTP function_dialog_menu_item=Assistant de fonctions function_helper_dialog_result_warn=Si la fonction utilise des variables ou le contexte d'ex\u00E9cution, le r\u00E9sultat affich\u00E9 ne refl\u00E8te pas la r\u00E9alit\u00E9 function_helper_title=Assistant de fonctions +function_helper_dialog_variables=Variables JMeter actuelles +function_helper_reset_vars=R\u00E9initialiser Variables function_name_param=Nom de la fonction. Utilis\u00E9 pour stocker les valeurs \u00E0 utiliser ailleurs dans la plan de test function_name_paropt=Nom de variable dans laquelle le r\u00E9sultat sera stock\u00E9 (optionnel) function_params=Param\u00E8tres de fonction (Remplissez les valeurs ci-dessous et cliquez sur G\u00E9n\u00E9rer) Modified: jmeter/trunk/xdocs/changes.xml URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1840368&r1=1840367&r2=1840368&view=diff ============================================================================== --- jmeter/trunk/xdocs/changes.xml [utf-8] (original) +++ jmeter/trunk/xdocs/changes.xml [utf-8] Sat Sep 8 16:27:24 2018 @@ -131,6 +131,7 @@ this behaviour, set <code>httpclient.res <li><bug>62178</bug>Add function <code>__threadGroupName</code> function to obtain ThreadGroup name. Mainly contributed by orimarko at gmail.com</li> <li><bug>62533</bug>Allow use epoch time as Date String value in function <code>__dateTimeConvert</code> </li> <li><bug>62541</bug>Allow <code>__jexl3</code>,<code>__jexl2</code> functions to support new syntax as <code>var x;</code>. Contributed by orimarko at gmail.com</li> + <li><bug>61834</bug>Function Helper Dialog : Improve tests by showing variables and keeping them available between evaluations</li> </ul> <h3>I18N</h3> <ul>