---
# System prepended metadata

title: Performance testing using Apache JMeter
tags: ['testing, performance, load']

---

# Performance testing using Apache JMeter

###### tags: `testing, performance, load`

## What is Performance Testing?

- It is a type of non-functional testing that is perfomed:
    - To know the how fast some aspect of a system perfoms under particular workload.
    - To determine that the system under test will satisfy high load requirements.
    - To demonstrate that system meets performance criteria.

## :memo: Why is it important? 

The performance testing is useful to:

- Improve user experience on system.
- Gather metrics useful for tuning the system.
- Identify bottlenecks such as database configuration.
- Determine if a new release is ready for production.
- Provide reporting to business stakeholders regarding performance against expectations.

## What kinds of Performance Testing are there?

Performance Testing includes:

1. Load testing

    It's a testing that consists in simulating multiple user access concurrently to the system for modeling the expect usage.

2. Stress testing.
    It's a test that determines the maximum load that the web server can handle. Given that each server has a maximum load capacity and when the load goes beyond the limit, the web server starts responding slowly and produce errors. 

## How do we start?


We are going to use JMeter to do the performance testing. Firstly, we are going to work with load testing.

#### Why JMeter?
- **Cross-platform:** JMeter can run on any operating system with Java
- **Scalable:** When you need a higher load than a single machine can create, JMeter can execute in a distributed mode, meaning one master JMeter machine controls a number of remote hosts.
- **Multi-protocol support:** The following protocols are all supported out-of-the-box: HTTP, SMTP, POP3, LDAP, JDBC, FTP, JMS, SOAP, TCP
- Various assertions to define criteria
- Full featured Test IDE that allows fast Test Plan recording
- Comprehensive informative load reports.
- Integration with major build and continuous integration systems.

:::info
:pushpin: Want to see other open source tools? ➜ [Performance Testing Tools](https://www.blazemeter.com/blog/open-source-load-testing-tools-which-one-should-you-use) 
:::


### Load Testing

:bulb: The main idea is that JMeter make copy of samplers and running them in separated thread.

:star: Before testing the system, it's important determinate:
* **Normal load:** The average number of users that visit the system.
* **Heavy load:** The maximum number of user that visit the system.
* **Target:** The IP address of the server. 

### **Step 1:** Add Thred Group

- [x] Start JMeter
    > For run GUI, open the jmeter folder, open bin and run the bin file jmeter.
- [x] Right click Test Plan

    > Add -> Thread (Users) -> Thread Group

- [x] Enter following properties in the Thread Group panel:
    - [x] **Number of Threads:** 100
    Number of users connects to the application.
    - [x] **Loop Count:** 10
    Number of times ONE user connects to the application
    - [x] **Ramp-Up Period:** 100
    Acceleration time that determines how long the user test delay before starting the next user.
    - [ ] ==Delay between the initial users==
    Ram-Up Period / Number of Threads
    

### **Step 2:** Add JMeter elements.

- [x] Add an **HTTP request defaults**
    - [x] Right click Test Plan
    
         > Add -> Config Element -> HTTP Request Defaults.
    - [x]  Enter the server name or IP 
- [x] Add **HTTP Request**
    - [x] Right click Thread Group
    
         > Add -> Sampler -> HTTP Request.
    - [x] Edit request name.
    - [x] Edit the path field
        It indicates which **URL request**  you want to send to application.
    - [x] Add body data
        To create an HTTP request with a dynamic email parameter which is generated by pre-processor.
- [x] Add a **JSON extractor post-processor**
    To get authentication token from the response of login user request.
    - [x] Right click HTTP Request
    
         > Add -> Post Processors -> JSON Extractor.
    - [x] Edit **Name of created variables** with ==authToken==.
    - [x] Edit JSON Path Expressions with value returned. For example, ==$.token==
- [x]  Add an **HTTP header manager** 
    To add authentication token as the header to all subsequent requests.
    - [x] Right click Thread Group
    
         > Add -> Config Element -> HTTP Head Manager.
     - [x] Add authentication header
         - [x] Edit **name** with Authentication.
         - [x] Edit **value** with variable stored in JSON Extractor, ==${authToken}==
   

### **Step 3:** Add Graph result.

- [x] Right click Thread Group

    > Add -> Listener -> Graph Results

- [x] Right click Thread Group

    > Add -> Listener -> Summary Report.

### **Step 4:**  Run Test and get the test result.

- [x] Press the Run button (Ctrl + R)

    > The Run button is on the Toolbar to start the software testing process.

- [x] See the test result display on Graph in the real time.

---

## References


| Topic          | Tutorials               |
| ----------------- |:----------------------- |
| Load Testing Using Apache JMeter       | [:link:][Load-Testing-JMeter-0]   |
| Rest API Load testing with Apache JMeter | [:link:][Load-Testing-JMeter-1]     |
| What is Performance testing in software?        | [:link:][Definition-0]     |
| How to Use JMeter for Performance & Load Testing | [:link:][Load-Testing-JMeter-2]    |

[Load-Testing-JMeter-0]: https://itnext.io/load-testing-using-apache-jmeter-af189dd6f805
[Load-Testing-JMeter-1]: https://medium.com/@chamikakasun/rest-api-load-testing-with-apache-jmeter-a4d25ea2b7b6
[Definition-0]: http://tryqa.com/what-is-performance-testing-in-software/
[Load-Testing-JMeter-2]: https://www.guru99.com/jmeter-performance-testing.html