<!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
          -
          JUnit Sampler Tutorial</title>
<meta name="author" value="JMeter developers">
<meta name="email" value="dev@jmeter.apache.org">
<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="jmeter_proxy_step_by_step.html">&lt; Prev</a>
</li>
<li>
<a href="../index.html">Index</a>
</li>
<li>
<a href="jmeter_accesslog_sampler_step_by_step.html">Next &gt;</a>
</li>
</ul>
<div class="section">
<h1 id="junit">27. JUnit Sampler Tutorial<a class="sectionlink" href="#junit" title="Link to here">&para;</a>
</h1>


<p>
This tutorial attempts to explain the basic design, functionality and usage of the new JUnit Sampler for JMeter.
The sampler was introduced in version 2.1.2 release of JMeter. Earlier releases do not have the sampler.
</p>


<div class="subsection">
<h2 id="design">27.1 Design<a class="sectionlink" href="#design" title="Link to here">&para;</a>
</h2>


<p>
The current implementation supports standard JUnit convention and extensions, like <span class="code">oneTimeSetUp</span>
and <span class="code">oneTimeTearDown</span>. Other features can be added on request. The sampler works like the JavaSampler
with some differences.
</p>


<ul>
  
<li>Rather than use JMeter's test interface, it scans the jar files for classes extending JUnit's
      <span class="code">TestCase</span> class. This means any class or subclass.</li>
  
<li>JUnit test jar files are copied to <span class="code">jmeter/lib/junit</span> instead of
      <span class="code">jmeter/lib</span>
</li>
  
<li>JUnit sampler does not use name/value pairs for configuration. The sampler assumes
      <span class="code">setUp</span> and <span class="code">tearDown</span> will configure the test correctly.
      <div class="clear"></div>
<div class="note">Note: <span class="code">setUp</span> and <span class="code">tearDown</span> methods must be declared <span class="code">public</span>,
       so that JMeter can use it.</div>
<div class="clear"></div>
  
</li>
  
<li>The sampler measures the elapsed time only for the test method and does not include
      <span class="code">setUp</span> and <span class="code">tearDown</span>.
  </li>
  
<li>Each time the test method is called, JMeter will pass the result to the listeners.</li>
  
<li>Support for <span class="code">oneTimeSetUp</span> and <span class="code">oneTimeTearDown</span> is done as a method.
      Since JMeter is multi-threaded, we cannot call <span class="code">oneTimeSetUp</span>/<span class="code">oneTimeTearDown</span>
      the same way maven does it.</li>
  
<li>The sampler reports unexpected exceptions as errors.</li>

</ul>


</div>


<div class="subsection">
<h2 id="functionality">27.2 Functionality<a class="sectionlink" href="#functionality" title="Link to here">&para;</a>
</h2>


<p>
Here is a description of the functionality.
</p>


<dl>
  
<dt>Name</dt>
<dd>name for the sample. This is the same as all JMeter samplers.</dd>
  
<dt>Package Filter</dt>
<dd>provides a way to filter the classes by package name.</dd>
  
<dt>Classname</dt>
<dd>the name of the class to test. The sampler will scan the jar files in
      <span class="code">jmeter/lib/ext</span> and <span class="code">jmeter/lib/junit</span> for classes extending
      JUnit's <span class="code">TestCase</span>.</dd>
  
<dt>Constructor String</dt>
<dd>a string to pass to the string constructor of the test class.</dd>
  
<dt>Test Method</dt>
<dd>the name of the method to test in the sampler.</dd>
  
<dt>Success message</dt>
<dd>a descriptive message indicating what success means.</dd>
  
<dt>Success code</dt>
<dd>an unique code indicating the test was successful.</dd>
  
<dt>Failure message</dt>
<dd>a descriptive message indicating what failure means.</dd>
  
<dt>Failure code</dt>
<dd>an unique code indicating the test failed</dd>
  
<dt>Error message</dt>
<dd>a description for errors</dd>
  
<dt>Error code</dt>
<dd>some code for errors. Does not need to be unique</dd>
  
<dt>Do not call <span class="code">setUp</span> and <span class="code">tearDown</span>
</dt>
<dd>set the sampler not
      to call <span class="code">setUp</span> and <span class="code">tearDown</span>. By default, <span class="code">setUp</span> and
      <span class="code">tearDown</span> should be called. Not calling those methods could affect the test and
      make it inaccurate. This option should be used with caution.
      <div class="clear"></div>
<div class="note">If the selected method is <span class="code">oneTimeSetUp</span> or <span class="code">oneTimeTearDown</span>,
      this option should be checked.</div>
<div class="clear"></div>
</dd>
  
<dt>Append assertion error</dt>
<dd>By default, the sampler will not append the assert failures
      to the failure message. To see the message in the result tree, check the option.</dd>
  
<dt>Append runtime exception</dt>
<dd>By default, the sampler will not append the exceptions
      to the failure message. To see the stacktrace, check the option</dd>

</dl>


<figure>
<a href="../images/screenshots/junit_sampler.png"><img src="../images/screenshots/junit_sampler.png" width="397" height="536" alt="JUnit Request"></a>
<figcaption>JUnit Request</figcaption>
</figure>


<p>
The current implementation of the sampler will try to create an instance using the string constructor
first. If the test class does not declare a string constructor, the sampler will look for an empty
constructor. Example below:
</p>


<div class="example">
<div class="title">Constructor Examples<a class="sectionlink" href="#constructor-examples" title="Link to here">&para;</a>
</div>
Empty Constructor:
<pre class="source">
public class myTestCase {
  public myTestCase() {}
}
</pre>

String Constructor:
<pre class="source">
public class myTestCase {
  public myTestCase(String text) {
    super(text);
  }
}
</pre>

</div>


<p>
By default, JMeter will provide some default values for the success/failure code and message.
Users should define a set of unique success and failure codes and use them uniformly across all tests.
</p>


</div>


<div class="subsection">
<h2 id="usage">27.3 Usage<a class="sectionlink" href="#usage" title="Link to here">&para;</a>
</h2>


<p>
Here is a short step-by-step.
</p>


<ol>
  
<li>Write your JUnit test and jar the classes</li>
  
<li>Copy and paste the jar files into <span class="code">jmeter/lib/junit</span> directory</li>
  
<li>Start JMeter</li>
  
<li>Select <span class="code">Test Plan</span>
</li>
  
<li>Right click
     <span class="menuchoice"><span class="guimenuitem">Add</span>&nbsp;&rarr;&nbsp;<span class="guimenuitem">Thread Group</span></span>
</li>
  
<li>Select <span class="code">Thread Group</span>
</li>
  
<li>Right click
      <span class="menuchoice"><span class="guimenuitem">Add</span>&nbsp;&rarr;&nbsp;<span class="guimenuitem">Sampler</span>&nbsp;&rarr;&nbsp;<span class="guimenuitem">JUnit Request</span></span>
</li>
  
<li>Enter <span class="code">my unit test</span> in the name</li>
  
<li>Enter the package of your JUnit test</li>
  
<li>Select the class you want to test</li>
  
<li>Select a method to test</li>
  
<li>Enter <span class="code">test successful</span> in success message</li>
  
<li>Enter <span class="code">1000</span> in success code</li>
  
<li>Enter <span class="code">test failed</span> in failure message</li>
  
<li>Enter <span class="code">0001</span> in failure code</li>
  
<li>Select the Thread Group</li>
  
<li>Right click
      <span class="menuchoice"><span class="guimenuitem">Add</span>&nbsp;&rarr;&nbsp;<span class="guimenuitem">Listener</span>&nbsp;&rarr;&nbsp;<span class="guimenuitem">View Results Tree</span></span>
</li>

</ol>


<p>
One benefit of the JUnit sampler is it allows the user to select any method from a variety
of unit tests to create a test plan. This should reduce the amount of code an user needs to
write to create a variety of test scenarios. From a basic set of test methods, different
sequences and tests can be created using JMeter's GUI.
</p>


<p>
For example:
</p>


<p>
Test Plan1
<pre class="source">
TestCase1.testImportCustomer
TestCase2.testUpdateRandomCustomer
TestCase1.testSelect100
TestCase2.testUpdateOrder
TestCase1.testSelect1000
</pre>

</p>


<p>
TestPlan2
<pre class="source">
TestCase1.testImportCustomer
TestCase1.testSelect100
TestCase1.testSelect1000
TestCase2.testAdd100Customers
</pre>

</p>


</div>


<div class="subsection">
<h2 id="guidelines">27.4 General Guidelines<a class="sectionlink" href="#guidelines" title="Link to here">&para;</a>
</h2>


<p>
Here are some general guidelines for writing JUnit tests so they work well with JMeter. Since JMeter
runs multi-threaded, it is important to keep certain things in mind.
</p>


<ul>
  
<li>Write the <span class="code">setUp</span> and <span class="code">tearDown</span> methods so they are thread safe. This
      generally means avoid using static members.</li>
  
<li>Make the test methods discrete units of work and not long sequences of actions. By keeping
      the test method to a discrete operation, it makes it easier to combine test methods to create
      new test plans.</li>
  
<li>Avoid making test methods depend on each other. Since JMeter allows arbitrary sequencing of
      test methods, the runtime behavior is different than the default JUnit behavior.</li>
  
<li>If a test method is configurable, be careful about where the properties are stored. Reading
      the properties from the Jar file is recommended.</li>
  
<li>Each sampler creates an instance of the test class, so write your test so the setup happens
      in <span class="code">oneTimeSetUp</span> and <span class="code">oneTimeTearDown</span>.</li>
  
<li>If you select a class and no methods show up, it means the sampler had a problem creating an
      instance of the test class. The best way to debug this is to add some <span class="code">System.out</span>
      to your class constructor and see what is happening.</li>

</ul>


</div>


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