Skip to main content

Test Java class with JMeter

It is quite easy to test API or Website using JMeter 

but you may come across situation when you have to load test java class directly. 

This post described how a java class can be load tested. 

We will write a java program and use JMeter Java Sampler to load test it -


  • Set up a maven selenium project. If you are new to java and maven then you may like to check my java tutorials

  • Add following dependencies to your maven project (find out latest versions by searching https://search.maven.org/) - 

<dependency>

   <groupId>org.apache.jmeter</groupId>

   <artifactId>ApacheJMeter_core</artifactId>

   <version>3.1</version>

</dependency>

<dependency>

   <groupId>org.apache.jmeter</groupId>

   <artifactId>ApacheJMeter_java</artifactId>

   <version>3.0</version>

</dependency>

 

  • Let's write a java program to add numbers - 

public class AddNumbers {

   public int addTwoNumbers(int a,int b) {

       return a+b;

   }

}


  • And a test program which we would use in JMeter later on.

  • Implement interface JavaSamplerClient or extend AbstractSamplerClient.

  • You can leave other methods empty and would have to implement runTest and getDefaultParameters. The test class would look as -


public class AddNumberTest implements JavaSamplerClient {

   @Override public void setupTest(JavaSamplerContext javaSamplerContext) {

   }

   @Override

   public SampleResult runTest(JavaSamplerContext javaSamplerContext) {

       String var1 = javaSamplerContext.getParameter("var1");

       String var2 = javaSamplerContext.getParameter("var2");

       SampleResult result = new SampleResult();

       result.sampleStart();

       result.setSampleLabel("Test Sample");

       // Test Code

       AddNumbers addNumbers = new AddNumbers();

       if(addNumbers.addTwoNumbers(Integer.valueOf(var1), Integer.valueOf(var2))==2) {

           result.sampleEnd();

           result.setResponseCode("200");

           result.setResponseMessage("OK");

           result.setSuccessful(true);

       } else {

           result.sampleEnd();

           result.setResponseCode("500");

           result.setResponseMessage("NOK");

           result.setSuccessful(false);

       }

       return result;

   }

   @Override public void teardownTest(JavaSamplerContext javaSamplerContext) {

   }

   @Override public Arguments getDefaultParameters() {

       Arguments defaultParameters = new Arguments();

       defaultParameters.addArgument("var1","1");

       defaultParameters.addArgument("var2","2");

       return defaultParameters;

   }

  • getDefaultParameters has the parameters with default values. This values would appear on Java Sampler which we

  • would see later on. runTest method uses the parameters supplied from getDefaultParameters. runTest is quiet simple, it adds given numbers, if sum is equal to 2 then it is a success else failures.

  • Now package your project using mvn package and place the generated jar file in JMeter's following directory -

  • ~/apache-jmeter-3.0/lib/ext/

  • Now open JMeter and add Java sampler and select classname as AddNumberTest -





If you are new to JMeter then you can follow my JMeter training videos

 Lets run the test with default variables and you will see it fails since 1+2 is not equal to 2

 


Let's change default values to 1


Let's run test again and it is green now -

 



Now you can set up your test with required thread, duration and other parameters :)

** When you create new jar then you should restart JMeter. I did not see JMeter picking changes after placing new jar in /lib/ext/ directory and not restarting the JMeter

Popular posts from this blog

Where is my defect ID?

Don't you feel ecstatic when your automated tests find bug? After all tests finding bugs give us a sense of accomplishment, is not it? And this is followed by usual cycle of defect reporting, retesting and hopefully closure of defect. But at times defects are deferred to next or future releases. Which causes test method to fail for subsequent releases. And if you are dealing with a test suite having 100s of tests then it may become difficult to remember if there was a defect reported for a failing test? How do you deal with such situation. How about adding defect-id to @description tag of TestNG test. Hence it is reported on automated test report and we would know if defect exists for a failing test - How do you track defect-id of a failing test?

Return only first or last element from webelements collection

We often come across situation when there are multiple elements on a page and we probably like to exercise only a few of them using selenium webdriver. May be just first and last element. For example on a search result page we may like to click on only first and last link and not all. This is when Iterables API comes handy. (By the way I am assuming that you have already completed watching selenium training videos :)). Once we have collection of web element then we can use Iterables to get only first or last element as following - Consider that we fetch collection of element as - List< WebElement > webElements = getDriver().findElements(By. id ( "htmlID" ));   Now we can get the first web element from this collection as -  WebElement firstElement = Iterables. getFirst (webElements,  getDriver().findElement(By. id ( "defaultElement" )));   Herein second argument -   (getDriver().findElement(By. id ( "defaultElement" )))    in the me

Selenium Tutorial: Pattern Mathing using Selenium

I must confess I have never been admirer of Regular Expression but then there are times you can not escape from it, especially while working on a website which has dynamic contents appeared in static text and you want to validate it. like - "Validate that this text appears and there is 123 here and 456 here" And the test condition is 123 and 456 could be any three digits but number if digits should not be more than three. In a crude way we can at least test this - Assert.assertTrue(selenium.getText("elementLocator").contains("Validate that this text appears and there is")); but what if text goes wrong after "and there is"... what if more than 3 digits appear in text. This is where pattern matching/regular expression comes for our rescue and we can use matches method of String class to achieve same. So the assertion would be - String text = selenium.getText("elementLocator"); Assert.assertTrue(text.matches("Validate