<!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: Building a Web 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="test_plan.html">&lt; Prev</a>
</li>
<li>
<a href="../index.html">Index</a>
</li>
<li>
<a href="build-adv-web-test-plan.html">Next &gt;</a>
</li>
</ul>
<div class="section">
<h1 id="building">4. Building a Web Test Plan<a class="sectionlink" href="#building" title="Link to here">&para;</a>
</h1>

<p>In this section, you will learn how to create a basic
<a href="build-test-plan.html">Test Plan</a> to test a Web site.  You will
create five users that send requests to two pages on the JMeter Web site.
Also, you will tell the users to run their tests twice. So, the total number of
requests is (5 users) x (2 requests) x (repeat 2 times) = 20 HTTP requests. To
construct the Test Plan, you will use the following elements:
<a href="test_plan.html#thread_group">Thread Group</a>,
<a href="../usermanual/component_reference.html#HTTP_Request">HTTP Request</a>,
<a href="../usermanual/component_reference.html#HTTP_Request_Defaults">HTTP Request Defaults</a>, and
<a href="../usermanual/component_reference.html#Graph_Results">Graph Results</a>.</p>


<p>For a more advanced Test Plan, see
<a href="build-adv-web-test-plan.html">Building an Advanced Web Test Plan</a>.</p>

</div>
<div class="section">
<h1 id="adding_users">4.1 Adding Users<a class="sectionlink" href="#adding_users" title="Link to here">&para;</a>
</h1>

<p>The first step you want to do with every JMeter Test Plan is to add a
<a href="test_plan.html#thread_group">Thread Group</a> element.  The Thread Group tells
JMeter the number of users you want to simulate, how often the users should send
requests, and how many requests they should send.</p>


<p>Go ahead and add the ThreadGroup element by first selecting the Test Plan,
clicking your right mouse button to get the Add menu, and then select
Add &rarr; ThreadGroup.</p>


<p>You should now see the Thread Group element under Test Plan.  If you do not
see the element, then "expand" the Test Plan tree by clicking on the
Test Plan element.</p>


<p>Next, you need to modify the default properties.  Select the Thread Group element
in the tree, if you have not already selected it. You should now see the Thread
Group Control Panel in the right section of the JMeter window (see Figure 4.1
below)</p>


<figure>
<a href="../images/screenshots/webtest/threadgroup.png"><img src="../images/screenshots/webtest/threadgroup.png" width="" height="" alt="
Figure 4.1. Thread Group with Default Values"></a>
<figcaption>
Figure 4.1. Thread Group with Default Values</figcaption>
</figure>


<p>Start by providing a more descriptive name for our Thread Group. In the name
field, enter JMeter Users.</p>


<p>Next, increase the number of users (called threads) to 5.</p>


<p>In the next field, the Ramp-Up Period, leave the default value of 1
seconds.  This property tells JMeter how long to delay between starting each
user. For example, if you enter a Ramp-Up Period of 5 seconds, JMeter will
finish starting all of your users by the end of the 5 seconds.  So, if we have
5 users and a 5 second Ramp-Up Period, then the delay between starting users
would be 1 second (5 users / 5 seconds = 1 user per second).  If you set the
value to 0, then JMeter will immediately start all of your users.</p>


<p>Finally enter a value of 2 in
the Loop Count field.  This property tells JMeter how many times to repeat your
test. If you enter a loop count value of 1, then JMeter will run your test only
once. To have JMeter repeatedly run your Test Plan, select the Forever
checkbox.</p>


<div class="clear"></div>
<div class="note">In most applications, you have to manually accept
changes you make in a Control Panel.  However, in JMeter, the Control Panel
automatically accepts your changes as you make them.  If you change the
name of an element, the tree will be updated with the new text after you
leave the Control Panel (for example, when selecting another tree element).</div>
<div class="clear"></div>


<p>See Figure 4.2 for the completed JMeter Users Thread Group.</p>


<figure>
<a href="../images/screenshots/webtest/threadgroup2.png"><img src="../images/screenshots/webtest/threadgroup2.png" width="" height="" alt="
Figure 4.2. JMeter Users Thread Group"></a>
<figcaption>
Figure 4.2. JMeter Users Thread Group</figcaption>
</figure>


</div>
<div class="section">
<h1 id="adding_defaults">4.2 Adding Default HTTP Request Properties<a class="sectionlink" href="#adding_defaults" title="Link to here">&para;</a>
</h1>

<p>Now that we have defined our users, it is time to define the tasks that they
will be performing.  In this section, you will specify the default settings
for your HTTP requests.  And then, in section 4.3, you will add HTTP Request
elements which use some of the default settings you specified here.</p>


<p>Begin by selecting the JMeter Users (Thread Group) element. Click your right mouse button
to get the Add menu, and then select Add &rarr; Config Element &rarr; HTTP Request
Defaults. Then select this new element to view its Control Panel (see Figure 4.3).
</p>


<figure>
<a href="../images/screenshots/webtest/http-defaults1.png"><img src="../images/screenshots/webtest/http-defaults1.png" width="" height="" alt="
Figure 4.3. HTTP Request Defaults"></a>
<figcaption>
Figure 4.3. HTTP Request Defaults</figcaption>
</figure>


<p>
Like most JMeter elements, the <a href="../usermanual/component_reference.html#HTTP_Request_Defaults">HTTP Request Defaults</a> Control
Panel has a name field that you can modify.  In this example, leave this field with
the default value.</p>


<p>Skip to the next field, which is the Web Server's Server Name/IP. For the
Test Plan that you are building, all HTTP requests will be sent to the same
Web server, jmeter.apache.org.  Enter this domain name into the field.
This is the only field that we will specify a default, so leave the remaining
fields with their default values.</p>


<div class="clear"></div>
<div class="note">The HTTP Request Defaults element does not tell JMeter
to send an HTTP request.  It simply defines the default values that the
HTTP Request elements use.</div>
<div class="clear"></div>


<p>See Figure 4.4 for the completed HTTP Request Defaults element</p>


<figure>
<a href="../images/screenshots/webtest/http-defaults2.png"><img src="../images/screenshots/webtest/http-defaults2.png" width="" height="" alt="
Figure 4.4. HTTP Defaults for our Test Plan"></a>
<figcaption>
Figure 4.4. HTTP Defaults for our Test Plan</figcaption>
</figure>


</div>
<div class="section">
<h1 id="adding_cookie_support">4.3 Adding Cookie Support<a class="sectionlink" href="#adding_cookie_support" title="Link to here">&para;</a>
</h1>

<p>Nearly all web testing should use cookie support, unless your application
specifically doesn't use cookies.  To add cookie support, simply add an
<a href="../usermanual/component_reference.html#HTTP_Cookie_Manager">HTTP Cookie Manager</a> to each <a href="test_plan.html#thread_group">Thread
Group</a> in your test plan.  This will ensure that each thread gets its own
cookies, but shared across all <a href="../usermanual/component_reference.html#HTTP_Request">HTTP Request</a> objects.</p>


<figure>
<a href="../images/screenshots/webtest/http-cookie-manager.png"><img src="../images/screenshots/webtest/http-cookie-manager.png" width="" height="" alt="
Figure 4.5. HTTP Cookie Manager"></a>
<figcaption>
Figure 4.5. HTTP Cookie Manager</figcaption>
</figure>


<p>To add the <a href="../usermanual/component_reference.html#HTTP_Cookie_Manager">HTTP Cookie Manager</a>, simply select the
<a href="test_plan.html#thread_group">Thread Group</a>, and choose Add &rarr;
Config Element &rarr; HTTP
Cookie Manager, either from the Edit Menu, or from the right-click pop-up menu.</p>

</div>
<div class="section">
<h1 id="adding_requests">4.4 Adding HTTP Requests<a class="sectionlink" href="#adding_requests" title="Link to here">&para;</a>
</h1>


<p>In our Test Plan, we need to make two HTTP requests. The first one is for the
JMeter home page (http://jmeter.apache.org/), and the second one is for the
Changes page (http://jmeter.apache.org/changes.html).</p>


<div class="clear"></div>
<div class="note">JMeter sends requests in the order that they appear in the tree.</div>
<div class="clear"></div>


<p>Start by adding the first <a href="../usermanual/component_reference.html#HTTP_Request">HTTP Request</a>
to the JMeter Users element (Add &rarr; Sampler &rarr; HTTP Request).
Then, select the HTTP Request element in the tree and edit the following properties
(see Figure 4.6):
<ol>

<li>Change the Name field to "Home Page".</li>

<li>Set the Path field to "/".  Remember that you do not have to set the Server
Name field because you already specified this value in the HTTP Request Defaults
element.</li>

</ol>

</p>


<figure>
<a href="../images/screenshots/webtest/http-request1.png"><img src="../images/screenshots/webtest/http-request1.png" width="" height="" alt="
Figure 4.6. HTTP Request for JMeter Home Page"></a>
<figcaption>
Figure 4.6. HTTP Request for JMeter Home Page</figcaption>
</figure>


<p>Next, add the second HTTP Request and edit the following properties (see
Figure 4.7:
<ol>

<li>Change the Name field to "Changes".</li>

<li>Set the Path field to "/changes.html".</li>

</ol>

</p>


<figure>
<a href="../images/screenshots/webtest/http-request2.png"><img src="../images/screenshots/webtest/http-request2.png" width="" height="" alt="
Figure 4.7. HTTP Request for JMeter Changes Page"></a>
<figcaption>
Figure 4.7. HTTP Request for JMeter Changes Page</figcaption>
</figure>


</div>
<div class="section">
<h1 id="adding_listener">4.5 Adding a Listener to View Store the Test Results<a class="sectionlink" href="#adding_listener" title="Link to here">&para;</a>
</h1>

<p>The final element you need to add to your Test Plan is a
 <a href="component_reference.html#listeners">Listener</a>. This element is
responsible for storing all of the results of your HTTP requests in a file and presenting
a visual model of the data.</p>


<p>Select the JMeter Users element and add a <a href="../usermanual/component_reference.html#Graph_Results">Graph Results</a> listener (Add &rarr; Listener
&rarr; Backend Listener).</p>


</div>
<div class="section">
<h1 id="logging_in">4.6 Logging in to a web-site<a class="sectionlink" href="#logging_in" title="Link to here">&para;</a>
</h1>

<p>
It's not the case here, but some web-sites require you to login before permitting you to perform certain actions.
In a web-browser, the login will be shown as a form for the user name and password,
and a button to submit the form.
The button generates a POST request, passing the values of the form items as parameters.
</p>

<p>
To do this in JMeter, add an HTTP Request, and set the method to POST.
You'll need to know the names of the fields used by the form, and the target page.
These can be found out by inspecting the code of the login page.
[If this is difficult to do, you can use the <a href="component_reference.html#HTTP_Proxy_Server">JMeter Proxy Recorder</a> to record the login sequence.]
Set the path to the target of the submit button.
Click the Add button twice and enter the username and password details.
Sometimes the login form contains additional hidden fields.
These will need to be added as well.
</p>

<figure>
<a href="../images/screenshots/webtest/http_login.png"><img src="../images/screenshots/webtest/http_login.png" width="" height="" alt="
Figure 4.8. Sample HTTP login request"></a>
<figcaption>
Figure 4.8. Sample HTTP login request</figcaption>
</figure>


</div>
<div class="section">
<h1 id="choose_users">4.7 choose the same user or different users<a class="sectionlink" href="#choose_users" title="Link to here">&para;</a>
</h1>

<p>
When creating a Test Plan, on each Thread Group iteration, we can choose to simulate the same user running multiple iterations,
or different users running one iteration.
You can configure this behaviour on Thread Group element, and have HTTP Cache Manager, HTTP Cookie Manager, HTTP Authorization Manager
controlled by this setting.
</p>

<figure>
<a href="../images/screenshots/webtest/threadgroup3.png"><img src="../images/screenshots/webtest/threadgroup3.png" width="" height="" alt="
Figure 4.9. Choose the same user or different users"></a>
<figcaption>
Figure 4.9. Choose the same user or different users</figcaption>
</figure>

<p>
You can choose to clear the cookies/cache content/authorization in the CookieManager/CacheManager/Authorization Manager,
 or choose to be controlled by the Thread Group.
</p>

<figure>
<a href="../images/screenshots/webtest/threadgroup4.png"><img src="../images/screenshots/webtest/threadgroup4.png" width="" height="" alt="
Figure 4.10. Use Thread Group to control CookieManager"></a>
<figcaption>
Figure 4.10. Use Thread Group to control CookieManager</figcaption>
</figure>

<figure>
<a href="../images/screenshots/webtest/threadgroup5.png"><img src="../images/screenshots/webtest/threadgroup5.png" width="" height="" alt="
Figure 4.11. Use Thread Group to control CacheManager"></a>
<figcaption>
Figure 4.11. Use Thread Group to control CacheManager</figcaption>
</figure>

<figure>
<a href="../images/screenshots/webtest/threadgroup6.png"><img src="../images/screenshots/webtest/threadgroup6.png" width="" height="" alt="
Figure 4.12. Use Thread Group to control Authorization Manager"></a>
<figcaption>
Figure 4.12. Use Thread Group to control Authorization Manager</figcaption>
</figure>

</div>
<ul class="pagelinks">
<li>
<a href="test_plan.html">&lt; Prev</a>
</li>
<li>
<a href="../index.html">Index</a>
</li>
<li>
<a href="build-adv-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>
