<!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 provides a <b>scheduler</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, the startup delay, the start and end times of the run.
     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.
     Note those 2 options override the <span class="code">Start time</span> and <span class="code">End time</span>.

     <p>Alternatively (although not recommended as not very flexible) you can use the two other fields <span class="code">Start time</span> and <span class="code">End time</span>.
     When the test is started, JMeter will wait if necessary until the start-time has been reached.
     At the end of each cycle, JMeter checks if the end-time has been reached, and if so, the run is stopped,
     otherwise the test is allowed to continue until the iteration limit is reached.</p>
     
</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;
            2020
            , 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>
