<!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
          -
          Apache JMeter&trade;</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="./security.html">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://privacy.apache.org/policies/privacy-policy-public.html">Privacy Policy</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>
            <div class="section">
                <h1>Apache JMeter&trade;</h1>
                    
                <p>
                          The <b>Apache JMeter&trade;</b> application is open source software,
      a 100% pure Java application designed
      to load test functional behavior and measure performance.  It was
      originally designed for testing Web Applications but has
      since expanded to other test functions.
    
                </p>
                    
                <h2>What can I do with it?</h2>
                    
                <p>
                          Apache JMeter may be used to test performance both on static and dynamic
      resources, Web dynamic applications. 
                    <br>
                          It can be used to simulate a heavy load on a server, group of servers,
      network or object to test its strength or to analyze overall performance
      under different load types.
                    <br>
                        
                </p>
                
                <p>Apache JMeter features include:</p>
                
                <ul>
                        
                    <li>
                        Ability to load and performance test many different applications/server/protocol types:
        
                        <ul>
                                    
                            <li>Web - HTTP, HTTPS (Java, NodeJS, PHP, ASP.NET, &hellip;)</li>
                                    
                            <li>SOAP / REST Webservices</li>
                                    
                            <li>FTP</li>
                                    
                            <li>Database via JDBC</li>
                                    
                            <li>LDAP</li>
                                    
                            <li>Message-oriented middleware (MOM) via JMS</li>
                                    
                            <li>Mail - SMTP(S), POP3(S) and IMAP(S)</li>
                                    
                            <li>Native commands or shell scripts</li>
                                    
                            <li>TCP</li>
                                    
                            <li>Java Objects</li>
                                    
                        </ul>
                            
                    </li>
                        
                    <li>
                        Full featured Test IDE that allows fast Test Plan <b>recording (from Browsers or native applications), building and debugging</b>.
                    </li>
                        
                    <li>
                        <b><a href="usermanual/get-started.html#non_gui">CLI mode (Command-line mode (previously called Non GUI) / headless mode)</a></b> to load test from any Java compatible OS (Linux, Windows, Mac OSX, &hellip;)
                    </li>
                        
                    <li>
                        A complete and <b><a href="usermanual/generating-dashboard.html">ready to present dynamic HTML report</a></b>
                    </li>
                        
                    <li>
                        Easy correlation through ability to extract data from most popular response formats, <b><a href="usermanual/component_reference.html#CSS/JQuery_Extractor">HTML</a>, <a href="usermanual/component_reference.html#JSON_Extractor">JSON </a>,
        <a href="usermanual/component_reference.html#XPath_Extractor">XML</a> or <a href="usermanual/component_reference.html#Regular_Expression_Extractor">any textual format</a></b>
                    </li>
                        
                    <li>
                        Complete portability and <b>100% Java purity</b>.
                    </li>
                        
                    <li>
                        Full <b>multi-threading</b> framework allows concurrent sampling by many threads and
        simultaneous sampling of different functions by separate thread groups.
                    </li>
                        
                    <li>Caching and offline analysis/replaying of test results.</li>
                        
                    <li>
                        <b>Highly Extensible core:</b>
      
                        <ul>
                                    
                            <li>Pluggable Samplers allow unlimited testing capabilities.</li>
                                    
                            <li>
                                <b>Scriptable Samplers</b> (JSR223-compatible languages like <a href="http://groovy-lang.org">Groovy</a> and BeanShell)
                            </li>
                                    
                            <li>
                                Several load statistics may be chosen with <b>pluggable timers</b>.
                            </li>
                                    
                            <li>
                                Data analysis and <b>visualization plugins</b> allow great extensibility
        as well as personalization.
                            </li>
                                    
                            <li>Functions can be used to provide dynamic input to a test or provide data manipulation.</li>
                                    
                            <li>
                                Easy Continuous Integration through 3<sup>rd</sup> party Open Source libraries for Maven, Gradle and Jenkins.
                            </li>
                                  
                        </ul>
                            
                    </li>
                    
                </ul>
                
                <h2>How do I do it?</h2>
                
                <ul>
                    
                    <li>
                        <a href="usermanual/index.html">Using JMeter</a> to understand how to use it
                    </li>
                    
                    <li>
                        <a href="usermanual/component_reference.html">Component reference</a> to have detailed information for every Test element
                    </li>
                    
                    <li>
                        <a href="usermanual/functions.html">Functions reference</a> to have detailed information and examples for every function
                    </li>
                    
                    <li>
                        <a href="usermanual/properties_reference.html">Properties reference</a> for all properties that allow you to customize JMeter
                    </li>
                    
                    <li>
                        <a href="api/index.html">Javadoc API documentation</a>
                    </li>
                    
                    <li>
                        <a href="https://cwiki.apache.org/confluence/display/JMETER/JMeterFAQ">JMeter FAQ (Wiki)</a>
                    </li>
                    
                    <li>
                        <a href="https://cwiki.apache.org/confluence/display/JMETER/Home">JMeter Wiki</a>
                    </li>
                    
                    <li>
                        <a href="building.html">Building JMeter and Add-Ons</a> for advanced usage
                    </li>
                    
                </ul>
                
                <h2>JMeter is not a browser</h2>
                
                <p>
JMeter is not a browser, it works at protocol level.
As far as web-services and remote services are concerned, JMeter looks like a browser (or rather, multiple browsers);
however JMeter does not perform all the actions supported by browsers.
In particular, JMeter does not execute the Javascript found in HTML pages.
Nor does it render the HTML pages as a browser does
(it's possible to view the response as HTML etc., but the timings are not included in any samples, and only one sample in one thread is ever displayed at a time).
</p>
                
                <h2>Tutorials</h2>
                
                <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>
                
                <h2>Further Information About JMeter</h2>
                
                <ul>
                    
                    <li>
                        <a href="changes.html">Changes List</a>
                    </li>
                    
                    <li>
                        <a href="issues.html">Read about existing Issues (Bugs or Enhancements) or reporting new ones (please do it !)</a>
                    </li>
                    
                    <li>
                        <a href="https://www.apache.org/licenses/">License</a>
                    </li>
                    
                    <li>
                        <a href="mail.html">Mailing Lists</a>
                    </li>
                    
                    <li>
                        <a href="svnindex.html">Source Repositories</a>
                    </li>
                    
                    <li>
                        <a href="https://cwiki.apache.org/confluence/display/JMETER/JMeterCommitters">Contributors</a>
                    </li>
                    
                </ul>
                
            </div>
            <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;
            2024
            , 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>
