<!DOCTYPE html SYSTEM "about:legacy-compat">
<html lang="en">
    <head>
        <META http-equiv="Content-Type" content="text/html; charset=iso-8859-15">
        <title>Apache JMeter
          -
          User's Manual: Best Practices</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link href="https://fonts.googleapis.com/css?family=Merriweather:400normal" rel="stylesheet" type="text/css">
        <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.1/css/font-awesome.min.css" rel="stylesheet" type="text/css">
        <link rel="stylesheet" type="text/css" href="../css/new-style.css">
        <link rel="apple-touch-icon-precomposed" href="../images/apple-touch-icon.png">
        <link rel="icon" href="../images/favicon.png">
        <meta name="msapplication-TileColor" content="#ffffff">
        <meta name="msapplication-TileImage" content="../images/mstile-144x144.png">
        <meta name="theme-color" content="#ffffff">
    </head>
    <body role="document">
        <a href="#content" class="hidden">Main content</a>
        <div class="header">
            <!--
            APACHE LOGO
          -->
            <div>
                <a href="https://www.apache.org"><img title="Apache Software Foundation" class="asf-logo logo" src="../images/asf-logo.svg" alt="Logo ASF"></a>
            </div>
            <!--
              PROJECT LOGO
            -->
            <div>
                <a href="https://jmeter.apache.org/"><img class="logo" src="../images/logo.svg" alt="Apache JMeter"></a>
            </div>
            <div class="banner">
                <a href="https://www.apache.org/events/current-event.html"><img src="https://www.apache.org/events/current-event-234x60.png" alt="Current Apache event teaser"></a>
                <div class="clear"></div>
            </div>
        </div>
        <div class="nav">
            <ul class="menu">
                <li onClick="return true">
                    <div class="menu-title">About</div>
                    <ul>
                        <li>
                            <a href="../index.html">Overview</a>
                        </li>
                        <li>
                            <a href="https://www.apache.org/licenses/">License</a>
                        </li>
                    </ul>
                </li>
            </ul>
            <ul class="menu">
                <li onClick="return true">
                    <div class="menu-title">Download</div>
                    <ul>
                        <li>
                            <a href="../download_jmeter.cgi">Download Releases</a>
                        </li>
                        <li>
                            <a href="../changes.html">Release Notes</a>
                        </li>
                    </ul>
                </li>
            </ul>
            <ul class="menu">
                <li onClick="return true">
                    <div class="menu-title">Documentation</div>
                    <ul>
                        <li>
                            <a href="../usermanual/get-started.html">Get Started</a>
                        </li>
                        <li>
                            <a href="../usermanual/index.html">User Manual</a>
                        </li>
                        <li>
                            <a href="../usermanual/best-practices.html">Best Practices</a>
                        </li>
                        <li>
                            <a href="../usermanual/component_reference.html">Component Reference</a>
                        </li>
                        <li>
                            <a href="../usermanual/functions.html">Functions Reference</a>
                        </li>
                        <li>
                            <a href="../usermanual/properties_reference.html">Properties Reference</a>
                        </li>
                        <li>
                            <a href="../changes_history.html">Change History</a>
                        </li>
                        <li>
                            <a href="../api/index.html">Javadocs</a>
                        </li>
                        <li>
                            <a href="https://cwiki.apache.org/confluence/display/JMETER/Home">JMeter Wiki</a>
                        </li>
                        <li>
                            <a href="https://cwiki.apache.org/confluence/display/JMETER/JMeterFAQ">FAQ (Wiki)</a>
                        </li>
                    </ul>
                </li>
            </ul>
            <ul class="menu">
                <li onClick="return true">
                    <div class="menu-title">Tutorials</div>
                    <ul>
                        <li>
                            <a href="../usermanual/jmeter_distributed_testing_step_by_step.html">Distributed Testing</a>
                        </li>
                        <li>
                            <a href="../usermanual/jmeter_proxy_step_by_step.html">Recording Tests</a>
                        </li>
                        <li>
                            <a href="../usermanual/junitsampler_tutorial.html">JUnit Sampler</a>
                        </li>
                        <li>
                            <a href="../usermanual/jmeter_accesslog_sampler_step_by_step.html">Access Log Sampler</a>
                        </li>
                        <li>
                            <a href="../usermanual/jmeter_tutorial.html">Extending JMeter</a>
                        </li>
                    </ul>
                </li>
            </ul>
            <ul class="menu">
                <li onClick="return true">
                    <div class="menu-title">Community</div>
                    <ul>
                        <li>
                            <a href="../issues.html">Issue Tracking</a>
                        </li>
                        <li>
                            <a href="https://www.apache.org/security/">Security</a>
                        </li>
                        <li>
                            <a href="../mail.html">Mailing Lists</a>
                        </li>
                        <li>
                            <a href="../svnindex.html">Source Repositories</a>
                        </li>
                        <li>
                            <a href="../building.html">Building and Contributing</a>
                        </li>
                        <li>
                            <a href="https://projects.apache.org/project.html?jmeter">Project info at Apache</a>
                        </li>
                        <li>
                            <a href="https://cwiki.apache.org/confluence/display/JMETER/JMeterCommitters">Contributors</a>
                        </li>
                    </ul>
                </li>
            </ul>
            <ul class="menu">
                <li onClick="return true">
                    <div class="menu-title">Foundation</div>
                    <ul>
                        <li>
                            <a href="https://www.apache.org/">The Apache Software Foundation (ASF)</a>
                        </li>
                        <li>
                            <a href="https://www.apache.org/foundation/getinvolved.html">Get Involved in the ASF</a>
                        </li>
                        <li>
                            <a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
                        </li>
                        <li>
                            <a href="https://www.apache.org/foundation/thanks.html">Thanks</a>
                        </li>
                    </ul>
                </li>
            </ul>
        </div>
        <div class="main" id="content">
            <div class="social-media">
                <ul class="social-media-links">
                    <li class="twitter">
                        <a href="https://twitter.com/ApacheJMeter" title="Follow us on Twitter"><i class="fa fa-twitter" aria-hidden="true"></i>Twitter</a>
                    </li>
                    <li class="github">
                        <a href="https://github.com/apache/jmeter" title="Fork us on github"><i class="fa fa-github" aria-hidden="true"></i>github</a>
                    </li>
                </ul>
            </div>
            <ul class="pagelinks">
                <li>
                    <a href="realtime-results.html">&lt; Prev</a>
                </li>
                <li>
                    <a href="../index.html">Index</a>
                </li>
                <li>
                    <a href="boss.html">Next &gt;</a>
                </li>
            </ul>
            <div class="section">
                <h1 id="best_practices">
                    16. Best Practices<a class="sectionlink" href="#best_practices" title="Link to here">&para;</a>
                </h1>
                
            </div>
            <div class="section">
                <h1 id="use_latest_version">
                    16.1 Always use latest version of JMeter<a class="sectionlink" href="#use_latest_version" title="Link to here">&para;</a>
                </h1>
                
                <p>
                    The performance of JMeter is being constantly improved, so users are highly encouraged to use the most up to date version. 
                    <br>
                    Ensure you always read <a href="../changes.html">changes list</a> to be aware of new improvements and components.
You should absolutely avoid using versions that are older than 3 versions before the last one.

                </p>
                
            </div>
            <div class="section">
                <h1 id="sizing_threads">
                    16.2 Use the correct Number of Threads<a class="sectionlink" href="#sizing_threads" title="Link to here">&para;</a>
                </h1>
                
                <p>Your hardware capabilities as well as the Test Plan design will both impact the number of threads you can effectively
run with JMeter.  The number will also depend on how fast your server is (a faster server
 makes JMeter work harder since it returns a response quicker).  As with any Load Testing tool, if you don't correctly size
 the number of threads, you will face the "Coordinated Omission" problem which can give you wrong or inaccurate results.
 If you need large-scale load testing, consider running multiple CLI JMeter instances on multiple machines
 using distributed mode (or not). When using distributed mode the result file is combined on the Controller node, if
 using multiple autonomous instances, the sample result files can be combined for subsequent analysis.
For testing how JMeter performs on a given platform, the JavaTest sampler can be used.
It does not require any network access so can give some idea as to the maximum throughput achievable.
</p>
                
                <p>
JMeter has an option to delay thread creation until the thread starts sampling, i.e. after any thread group delay and the ramp-up time for the thread itself.
This allows for a very large total number of threads, provided that not too many are active concurrently.
</p>
                
            </div>
            <div class="section">
                <h1 id="put_cookie_manager">
                    16.3 Where to Put the Cookie Manager<a class="sectionlink" href="#put_cookie_manager" title="Link to here">&para;</a>
                </h1>
                
                <p>
                    See <a href="build-web-test-plan.html#adding_cookie_support">Building a Web Test</a>
for information.
                </p>
                
            </div>
            <div class="section">
                <h1 id="put_auth_manager">
                    16.4 Where to Put the Authorization Manager<a class="sectionlink" href="#put_auth_manager" title="Link to here">&para;</a>
                </h1>
                
                <p>
                    See <a href="build-adv-web-test-plan.html#header_manager">Building an Advanced
Web Test</a> for information.
                </p>
                
            </div>
            <div class="section">
                <h1 id="proxy_server">
                    16.5 Using the HTTP(S) Test Script Recorder<a class="sectionlink" href="#proxy_server" title="Link to here">&para;</a>
                </h1>
                
                <p>
                    Refer to <a href="../usermanual/component_reference.html#HTTP(S)_Test_Script_Recorder">HTTP(S) Test Script Recorder</a> for details on setting up the
recorder. The most important thing to do is filter out all requests you aren't
interested in.  For instance, there's no point in recording image requests (JMeter can
be instructed to download all images on a page - see <a href="../usermanual/component_reference.html#HTTP_Request">HTTP Request</a>).
These will just clutter your test plan.  Most likely, there is an extension all your files
share, such as <span class="code">.jsp</span>, <span class="code">.asp</span>, <span class="code">.php</span>, <span class="code">.html</span> or the like.
These you should "<span class="code">include</span>" by entering "<span class="code">.*\.jsp</span>" as an "Include Pattern". 
                </p>
                
                <p>
                    Alternatively, you can exclude images by entering "<span class="code">.*\.gif</span>" as an "Exclude Pattern".
Depending on your application, this may or may not be a better way to go.  You may
also have to exclude stylesheets, javascript files, and other included files.  Test
out your settings to verify you are recording what you want, and then erase and start
fresh.
                </p>
                
                <p>The HTTP(S) Test Script Recorder expects to find a ThreadGroup element with a Recording Controller
under it where it will record HTTP Requests to.  This conveniently packages all your samples under one
controller, which can be given a name that describes the test case.</p>
                
                <p>Now, go through the steps of a Test Case.  If you have no pre-defined test cases, use
JMeter to record your actions to define your test cases.  Once you have finished a
definite series of steps, save the entire test case in an appropriately named file.  Then, wipe
clean and start a new test case.  By doing this, you can quickly record a large number of
test case "rough drafts".</p>
                
                <p>
                    One of the most useful features of the HTTP(S) Test Script Recorder is that you can abstract out
certain common elements from the recorded samples.  By defining some
<a href="functions.html">user-defined variables</a> at the Test Plan level or in
<a href="../usermanual/component_reference.html#User_Defined_Variables">User Defined Variables</a> elements, you can have JMeter automatically
replace values in you recorded samples.  For instance, if you are testing an app on
server "<span class="code">xxx.example.com</span>", then you can define a variable called "<span class="code">server</span>" with the value of
"<span class="code">xxx.example.com</span>", and anyplace that value is found in your recorded samples will be replaced
with "<span class="code">${server}</span>".


                    <div class="clear"></div>
                    <div class="note">Please note that matching is case-sensitive.</div>
                    <div class="clear"></div>
                    
                </p>
                
                <p>
                    If JMeter does not record any samples, check that the browser really is using the proxy.
If the browser works OK even if JMeter is not running, then the browser cannot be using the proxy.
Some browsers ignore proxy settings for <span class="code">localhost</span> or <span class="code">127.0.0.1</span>; try using the local hostname or IP instead.

                </p>
                
                <p>
                    The error "<span class="code">unknown_ca</span>" probably means that you are trying to record HTTPS, and the browser has not accepted the
JMeter Proxy server certificate.

                </p>
                
            </div>
            <div class="section">
                <h1 id="user_variables">
                    16.6 User variables<a class="sectionlink" href="#user_variables" title="Link to here">&para;</a>
                </h1>
                
                <p>
Some test plans need to use different values for different users/threads.
For example, you might want to test a sequence that requires a unique login for each user.
This is easy to achieve with the facilities provided by JMeter.
</p>
                
                <p>For example:</p>
                
                <ul>
                    
                    <li>Create a text file containing the user names and passwords, separated by commas.
Put this in the same directory as your test plan.
</li>
                    
                    <li>
                        Add a CSV DataSet configuration element to the test plan.
Name the variables <span class="code">USER</span> and <span class="code">PASS</span>.

                    </li>
                    
                    <li>
                        Replace the login name with <span class="code">${USER}</span> and the password with <span class="code">${PASS}</span> on the appropriate
samplers

                    </li>
                    
                </ul>
                
                <p>The CSV Data Set element will read a new line for each thread.
</p>
                
            </div>
            <div class="section">
                <h1 id="lean_mean">
                    16.7 Reducing resource requirements<a class="sectionlink" href="#lean_mean" title="Link to here">&para;</a>
                </h1>
                
                <p>
Some suggestions on reducing resource usage.
</p>
                
                <ul>
                    
                    <li>
                        Use CLI mode: <span class="code">jmeter -n -t test.jmx -l test.jtl</span>
                    </li>
                    
                    <li>
                        Use as few Listeners as possible; if using the <span class="code">-l</span> flag as above they can all be deleted or disabled.
                    </li>
                    
                    <li>Don't use "View Results Tree" or "View Results in Table" listeners during the load test, use them only during scripting phase to debug your scripts.</li>
                    
                    <li>Rather than using lots of similar samplers,
use the same sampler in a loop, and use variables (CSV Data Set) to vary the sample.
[The Include Controller does not help here, as it adds all the test elements in the file to the test plan.]
</li>
                    
                    <li>Don't use functional mode</li>
                    
                    <li>Use CSV output rather than XML</li>
                    
                    <li>Only save the data that you need</li>
                    
                    <li>Use as few Assertions as possible</li>
                    
                    <li>Use the most performing scripting language (see JSR223 section)</li>
                    
                </ul>
                
                <p>
If your test needs large amounts of data - particularly if it needs to be randomised - create the test data in a file
that can be read with CSV Dataset. This avoids wasting resources at run-time.
</p>
                
            </div>
            <div class="section">
                <h1 id="beanshell_server">
                    16.8 BeanShell server<a class="sectionlink" href="#beanshell_server" title="Link to here">&para;</a>
                </h1>
                
                <p>
The BeanShell interpreter has a very useful feature - it can act as a server,
which is accessible by telnet or http.
</p>
                
                <div class="clear"></div>
                <div class="note">
                    There is no security. Anyone who can connect to the port can issue any BeanShell commands.
These can provide unrestricted access to the JMeter application and the host.
<b>Do not enable the server unless the ports are protected against access, e.g. by a firewall.</b>

                </div>
                <div class="clear"></div>
                
                <p>
                    If you do wish to use the server, define the following in <span class="code">jmeter.properties</span>:

                </p>
                
                <pre class="source">
beanshell.server.port=9000
beanshell.server.file=../extras/startup.bsh
</pre>
                
                <p>
                    In the above example, the server will be started, and will listen on ports <span class="code">9000</span> and <span class="code">9001</span>.
Port <span class="code">9000</span> will be used for http access. Port <span class="code">9001</span> will be used for telnet access.
The <span class="code">startup.bsh</span> file will be processed by the server, and can be used to define various functions and set up variables.
The startup file defines methods for setting and printing JMeter and system properties.
This is what you should see in the JMeter console:

                </p>
                
                <pre class="source">
Startup script running
Startup script completed
Httpd started on port: 9000
Session started on port: 9001
</pre>
                
                <p>
                    There is a sample script (<span class="code">extras/remote.bsh</span>) you can use to test the server.
[Have a look at it to see how it works.]

                    <br>
                    When starting it in the JMeter <span class="code">bin</span> directory
(adjust paths as necessary if running from elsewhere)
the output should look like:

                    <pre class="source">
$ java -jar ../lib/bshclient.jar localhost 9000 ../extras/remote.bsh
Connecting to BSH server on localhost:9000
Reading responses from server &hellip;
BeanShell 2.0b5 - by Pat Niemeyer (pat@pat.net)
bsh % remote.bsh starting
user.home = C:\Documents and Settings\User
user.dir = D:\eclipseworkspaces\main\JMeter_trunk\bin
Setting property 'EXAMPLE' to '0'.
Setting property 'EXAMPLE' to '1'.
Setting property 'EXAMPLE' to '2'.
Setting property 'EXAMPLE' to '3'.
Setting property 'EXAMPLE' to '4'.
Setting property 'EXAMPLE' to '5'.
Setting property 'EXAMPLE' to '6'.
Setting property 'EXAMPLE' to '7'.
Setting property 'EXAMPLE' to '8'.
Setting property 'EXAMPLE' to '9'.
EXAMPLE = 9
remote.bsh ended
bsh % &hellip; disconnected from server.
</pre>
                    
                </p>
                
                <p>
                    As a practical example, assume you have a long-running JMeter test running in CLI mode,
and you want to vary the throughput at various times during the test.
The test-plan includes a Constant Throughput Timer which is defined in terms of a property,
e.g. <span class="code">${__P(throughput)}</span>.
The following BeanShell commands could be used to change the test:

                </p>
                
                <pre class="source">
printprop("throughput");
curr = Integer.decode(args[0]);  // Start value
inc  = Integer.decode(args[1]);  // Increment
end  = Integer.decode(args[2]);  // Final value
secs = Integer.decode(args[3]);  // Wait between changes
while(curr &lt;= end) {
  setprop("throughput",curr.toString()); // Needs to be a string here
  Thread.sleep(secs*1000);
  curr += inc;
}
printprop("throughput");
</pre>
                
                <p>
                    The script can be stored in a file (<span class="code">throughput.bsh</span>, say), and sent to the server using <span class="code">bshclient.jar</span>.
For example:

                </p>
                
                <pre class="source">
java -jar ../lib/bshclient.jar localhost 9000 throughput.bsh 70 5 100 60
</pre>
                
            </div>
            <div class="section">
                <h1 id="bsh_scripting">
                    16.9 BeanShell scripting<a class="sectionlink" href="#bsh_scripting" title="Link to here">&para;</a>
                </h1>
                
                <div class="clear"></div>
                <div class="note">
                    Since JMeter 3.1, we advise switching from BeanShell to JSR223 Test Elements (see JSR223 section below for more details), and switching from <span class="code"><a href="functions.html#__BeanShell">__Beanshell</a></span> function
to <a href="functions.html#__groovy">__groovy</a> function.
                </div>
                <div class="clear"></div>
                
                <div class="subsection">
                    <h2 id="bsh_overview">
                        16.9.1 Overview<a class="sectionlink" href="#bsh_overview" title="Link to here">&para;</a>
                    </h2>
                    
                    <p>
                        Each BeanShell test element has its own copy of the interpreter (for each thread).
If the test element is repeatedly called, e.g. within a loop, then the interpreter is retained
between invocations unless the "<span class="code">Reset bsh.Interpreter before each call</span>" option is selected.

                    </p>
                    
                    <p>
Some long-running tests may cause the interpreter to use lots of memory; if this is the case try using the reset option.
</p>
                    
                    <p>
                        You can test BeanShell scripts outside JMeter by using the command-line interpreter:

                        <pre class="source">
$ java -cp bsh-xxx.jar[;other jars as needed] bsh.Interpreter file.bsh [parameters]
</pre>
                        or

                        <pre class="source">
$ java -cp bsh-xxx.jar bsh.Interpreter
bsh% source("file.bsh");
bsh% exit(); // or use EOF key (e.g. ^Z or ^D)
</pre>
                        
                    </p>
                    
                </div>
                
                <div class="subsection">
                    <h2 id="bsh_variables">
                        16.9.2 Sharing Variables<a class="sectionlink" href="#bsh_variables" title="Link to here">&para;</a>
                    </h2>
                    
                    <p>
Variables can be defined in startup (initialisation) scripts.
These will be retained across invocations of the test element, unless the reset option is used.
</p>
                    
                    <p>
                        Scripts can also access JMeter variables using the <span class="code">get()</span> and <span class="code">put()</span> methods of the "<span class="code">vars</span>" variable,
for example:

                        <pre class="source">vars.get("HOST");
vars.put("MSG","Successful");</pre>
                        The <span class="code">get()</span> and <span class="code">put()</span> methods only support variables with String values,
but there are also <span class="code">getObject()</span> and <span class="code">putObject()</span> methods which can be used for arbitrary objects.
JMeter variables are local to a thread, but can be used by all test elements (not just Beanshell).

                    </p>
                    
                    <p>
                        If you need to share variables between threads, then JMeter properties can be used:

                        <pre class="source">
import org.apache.jmeter.util.JMeterUtils;
String value = JMeterUtils.getPropDefault("name","");
JMeterUtils.setProperty("name", "value");
</pre>
                        The sample <span class="code">.bshrc</span> files contain sample definitions of <span class="code">getprop()</span> and <span class="code">setprop()</span> methods.

                    </p>
                    
                    <p>
                        Another possible method of sharing variables is to use the "<span class="code">bsh.shared</span>" shared namespace.
For example:

                        <pre class="source">
if (bsh.shared.myObj == void){
    // not yet defined, so create it:
    myObj = new AnyObject();
}
bsh.shared.myObj.process();
</pre>
                        Rather than creating the object in the test element, it can be created in the startup file
defined by the JMeter property "<span class="code">beanshell.init.file</span>". This is only processed once.

                    </p>
                    
                </div>
                
            </div>
            <div class="section">
                <h1 id="developing_scripts">
                    16.10 Developing script functions in Groovy or Jexl3 etc.<a class="sectionlink" href="#developing_scripts" title="Link to here">&para;</a>
                </h1>
                
                <p>
                    It's quite hard to write and test scripts as functions.
However, JMeter has the JSR223 samplers which can be used instead with any language supporting it.
We advise using <a href="http://www.groovy-lang.org/">Apache Groovy</a> or any language that supports the <span class="code"><a href="https://docs.oracle.com/javase/8/docs/api/javax/script/Compilable.html">Compilable</a></span> interface of JSR223.

                </p>
                
                <p>
                    Create a simple Test Plan containing the JSR223 Sampler and Tree View Listener.
Code the script in the sampler script pane, and test it by running the test.
If there are any errors, these will show up in the Tree View and <span class="code">jmeter.log</span> file.
Also the result of running the script will show up as the response.

                </p>
                
                <p>
                    Once the script is working properly, it can be stored as a variable on the Test Plan.
The script variable can then be used to create the function call.
For example, suppose a Groovy script is stored in the variable <span class="code">RANDOM_NAME</span>.
The function call can then be coded as <span class="code">${__groovy(${RANDOM_NAME})}</span>.
There is no need to escape any commas in the script,
because the function call is parsed before the variable's value is interpolated.

                </p>
                
            </div>
            <div class="section">
                <h1 id="parameterising_tests">
                    16.11 Parameterising tests<a class="sectionlink" href="#parameterising_tests" title="Link to here">&para;</a>
                </h1>
                
                <p>
Often it is useful to be able to re-run the same test with different settings.
For example, changing the number of threads or loops, or changing a hostname.
</p>
                
                <p>
                    One way to do this is to define a set of variables on the Test Plan, and then use those variables in the test elements.
For example, one could define the variable <span class="code">LOOPS=10</span>, and refer to that in the Thread Group as <span class="code">${LOOPS}</span>.
To run the test with 20 loops, just change the value of the <span class="code">LOOPS</span> variable on the Test Plan.

                </p>
                
                <p>
                    This quickly becomes tedious if you want to run lots of tests in CLI mode.
One solution to this is to define the Test Plan variable in terms of a property,
for example <span class="code">LOOPS=${__P(loops,10)}</span>.
This uses the value of the property "<span class="code">loops</span>", defaulting to <span class="code">10</span> if the property is not found.
The "<span class="code">loops</span>" property can then be defined on the JMeter command-line:

                    <pre class="source">jmeter &hellip; -Jloops=12 &hellip;</pre>
                    If there are a lot of properties that need to be changed together,
then one way to achieve this is to use a set of property files.
The appropriate property file can be passed in to JMeter using the <span class="code">-q</span> command-line option.

                </p>
                
            </div>
            <div class="section">
                <h1 id="jsr223">
                    16.12 JSR223 Elements<a class="sectionlink" href="#jsr223" title="Link to here">&para;</a>
                </h1>
                
                <p>
                    For intensive load testing, the recommended scripting language is one whose ScriptingEngine implements the <span class="code"><a href="https://docs.oracle.com/javase/8/docs/api/javax/script/Compilable.html">Compilable</a></span> interface.
Groovy scripting engine implements <span class="code"><a href="https://docs.oracle.com/javase/8/docs/api/javax/script/Compilable.html">Compilable</a></span>. However neither Beanshell nor Javascript do so as of release date of JMeter 3.1, so it is
recommended to avoid them for intensive load testing.

                    <div class="clear"></div>
                    <div class="note">
                        Note: Beanshell implements the <span class="code"><a href="https://docs.oracle.com/javase/8/docs/api/javax/script/Compilable.html">Compilable</a></span> interface but it has not been coded - the method just throws an Exception.
JMeter has an explicit work-round for this bug.
                    </div>
                    <div class="clear"></div>
                    When using JSR 223 elements, it is advised to check <span class="code">Cache compiled script if available</span> property to ensure the script compilation is cached if underlying language supports it.
In this case, ensure the script does not use any variable using <span class="code">${varName}</span> as caching would take only first value of <span class="code">${varName}</span>. Instead use :

                    <pre class="source">
vars.get("varName")
</pre>
                    
                </p>
                
                <p>
You can also pass them as Parameters to the script and use them this way.
</p>
                
            </div>
            <div class="section">
                <h1 id="sharing_variables">
                    16.13 Sharing variables between threads and thread groups<a class="sectionlink" href="#sharing_variables" title="Link to here">&para;</a>
                </h1>
                
                <p>
                    Variables are local to a thread; a variable set in one thread cannot be read in another.
This is by design. For variables that can be determined before a test starts, see
<a href="#parameterising_tests">Parameterising Tests</a> (above).
If the value is not known until the test starts, there are various options:

                    <ul>
                        
                        <li>Store the variable as a property - properties are global to the JMeter instance</li>
                        
                        <li>Write variables to a file and re-read them.</li>
                        
                        <li>
                            Use the <span class="code">bsh.shared</span> namespace - see <a href="#bsh_variables">above</a>
                        </li>
                        
                        <li>Write your own Java classes</li>
                        
                    </ul>
                    
                </p>
                
            </div>
            <div class="section">
                <h1 id="properties">
                    16.14 Managing properties<a class="sectionlink" href="#properties" title="Link to here">&para;</a>
                </h1>
                
                <p>
                    When you need to modify jmeter properties, ensure you don't modify <span class="code">jmeter.properties</span> file,
<b>instead copy the property from <span class="code">jmeter.properties</span> and modify its value in <span class="code">user.properties</span> file</b>.
                    <br>
                    Doing so will ease you migration to the next version of JMeter. 
                    <br>
                    Note that in the documentation <span class="code">jmeter.properties</span> is frequently mentioned but this should be understood as
"Copy from <span class="code">jmeter.properties</span> to <span class="code">user.properties</span> the property you want to modify and do so in the latter file".
                </p>
                
                <div class="clear"></div>
                <div class="note">
                    <span class="code">user.properties</span> file supersedes the properties defined in <span class="code">jmeter.properties</span>
                </div>
                <div class="clear"></div>
                
            </div>
            <div class="section">
                <h1 id="deprecation">
                    16.15 Deprecated elements<a class="sectionlink" href="#deprecation" title="Link to here">&para;</a>
                </h1>
                
                <p>
                    It is advised not to use deprecated elements (marked as such in <a href="../changes.html">changes list</a> and in <a href="./component_reference.html">component reference</a>)
and to migrate to new advised elements if available or new way of doing the same thing. 
                    <br>
                    Deprecated elements are removed from the menu in version N but can be enabled for migration by modifying <span class="code">not_in_menu</span> property in <span class="code">user.properties</span> file and removing the full class name
of the element from there.
                    <br>
                </p>
                
                <div class="clear"></div>
                <div class="note">Please note that deprecated elements in version N will be removed definitely in version N+1, so ensure you stop using them as soon as possible.</div>
                <div class="clear"></div>
                
            </div>
            <ul class="pagelinks">
                <li>
                    <a href="realtime-results.html">&lt; Prev</a>
                </li>
                <li>
                    <a href="../index.html">Index</a>
                </li>
                <li>
                    <a href="boss.html">Next &gt;</a>
                </li>
            </ul>
            <div class="share-links">
                      Share this page:
      
                <ul>
                    <li class="fb">
                        <a data-social-url="https://facebook.com/sharer/sharer.php?u=" title="Share on facebook"><i class="fa fa-facebook" aria-hidden="true"></i>share</a>
                    </li>
                    <li class="twitter">
                        <a data-social-url="https://twitter.com/intent/tweet?url=" title="Tweet on twitter"><i class="fa fa-twitter" aria-hidden="true"></i>tweet</a>
                    </li>
                </ul>
            </div>
            <a href="#top" id="topButton">Go to top</a>
        </div>
        <div class="footer">
            <div class="copyright">
            Copyright &copy;
            1999 &ndash;
            2022
            , Apache Software Foundation
          </div>
            <div class="trademarks">Apache, Apache JMeter, JMeter, the Apache
            feather, and the Apache JMeter logo are
            trademarks of the
            Apache Software Foundation.
          </div>
        </div>
        <script>(function(){
            "use strict";
            // enable 'go to top' button functionality
            document.addEventListener('scroll', function() {
                if (document.body.scrollTop > 500 || document.documentElement.scrollTop > 500) {
                    document.getElementById("topButton").style.display = "block";
                } else {
                    document.getElementById("topButton").style.display = "none";
                }
            });
            // fill in the current location into social links on this page.
            var as = document.getElementsByTagName('a');
            var loc = document.location.href;
            if (!loc.toLowerCase().startsWith('http')) {
                return;
            }
            for (var i=0; i<as.length; i++) {
                var href = as[i].getAttribute('data-social-url');
                if (href !== null) {
                    as[i].href = href + encodeURIComponent(loc);
                }
            }
        })();</script>
    </body>
</html>
