How to write a completed Jmeter Test Plan for load testing using Jmeter API in Java

 Jmeter is excellent tool used to do load testing on the application. Jmeter has graphical(GUI) and Non graphical(Non GUI) options. Non graphical option use Jmeter API to write a complete test plan for loading testing in java.
Pre-prerequisites:
1. JMeter install somewhere.
2. Add JMeter jars from /lib and especially /lib/ext folders in your project or module class path.

Load the jmeter properties:
 //Set jmeter home for the jmeter utils to load  
 String jmeterHomelocation = "F:\\apache-jmeter-2.13\\";  
 String jmeterPropertieslocation = jmeterHomelocation + "bin\\jmeter.properties";  
   
 //JMeter Engine  
 StandardJMeterEngine jmeter = new StandardJMeterEngine();  
   
 //JMeter initialization (properties, log levels, locale, etc)  
 JMeterUtils.setJMeterHome(new File(jmeterHomelocation).getPath());  
 JMeterUtils.loadJMeterProperties(new File(jmeterPropertieslocation).getPath());  
 // see extra log messages of i.e. DEBUG level  
 JMeterUtils.initLogging();  
 JMeterUtils.initLocale();  

Create "Test Plan" Object and JOrphan HashTree:
 // JMeter Test Plan, basically JOrphan HashTree  
 HashTree testPlanTree = new HashTree();  
             
 // Test Plan  
 TestPlan testPlan = new TestPlan("Java code Test Plan");  
 testPlan.setProperty(TestElement.TEST_CLASS, TestPlan.class.getName());  
 testPlan.setProperty(TestElement.GUI_CLASS, TestPlanGui.class.getName());  
 testPlan.setUserDefinedVariables((Arguments) new ArgumentsPanel().createTestElement());  

Graphical: Thread Group
Right-click on the Test Plan > Add > Threads (Users) > Thread Group
Type below values in corresponding field
Number of Threads (users)   : 1
Ramp-Up Period (in seconds) : 1
Loop Count  : 1
Non Graphical: Thread Group
 // Thread Group  
 ThreadGroup threadGroup = new ThreadGroup();  
 threadGroup.setName("Test Thread Group");  
 threadGroup.setNumThreads(1);  
 threadGroup.setRampUp(1);  
 threadGroup.setSamplerController(loopCtrl);  
 threadGroup.setProperty(TestElement.TEST_CLASS, ThreadGroup.class.getName());  
 threadGroup.setProperty(TestElement.GUI_CLASS, ThreadGroupGui.class.getName());  

Graphical: Sampler
Right-click on the Thread Group > Add > Sampler > HTTP request
Write below values in corresponding field
Server Name or IP : hiromia.blogspot.com
Port NUmber       : 80
Path              : /

Non Graphical: Sampler
 HTTPSampler examplecomSampler = new HTTPSampler();  
 examplecomSampler.setDomain("www.google.com");  
 examplecomSampler.setPort(80);  
 examplecomSampler.setPath("/");  
 examplecomSampler.setMethod("GET");  
 examplecomSampler.setName("google");  
 examplecomSampler.setProperty(TestElement.TEST_CLASS, HTTPSampler.class.getName());  
 examplecomSampler.setProperty(TestElement.GUI_CLASS, HttpTestSampleGui.class.getName());  
Loop Controller:
 // Loop Controller  
  LoopController loopCtrl = new LoopController();  
  loopCtrl.setLoops(10);  
  loopCtrl.setFirst(true);  
  loopCtrl.setProperty(TestElement.TEST_CLASS, LoopController.class.getName());  
  loopCtrl.setProperty(TestElement.GUI_CLASS, LoopControlPanel.class.getName());  
  loopCtrl.initialize();  

Graphical: Summary Report
Right-click on the Thread Group > Add > Listener > Summary Report

Non Graphical: Summary Report
 Summariser summer = null;  
  String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary");  
  if (summariserName.length() > 0) {  
    summer = new Summariser(summariserName);  
  }  
   
 // Store execution results into a .jtl file, we can save file as csv also  
  String reportFile = "report\\report.jtl";  
  String csvFile = "report\\report.csv";  
  ResultCollector logger = new ResultCollector(summer);  
  logger.setFilename(reportFile);  
  ResultCollector csvlogger = new ResultCollector(summer);  
  csvlogger.setFilename(csvFile);  
  testPlanTree.add(testPlanTree.getArray()[0], logger);  
  testPlanTree.add(testPlanTree.getArray()[0], csvlogger);  
   

Run Test Plan:
 // Run Test Plan  
 jmeter.configure(testPlanTree);  
 jmeter.run()  

Completed Jmeter Test Plan java source code:
 import java.io.File;  
 import java.io.FileOutputStream;  
 import org.apache.jmeter.config.Arguments;  
 import org.apache.jmeter.config.gui.ArgumentsPanel;  
 import org.apache.jmeter.control.LoopController;  
 import org.apache.jmeter.control.gui.LoopControlPanel;  
 import org.apache.jmeter.control.gui.TestPlanGui;  
 import org.apache.jmeter.engine.StandardJMeterEngine;  
 import org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui;  
 import org.apache.jmeter.protocol.http.sampler.HTTPSampler;  
 import org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy;  
 import org.apache.jmeter.reporters.ResultCollector;  
 import org.apache.jmeter.reporters.Summariser;  
 import org.apache.jmeter.save.SaveService;  
 import org.apache.jmeter.testelement.TestElement;  
 import org.apache.jmeter.testelement.TestPlan;  
 import org.apache.jmeter.threads.ThreadGroup;  
 import org.apache.jmeter.threads.gui.ThreadGroupGui;  
 import org.apache.jmeter.util.JMeterUtils;  
 import org.apache.jorphan.collections.HashTree;  
   
   
 public class CompleteNongraphicaljplan {  
   public static void main(String[] argv) throws Exception {  
   
     //Set jmeter home for the jmeter utils to load  
     String jmeterHomelocation = "F:\\apache-jmeter-2.13\\";  
     String jmeterPropertieslocation = jmeterHomelocation + "bin\\jmeter.properties";  
   
   
     //JMeter Engine  
     StandardJMeterEngine jmeter = new StandardJMeterEngine();  
   
     //JMeter initialization (properties, log levels, locale, etc)  
     JMeterUtils.setJMeterHome(new File(jmeterHomelocation).getPath());  
     JMeterUtils.loadJMeterProperties(new File(jmeterPropertieslocation).getPath());  
     // see extra log messages of i.e. DEBUG level  
     JMeterUtils.initLogging();  
     JMeterUtils.initLocale();  
   
     // JMeter Test Plan, basically JOrphan HashTree  
     HashTree testPlanTree = new HashTree();  
   
     // First HTTP Sampler - open google.com  
     HTTPSampler examplecomSampler = new HTTPSampler();  
     examplecomSampler.setDomain("www.google.com");  
     examplecomSampler.setPort(80);  
     examplecomSampler.setPath("/");  
     examplecomSampler.setMethod("GET");  
     examplecomSampler.setName("google");  
     examplecomSampler.setProperty(TestElement.TEST_CLASS, HTTPSampler.class.getName());  
     examplecomSampler.setProperty(TestElement.GUI_CLASS, HttpTestSampleGui.class.getName());  
   
   
     // Loop Controller  
     LoopController loopCtrl = new LoopController();  
     loopCtrl.setLoops(10);  
     loopCtrl.setFirst(true);  
     loopCtrl.setProperty(TestElement.TEST_CLASS, LoopController.class.getName());  
     loopCtrl.setProperty(TestElement.GUI_CLASS, LoopControlPanel.class.getName());  
     loopCtrl.initialize();  
   
     // Thread Group  
     ThreadGroup threadGroup = new ThreadGroup();  
     threadGroup.setName("Test Thread Group");  
     threadGroup.setNumThreads(1);  
     threadGroup.setRampUp(1);  
     threadGroup.setSamplerController(loopCtrl);  
     threadGroup.setProperty(TestElement.TEST_CLASS, ThreadGroup.class.getName());  
     threadGroup.setProperty(TestElement.GUI_CLASS, ThreadGroupGui.class.getName());  
   
     // Test Plan  
     TestPlan testPlan = new TestPlan("Java code Test Plan");  
     testPlan.setProperty(TestElement.TEST_CLASS, TestPlan.class.getName());  
     testPlan.setProperty(TestElement.GUI_CLASS, TestPlanGui.class.getName());  
     testPlan.setUserDefinedVariables((Arguments) new ArgumentsPanel().createTestElement());  
   
     // Construct Test Plan from previously initialized elements  
     testPlanTree.add(testPlan);  
     HashTree threadGroupHashTree = testPlanTree.add(testPlan, threadGroup);  
     threadGroupHashTree.add(examplecomSampler);  
       
   
     // save generated test plan to JMeter's .jmx file format  
     SaveService.saveTree(testPlanTree, new FileOutputStream("report\\jmeter_api_sample.jmx"));  
   
     //add Summarizer output to get test progress in stdout like:  
     // summary =   2 in  1.3s =  1.5/s Avg:  631 Min:  290 Max:  973 Err:   0 (0.00%)  
     Summariser summer = null;  
     String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary");  
     if (summariserName.length() > 0) {  
       summer = new Summariser(summariserName);  
     }  
   
   
     // Store execution results into a .jtl file, we can save file as csv also  
     String reportFile = "summaryreport.jtl";  
     String csvFile = "summaryreport.csv";  
     ResultCollector logger = new ResultCollector(summer);  
     logger.setFilename(reportFile);  
     ResultCollector csvlogger = new ResultCollector(summer);  
     csvlogger.setFilename(csvFile);  
     testPlanTree.add(testPlanTree.getArray()[0], logger);  
     testPlanTree.add(testPlanTree.getArray()[0], csvlogger);  
       
           // Run Test Plan  
     jmeter.configure(testPlanTree);  
     jmeter.run();  
   
   
     System.exit(0);  
   
   
   }  
 }  
   

Output:

How to run Jmeter load testing script using java.

JMeter API has an option to run JMeter script which made by Jmeter GUI using java. StandardJMeterEngine is the 'heart' of JMeter. If you must execute a JMeter test from Java code, this is the best option. The absolute minimal code to read the existing .jmx file.
Pre-prerequisites:
1. JMeter install somewhere.
2. Add JMeter jars from /lib and especially /lib/ext folders in your project or module class path.

Build Jmeter load testing script using below steps:
1. Start Jmeter
Click on Jmeter_Home/bin/ApacheJMeter.jar or jmeter.sh to open Jmeter window

2. Add 'Thread Group' under 'Test Plan'
Right-click on the Test Plan > Add > Threads (Users) > Thread Group
Type below values in corresponding field
Number of Threads (users)   : 1
Ramp-Up Period (in seconds) : 1
Loop Count                  : 1

3. Add a Sampler under 'Thread Group'
Right-click on the Thread Group > Add > Sampler > HTTP request
Write below values in corresponding field
Server Name or IP : hiromia.blogspot.com
Port NUmber       : 80
Path              : /

4. Add Listener under 'Thread Group'
Right-click on the Thread Group > Add > Listener > View Results Tree

5. Finally Save Test plan with desired name

Demo Java Code:
 import org.apache.jmeter.engine.StandardJMeterEngine;  
 import org.apache.jmeter.reporters.ResultCollector;  
 import org.apache.jmeter.reporters.Summariser;  
 import org.apache.jmeter.save.SaveService;  
 import org.apache.jmeter.util.JMeterUtils;  
 import org.apache.jorphan.collections.HashTree;  
   
 import java.io.File;  
 import java.io.FileInputStream;  
   
 public class ProgramJmeterJMX {  
   
   public static void main(String[] argv) throws Exception {  
   
     //Set jmeter home for the jmeter utils to load  
     String jmeterHomelocation = "F:\\apache-jmeter-2.13\\";  
     String jmeterPropertieslocation = jmeterHomelocation + "bin\\jmeter.properties";  
   
     // JMeter Engine  
     StandardJMeterEngine jmeter = new StandardJMeterEngine();  
   
   
     // Initialize Properties, logging, locale, etc.  
     JMeterUtils.loadJMeterProperties(new File(jmeterPropertieslocation).getPath());  
     JMeterUtils.setJMeterHome(new File(jmeterHomelocation).getPath());  
     // you can comment this line out to see extra log messages of i.e. DEBUG level  
     JMeterUtils.initLogging();  
     JMeterUtils.initLocale();  
   
     // Initialize JMeter SaveService  
     SaveService.loadProperties();  
   
     // Load existing .jmx Test Plan  
     FileInputStream in = new FileInputStream(new File(jmeterHomelocation + "bin\\webloadtesting.jmx"));  
     HashTree testPlanTree = SaveService.loadTree(in);  
     in.close();  
             
     Summariser summer = null;  
     String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary");  
   
     if (summariserName.length() > 0) {  
       summer = new Summariser(summariserName);  
     }  
   
     ResultCollector logger = new ResultCollector(summer);  
     testPlanTree.add(testPlanTree.getArray()[0], logger);  
   
     // Run JMeter Test  
     jmeter.configure(testPlanTree);  
     jmeter.run();  
   }  
 }     
   

Out put:

How to encode or encrypt password and other personal information in Selenium Webdriver using Java

Daily we sign in many popular websites like Facebook, Gmail, LinkedIn etc. with login credential. We need to send password as plain text to sign in those popular websites if want to write automation login script in selenium webdriver. One of the most common practice to send encrypted passwords and other personal information instead of plain text for the automation login script.

Base64: Base64 is a group of similar binary-to-text encoding schemes that represent binary data in an ASCII string format by translating it into a radix-64 representation. The term Base64 originates from a specific MIME content transfer encoding.
 byte[] encodedBytes = Base64.encodeBase64("TextforEncoding".getBytes());  
 System.out.println("encodedBytes " + new String(encodedBytes));  
 byte[] decodedBytes = Base64.decodeBase64(encodedBytes);  
 System.out.println("decodedBytes " + new String(decodedBytes));  
Prerequisite
1. Create a 'data.properties' file your project home directory
2. Download Base64 jar file and add jar file in project as external jar.

Demo Source code:
 import org.apache.commons.codec.binary.Base64;  
 import org.openqa.selenium.By;  
 import org.openqa.selenium.WebDriver;  
 import org.openqa.selenium.firefox.FirefoxDriver;  
 import java.io.File;  
 import java.io.FileInputStream;  
 import java.io.IOException;  
 import java.util.Properties;  
 import java.util.concurrent.TimeUnit;    
   
 public class Encryptionpassword {  
   private static By email = By.id("email");  
   private static By password = By.id("pass");  
   private static By loginbutton = By.id("u_0_m");  
   
   public static void main(String[] arg) throws IOException {  
   
     // Create FileInputStream Object  
     FileInputStream fileInput = new FileInputStream(new File("data.properties"));  
     // Create Properties object  
     Properties prop = new Properties();  
     //load properties file  
     prop.load(fileInput);  
   
     // create Firebox object  
     WebDriver driver = new FirefoxDriver();  
     //Go to URL  
     driver.get("http://www.facebook.com");  
     //Maximize browser window  
     driver.manage().window().maximize();  
     //Set timeout  
     driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);  
   
     driver.findElement(email).clear();  
     driver.findElement(email).sendKeys(prop.getProperty("username"));  
   
     driver.findElement(password).clear();  
     driver.findElement(password).sendKeys(new String(Base64.encodeBase64(prop.getProperty("password").getBytes())));  
   
     driver.findElement(loginbutton).click();  
   
     //Print Encrypted Password  
     System.out.println("Encrypted Password =: " + new String(Base64.encodeBase64(prop.getProperty("password").getBytes())));  
     //Print Decrypted Password  
     System.out.println("Decrypted Password =: " + new String(Base64.decodeBase64(Base64.encodeBase64(prop.getProperty("password").getBytes()))));  
   
     //close firefox browser  
     driver.close();  
   }  
 }  
   

Output:

How to get extract numbers or digits or numeric values and numbers array from a string in Java


 import com.google.common.base.CharMatcher;  
 import java.util.Arrays;  
   
 public class Getnumbers {  
   
   // Get extract numbers from String  
   public static String getAllNumberfromString(String input) {  
     final StringBuilder sb = new StringBuilder();  
     for (int i = 0; i < input.length(); i++) {  
       final char c = input.charAt(i);  
       if (c > 47 && c < 58) {  
         sb.append(c);  
       }  
     }  
     return sb.toString();  
   }  
   
   // Get only Numbers from String  
   public static String getExtractDigits(String src) {  
     StringBuilder builder = new StringBuilder();  
     for (int i = 0; i < src.length(); i++) {  
       char c = src.charAt(i);  
       if (Character.isDigit(c)) {  
         builder.append(c);  
       }  
     }  
     return builder.toString();  
   }  
   
   public static void main(String[] arg) {     
   
     String input = "Total 128 jobs Found 25";  
     String str = "abc d 1234567890pqr 54897";  
   
     // Get only Numbers from Alphanumeric String using methods  
     System.out.println(getAllNumberfromString(input));  
     System.out.println(getAllNumberfromString(input));  
     System.out.println(getExtractDigits(str));  
     System.out.println(getExtractDigits(str));  
   
     // Get extract numbers from String using Regular Expressions  
     System.out.println(input.replaceAll("[^0-9]", ""));  
     System.out.println(str.replaceAll("\\D+", ""));  
   
     // Get extract numbers from String using building method  
     System.out.println(CharMatcher.DIGIT.retainFrom(input));  
   
     // Get extract numbers separately from String using Regular Expressions  
     System.out.println(input.replaceAll("[^-?0-9]+", " "));  
   
     // Get numbers array from String using Regular Expressions  
     System.out.println(Arrays.asList(str.replaceAll("[^-?0-9]+", " ").trim().split(" ")));  
   }  
 }  
   
Output: