<!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: Elements of a Test Plan</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="build-test-plan.html">&lt; Prev</a>
</li>
<li>
<a href="../index.html">Index</a>
</li>
<li>
<a href="build-web-test-plan.html">Next &gt;</a>
</li>
</ul>
<div class="section">
<h1>3. Elements of a Test Plan</h1>

<p>
This section describes the different parts of a test plan.
</p>

<p>
A minimal test will consist of the Test Plan, a Thread Group and one or more Samplers.
</p>


<div class="subsection">
<h2 id="test_plan">3.0 Test Plan<a class="sectionlink" href="#test_plan" title="Link to here">&para;</a>
</h2>

<p>The Test Plan object has a checkbox called "<span class="code">Functional Testing</span>".  If selected, it
will cause JMeter to record the data returned from the server for each sample.  If you have
selected a file in your test listeners, this data will be written to file.  This can be useful if
you are doing a small run to ensure that JMeter is configured correctly, and that your server
is returning the expected results.  The consequence is that the file will grow huge quickly, and
JMeter's performance will suffer.  This option should be off if you are doing stress-testing (it
is off by default).  </p>

<p>If you are not recording the data to file, this option makes no difference.</p>

<p>You can also use the <span class="code">Configuration</span> button on a listener to decide what fields to save.</p>

</div>


<div class="subsection">
<h2 id="thread_group">3.1 Thread Group<a class="sectionlink" href="#thread_group" title="Link to here">&para;</a>
</h2>

<p>Thread group elements are the beginning points of any test plan.
All controllers and samplers must be under a thread group.
Other elements, e.g. Listeners, may be placed directly under the test plan,
in which case they will apply to all the thread groups.
As the name implies, the thread group
element controls the number of threads JMeter will use to execute your test.  The
controls for a thread group allow you to:
<ul>
<li>Set the number of threads</li>

<li>Set the ramp-up period</li>

<li>Set the number of times to execute the test</li>

</ul>
</p>


<p>Each thread will execute the test plan in its entirety and completely independently
of other test threads.  Multiple threads are used to simulate concurrent connections
to your server application.</p>


<p>The ramp-up period tells JMeter how long to take to "ramp-up" to the full number of
threads chosen.  If 10 threads are used, and the ramp-up period is 100 seconds, then
JMeter will take 100 seconds to get all 10 threads up and running.  Each thread will
start 10 (100/10) seconds after the previous thread was begun.  If there are 30 threads
and a ramp-up period of 120 seconds, then each successive thread will be delayed by 4 seconds.</p>


<p>Ramp-up needs to be long enough to avoid too large a work-load at the start
of a test, and short enough that the last threads start running before
the first ones finish (unless one wants that to happen).
</p>

<p>
Start with Ramp-up = number of threads and adjust up or down as needed.
</p>


<p>By default, the thread group is configured to loop once through its elements.</p>


<p>Thread Group also allows to specify <b>Thread lifetime</b>.
    Click the checkbox at the bottom of the Thread Group panel to enable/disable extra fields
     in which you can enter the duration of test and the startup delay
     You can configure <span class="code">Duration (seconds)</span> and <span class="code">Startup Delay (seconds)</span> to control
     the duration of each thread group and the after how much seconds it starts.
     When the test is started, JMeter will wait <span class="code">Startup Delay (seconds)</span> before starting the Threads
     of the Thread Group and run for the configured <span class="code">Duration (seconds)</span> time.
</p>

</div>


<div class="subsection">
<h2 id="controllers">3.2 Controllers<a class="sectionlink" href="#controllers" title="Link to here">&para;</a>
</h2>


<p>
JMeter has two types of Controllers: Samplers and Logical Controllers.
These drive the processing of a test.
</p>


<p>Samplers tell JMeter to send requests to a server. For
example, add an HTTP Request Sampler if you want JMeter
to send an HTTP request.  You can also customize a request by adding one
or more Configuration Elements to a Sampler.  For more
information, see
<a href="#samplers">Samplers</a>.</p>


<p>Logical Controllers let you customize the logic that JMeter uses to
decide when to send requests.  For example, you can add an Interleave
Logic Controller to alternate between two HTTP Request Samplers.
For more information, see <a href="#logic_controller">Logical Controllers</a>.</p>


</div>


<div class="subsection">
<h2 id="samplers">3.2.1 Samplers<a class="sectionlink" href="#samplers" title="Link to here">&para;</a>
</h2>


<p>
Samplers tell JMeter to send requests to a server and wait for a response.
They are processed in the order they appear in the tree.
Controllers can be used to modify the number of repetitions of a sampler.
</p>

<p>
JMeter samplers include:
<ul>
    
<li>FTP Request</li>
    
<li>HTTP Request (can be used for SOAP or REST Webservice also)</li>
    
<li>JDBC Request</li>
    
<li>Java object request</li>
    
<li>JMS request</li>
    
<li>JUnit Test request</li>
    
<li>LDAP Request</li>
    
<li>Mail request</li>
    
<li>OS Process request</li>
    
<li>TCP request</li>

</ul>
Each sampler has several properties you can set.
You can further customize a sampler by adding one or more Configuration Elements to the Test Plan.
</p>


<p>If you are going to send multiple requests of the same type (for example,
HTTP Request) to the same server, consider using a Defaults Configuration
Element. Each controller has one or more Defaults elements (see below). </p>


<p>Remember to add a Listener to your test plan to view and/or store the
results of your requests to disk.</p>


<p>If you are interested in having JMeter perform basic validation on
the response of your request, add an <a href="#assertions">Assertion</a> to
the sampler.  For example, in stress testing a web application, the server
may return a successful "HTTP Response" code, but the page may have errors on it or
may be missing sections. You could add assertions to check for certain HTML tags,
common error strings, and so on. JMeter lets you create these assertions using regular
expressions.</p>


<p>
<a href="component_reference.html#samplers">JMeter's built-in samplers</a>
</p>

</div>


<div class="subsection">
<h2 id="logic_controller">3.2.2 Logic Controllers<a class="sectionlink" href="#logic_controller" title="Link to here">&para;</a>
</h2>

<p>Logic Controllers let you customize the logic that JMeter uses to
decide when to send requests.
Logic Controllers can change the order of requests coming from their
child elements.  They can modify the requests themselves, cause JMeter to repeat
requests, etc.
</p>


<p>To understand the effect of Logic Controllers on a test plan, consider the
following test tree:</p>


<p>

<ul>

<li>Test Plan</li>
    
<ul>
    
<li>Thread Group</li>
        
<ul>
        
<li>Once Only Controller</li>
            
<ul>
            
<li>Login Request (an <a href="../usermanual/component_reference.html#HTTP_Request">HTTP Request</a>)</li>
            
</ul>
        
<li>Load Search Page (HTTP Sampler)</li>
        
<li>Interleave Controller</li>
            
<ul>
            
<li>Search "A" (HTTP Sampler)</li>
            
<li>Search "B" (HTTP Sampler)</li>
            
<li>HTTP default request (Configuration Element)</li>
            
</ul>
        
<li>HTTP default request (Configuration Element)</li>
        
<li>Cookie Manager (Configuration Element)</li>
        
</ul>
    
</ul>

</ul>

</p>


<p>The first thing about this test is that the login request will be executed only
the first time through.  Subsequent iterations will skip it.  This is due to the
effects of the <a href="../usermanual/component_reference.html#Once_Only_Controller">Once Only Controller</a>.</p>


<p>After the login, the next Sampler loads the search page (imagine a
web application where the user logs in, and then goes to a search page to do a search).  This
is just a simple request, not filtered through any Logic Controller.</p>


<p>After loading the search page, we want to do a search.  Actually, we want to do
two different searches.  However, we want to re-load the search page itself between
each search.  We could do this by having 4 simple HTTP request elements (load search,
search "A", load search, search "B").  Instead, we use the <a href="../usermanual/component_reference.html#Interleave_Controller">Interleave Controller</a> which passes on one child request each time through the test.  It keeps the
ordering (i.e. it doesn't pass one on at random, but "remembers" its place) of its
child elements.  Interleaving 2 child requests may be overkill, but there could easily have
been 8, or 20 child requests.</p>


<p>Note the <a href="../usermanual/component_reference.html#HTTP_Request_Defaults">HTTP Request Defaults</a> that
belongs to the Interleave Controller.  Imagine that "Search A" and "Search B" share
the same PATH info (an HTTP request specification includes domain, port, method, protocol,
path, and arguments, plus other optional items).  This makes sense - both are search requests,
 hitting the same back-end search engine (a servlet or cgi-script, let's say).  Rather than
 configure both HTTP Samplers with the same information in their PATH field, we
 can abstract that information out to a single Configuration Element.  When the Interleave
 Controller "passes on" requests from "Search A" or "Search B", it will fill in the blanks with
 values from the HTTP default request Configuration Element.  So, we leave the PATH field
 blank for those requests, and put that information into the Configuration Element.  In this
case, this is a minor benefit at best, but it demonstrates the feature.</p>


<p>The next element in the tree is another HTTP default request, this time added to the
Thread Group itself.  The Thread Group has a built-in Logic Controller, and thus, it uses
this Configuration Element exactly as described above.  It fills in the blanks of any
Request that passes through.  It is extremely useful in web testing to leave the DOMAIN
field blank in all your HTTP Sampler elements, and instead, put that information
into an HTTP default request element, added to the Thread Group.  By doing so, you can
test your application on a different server simply by changing one field in your Test Plan.
Otherwise, you'd have to edit each and every Sampler.</p>


<p>The last element is a <a href="../usermanual/component_reference.html#HTTP_Cookie_Manager">HTTP Cookie Manager</a>.  A Cookie Manager should be added to all web tests - otherwise JMeter will
ignore cookies.  By adding it at the Thread Group level, we ensure that all HTTP requests
will share the same cookies.</p>


<p>Logic Controllers can be combined to achieve various results.  See the list of <a href="component_reference.html#logic_controllers">built-in
Logic Controllers</a>.</p>

</div>


<div class="subsection">
<h2 id="test_fragments">3.2.3 Test Fragments<a class="sectionlink" href="#test_fragments" title="Link to here">&para;</a>
</h2>

<p>The Test Fragment element is a special type of <a href="#controllers">controller</a> that
exists on the Test Plan tree at the same level as the Thread Group element.  It is distinguished
from a Thread Group in that it is not executed unless it is
referenced by either a <a href="../usermanual/component_reference.html#Module_Controller">Module Controller</a> or an <a href="../usermanual/component_reference.html#Include_Controller">Include_Controller</a>.
</p>

<p>This element is purely for code re-use within Test Plans</p>

</div>


<div class="subsection">
<h2 id="listeners">3.3 Listeners<a class="sectionlink" href="#listeners" title="Link to here">&para;</a>
</h2>

<p>Listeners provide access to the information JMeter gathers about the test cases while
JMeter runs.  The  <a href="../usermanual/component_reference.html#Graph_Results">Graph Results</a> listener plots the response times on a graph.
The "View Results Tree" Listener shows details of sampler requests and responses, and can display basic HTML and XML representations of the response.
Other listeners provide summary or aggregation information.
</p>


<p>
Additionally, listeners can direct the data to a file for later use.
Every listener in JMeter provides a field to indicate the file to store data to.
There is also a Configuration button which can be used to choose which fields to save, and whether to use CSV or XML format.
<div class="clear"></div>
<div class="note">Note that all Listeners save the same data; the only difference is in the way the data is presented on the screen.</div>
<div class="clear"></div>

</p>


<p>
Listeners can be added anywhere in the test, including directly under the test plan.
They will collect data only from elements at or below their level.
</p>


<p>There are several <a href="component_reference.html#listeners">listeners</a>
that come with JMeter.</p>

</div>


<div class="subsection">
<h2 id="timers">3.4 Timers<a class="sectionlink" href="#timers" title="Link to here">&para;</a>
</h2>


<p>By default, a JMeter thread executes samplers in sequence without pausing.
We recommend that you specify a delay by adding one of the available timers to
your Thread Group. If you do not add a delay, JMeter could overwhelm your server by
making too many requests in a very short amount of time.</p>


<p>A timer will cause JMeter to delay a certain amount of time <b>before</b> each
sampler which is in its <a href="#scoping_rules">scope</a>.</p>


<p>
If you choose to add more than one timer to a Thread Group, JMeter takes the sum of
the timers and pauses for that amount of time before executing the samplers to which the timers apply.
Timers can be added as children of samplers or controllers in order to restrict the samplers to which they are applied.
</p>

<p>
To provide a pause at a single place in a test plan, one can use the <a href="../usermanual/component_reference.html#Flow_Control_Action">Flow Control Action</a> Sampler.
</p>

</div>


<div class="subsection">
<h2 id="assertions">3.5 Assertions<a class="sectionlink" href="#assertions" title="Link to here">&para;</a>
</h2>


<p>Assertions allow you to assert facts about responses received from the
server being tested. Using an assertion, you can essentially "test" that your
application is returning the results you expect it to. </p>


<p>For instance, you can assert that the response to a query will contain some
particular text. The text you specify can be a Perl-style regular expression, and
you can indicate that the response is to contain the text, or that it should match
the whole response.</p>


<p>You can add an assertion to any Sampler. For example, you can
add an assertion to a HTTP Request that checks for the text, "<span class="code">&lt;/HTML&gt;</span>".  JMeter
will then check that the text is present in the HTTP response.  If JMeter cannot find the
text, then it will mark this as a failed request.</p>


<div class="clear"></div>
<div class="note">
Note that assertions apply to all samplers which are in their <a href="#scoping_rules">scope</a>.
To restrict an assertion to a single sampler, add the assertion as a child of the sampler.
</div>
<div class="clear"></div>


<p>To view assertion results, add an Assertion Listener to the Thread Group.
Failed Assertions will also show up in the Tree View and Table Listeners,
and will count towards the error %age for example in the Aggregate and Summary reports.
</p>

</div>


<div class="subsection">
<h2 id="config_elements">3.6 Configuration Elements<a class="sectionlink" href="#config_elements" title="Link to here">&para;</a>
</h2>

<p>A configuration element works closely with a Sampler.  Although it does not send requests
(except for <a href="../usermanual/component_reference.html#HTTP(S)_Test_Script_Recorder">HTTP(S) Test Script Recorder</a>), it can add to or modify requests.</p>


<p>A configuration element is accessible from only inside the tree branch where you place the element.
For example, if you place an HTTP Cookie Manager inside a Simple Logic Controller, the Cookie Manager will
only be accessible to HTTP Request Controllers you place inside the Simple Logic Controller (see figure 1).
The Cookie Manager is accessible to the HTTP requests "Web Page 1" and "Web Page 2", but not "Web Page 3".  </p>

<p>Also, a configuration element inside a tree branch has higher precedence than the same element in a "parent"
branch.  For example, we defined two HTTP Request Defaults elements, "Web Defaults 1" and "Web Defaults 2".
Since we placed "Web Defaults 1" inside a Loop Controller, only "Web Page 2" can access it.  The other HTTP
requests will use "Web Defaults 2", since we placed it in the Thread Group (the "parent" of all other branches).</p>


<figure>
<a href="../images/screenshots/http-config/http-config-example.png"><img src="../images/screenshots/http-config/http-config-example.png" width="" height="" alt="Figure 1 -
    Test Plan Showing Accessibility of Configuration Elements"></a>
<figcaption>Figure 1 -
    Test Plan Showing Accessibility of Configuration Elements</figcaption>
</figure>


<div class="clear"></div>
<div class="note">
The <a href="../usermanual/component_reference.html#User_Defined_Variables">User Defined Variables</a> Configuration element is different.
It is processed at the start of a test, no matter where it is placed.
For simplicity, it is suggested that the element is placed only at the start of a Thread Group.
</div>
<div class="clear"></div>

</div>


<div class="subsection">
<h2 id="preprocessors">3.7 Pre-Processor Elements<a class="sectionlink" href="#preprocessors" title="Link to here">&para;</a>
</h2>

<p>A Pre-Processor executes some action prior to a Sampler Request being made.
If a Pre-Processor is attached to a Sampler element, then it will execute just prior to that sampler element running.
A Pre-Processor is most often used to modify the settings of a Sample Request just before it runs, or to update variables that aren't extracted from response text.
See the <a href="test_plan.html#scoping_rules"><b>scoping rules</b></a> for more details on when Pre-Processors are executed.</p>

</div>


<div class="subsection">
<h2 id="postprocessors">3.8 Post-Processor Elements<a class="sectionlink" href="#postprocessors" title="Link to here">&para;</a>
</h2>

<p>A Post-Processor executes some action after a Sampler Request has been made.
If a Post-Processor is attached to a Sampler element, then it will execute just after that sampler element runs.
A Post-Processor is most often used to process the response data, often to extract values from it.
See the <a href="test_plan.html#scoping_rules"><b>scoping rules</b></a> for more details on when Post-Processors are executed.</p>

</div>


<div class="subsection">
<h2 id="executionorder">3.9 Execution order<a class="sectionlink" href="#executionorder" title="Link to here">&para;</a>
</h2>

<ol start="0">

<li>Configuration elements</li>

<li>Pre-Processors</li>

<li>Timers</li>

<li>Sampler</li>

<li>Post-Processors (unless SampleResult is <span class="code">null</span>)</li>

<li>Assertions (unless SampleResult is <span class="code">null</span>)</li>

<li>Listeners (unless SampleResult is <span class="code">null</span>)</li>

</ol>


<div class="clear"></div>
<div class="note">
Please note that Timers, Assertions, Pre- and Post-Processors are only processed if there is a sampler to which they apply.
Logic Controllers and Samplers are processed in the order in which they appear in the tree.
Other test elements are processed according to the scope in which they are found, and the type of test element.
[Within a type, elements are processed in the order in which they appear in the tree].
</div>
<div class="clear"></div>

<p>
For example, in the following test plan:
<ul>

<li>Controller</li>

<ul>

<li>Post-Processor 1</li>

<li>Sampler 1</li>

<li>Sampler 2</li>

<li>Timer 1</li>

<li>Assertion 1</li>

<li>Pre-Processor 1</li>

<li>Timer 2</li>

<li>Post-Processor 2</li>

</ul>

</ul>
The order of execution would be:
<pre>
Pre-Processor 1
Timer 1
Timer 2
Sampler 1
Post-Processor 1
Post-Processor 2
Assertion 1

Pre-Processor 1
Timer 1
Timer 2
Sampler 2
Post-Processor 1
Post-Processor 2
Assertion 1
</pre>

</p>

</div>


<div class="subsection">
<h2 id="scoping_rules">3.10 Scoping Rules<a class="sectionlink" href="#scoping_rules" title="Link to here">&para;</a>
</h2>

<p>
The JMeter test tree contains elements that are both hierarchical and ordered.  Some elements in the test trees are strictly hierarchical (Listeners, Config Elements, Post-Processors, Pre-Processors, Assertions, Timers), and some are primarily ordered (controllers, samplers).  When you create your test plan, you will create an ordered list of sample request (via Samplers) that represent a set of steps to be executed.  These requests are often organized within controllers that are also ordered.  Given the following test tree:</p>

<figure>
<a href="../images/screenshots/scoping1.png"><img src="../images/screenshots/scoping1.png" width="" height="" alt="Example test tree"></a>
<figcaption>Example test tree</figcaption>
</figure>

<p>The order of requests will be, One, Two, Three, Four.</p>

<p>Some controllers affect the order of their subelements, and you can read about these specific controllers in <a href="component_reference.html">the component reference</a>.</p>

<p>Other elements are hierarchical.  An Assertion, for instance, is hierarchical in the test tree.
If its parent is a request, then it is applied to that request. If its
parent is a Controller, then it affects all requests that are descendants of
that Controller.  In the following test tree:</p>

<figure>
<a href="../images/screenshots/scoping2.png"><img src="../images/screenshots/scoping2.png" width="" height="" alt="Hierarchy example"></a>
<figcaption>Hierarchy example</figcaption>
</figure>

<p>Assertion #1 is applied only to Request One, while Assertion #2 is applied to Requests Two and Three.</p>

<p>Another example, this time using Timers:</p>

<figure>
<a href="../images/screenshots/scoping3.png"><img src="../images/screenshots/scoping3.png" width="" height="" alt="complex example"></a>
<figcaption>complex example</figcaption>
</figure>

<p>In this example, the requests are named to reflect the order in which they will be executed.  Timer #1 will apply to Requests Two, Three, and Four (notice how order is irrelevant for hierarchical elements).  Assertion #1 will apply only to Request Three.  Timer #2 will affect all the requests.</p>

<p>Hopefully these examples make it clear how configuration (hierarchical) elements are applied.  If you imagine each Request being passed up the tree branches, to its parent, then to its parent's parent, etc., and each time collecting all the configuration elements of that parent, then you will see how it works.  </p>

<div class="clear"></div>
<div class="note">
The Configuration elements Header Manager, Cookie Manager and Authorization manager are
treated differently from the Configuration Default elements.
The settings from the Configuration Default elements are merged into a set of values that the Sampler has access to.
However, the settings from the Managers are not merged.
If more than one Manager is in the scope of a Sampler,
only one Manager is used, but there is currently no way to specify <em>which</em> is used.
</div>
<div class="clear"></div>

</div>



<div class="subsection">
<h2 id="properties">3.11 Properties and Variables<a class="sectionlink" href="#properties" title="Link to here">&para;</a>
</h2>


<p>
JMeter <em>properties</em> are defined in <span class="code">jmeter.properties</span> (see <a href="get-started.html#configuring_jmeter">Getting Started - Configuring JMeter</a> for more details).
<br>
Properties are global to jmeter, and are mostly used to define some of the defaults JMeter uses.
For example the property <span class="code">remote_hosts</span> defines the servers that JMeter will try to run remotely.
Properties can be referenced in test plans
- see <a href="functions.html#__property">Functions - read a property</a> -
but cannot be used for thread-specific values.
</p>

<p>
JMeter <em>variables</em> are local to each thread. The values may be the same for each thread, or they may be different.
<br>
If a variable is updated by a thread, only the thread copy of the variable is changed.
For example the <a href="../usermanual/component_reference.html#Regular_Expression_Extractor">Regular Expression Extractor</a> Post-Processor
will set its variables according to the sample that its thread has read, and these can be used later
by the same thread.
For details of how to reference variables and functions, see <a href="functions.html">Functions and Variables</a>

</p>

<p>
Note that the values defined by the <a href="../usermanual/component_reference.html#Test_Plan">Test Plan</a>  and the <a href="../usermanual/component_reference.html#User_Defined_Variables">User Defined Variables</a> configuration element
are made available to the whole test plan at startup.
If the same variable is defined by multiple UDV elements, then the last one takes effect.
Once a thread has started, the initial set of variables is copied to each thread.
Other elements such as the
<a href="../usermanual/component_reference.html#User_Parameters">User Parameters</a> Pre-Processor or <a href="../usermanual/component_reference.html#Regular_Expression_Extractor">Regular Expression Extractor</a> Post-Processor
may be used to redefine the same variables (or create new ones). These redefinitions only apply to the current thread.
</p>

<p>
The <a href="functions.html#__setProperty">setProperty</a> function can be used to define a JMeter property.
These are global to the test plan, so can be used to pass information between threads - should that be needed.
</p>

<div class="clear"></div>
<div class="note">Both variables and properties are case-sensitive.</div>
<div class="clear"></div>

</div>


<div class="subsection">
<h2 id="using_variables">3.12 Using Variables to parameterise tests<a class="sectionlink" href="#using_variables" title="Link to here">&para;</a>
</h2>

<p>
Variables don't have to vary - they can be defined once, and if left alone, will not change value.
So you can use them as short-hand for expressions that appear frequently in a test plan.
Or for items which are constant during a run, but which may vary between runs.
For example, the name of a host, or the number of threads in a thread group.
</p>

<p>
When deciding how to structure a Test Plan,
make a note of which items are constant for the run, but which may change between runs.
Decide on some variable names for these -
perhaps use a naming convention such as prefixing them with <span class="code">C_</span> or <span class="code">K_</span> or using uppercase only
to distinguish them from variables that need to change during the test.
Also consider which items need to be local to a thread -
for example counters or values extracted with the Regular Expression Post-Processor.
You may wish to use a different naming convention for these.
</p>

<p>
For example, you might define the following on the Test Plan:
<pre>
HOST             www.example.com
THREADS          10
LOOPS            20
</pre>
You can refer to these in the test plan as <span class="code">${HOST}</span> <span class="code">${THREADS}</span> etc.
If you later want to change the host, just change the value of the <span class="code">HOST</span> variable.
This works fine for small numbers of tests, but becomes tedious when testing lots of different combinations.
One solution is to use a property to define the value of the variables, for example:
<pre>
HOST             ${__P(host,www.example.com)}
THREADS          ${__P(threads,10)}
LOOPS            ${__P(loops,20)}
</pre>
You can then change some or all of the values on the command-line as follows:
<pre>
jmeter &hellip; -Jhost=www3.example.org -Jloops=13
</pre>

</p>

</div>


</div>
<ul class="pagelinks">
<li>
<a href="build-test-plan.html">&lt; Prev</a>
</li>
<li>
<a href="../index.html">Index</a>
</li>
<li>
<a href="build-web-test-plan.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;
            2021
            , 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>
