Full Stack • Java • System Design • Cloud • AI Engineering

CodeQuality2026-06-17

JMeter Performance Testing

Master JMeter performance testing with visual diagrams covering test setup, load testing, profiling, recording, processors, and scripting. Complete guide with workflows and best practices.

Q1: Performance Issue Resolution Process

flowchart TD
    Issue[Performance Issue Detected] --> Reproduce[Reproduce with JMeter]
    
    Reproduce --> Setup[Setup JMeter Test]
    Setup --> Concurrent[Configure Concurrent Users]
    Setup --> Load[Apply Heavy Load]
    
    Load --> Profile[Profile with jvisualvm]
    Profile --> Monitor[Monitor Metrics]
    
    Monitor --> CPU[CPU Times]
    Monitor --> Memory[Memory Usage]
    Monitor --> Threads[Thread Activity]
    Monitor --> GC[Garbage Collection]
    
    Monitor --> Identify[Identify Bottleneck]
    Identify --> Fix[Apply Fix]
    
    Fix --> Retest[Retest Performance]
    Retest --> Verify{Issue Resolved?}
    
    Verify -->|No| Profile
    Verify -->|Yes| Complete[Complete]
    
    style Issue fill:#FF5252
    style Complete fill:#4CAF50

Resolution Workflow:

  • Set up JMeter to reproduce production-like scenario with concurrent requests
  • Apply heavy load to system to expose performance bottlenecks
  • Use profiling tools (jvisualvm, JProfiler) to monitor CPU, memory, threads
  • Identify specific bottleneck (database, memory leak, inefficient code)
  • Common issues: connection leaks, backtracking regex, Cartesian SQL joins
  • Apply targeted fixes and retest to verify improvement

Q2: Performance Improvement Example

graph LR
    Before[Before<br/>Response Time: 4s] --> Analysis[Performance Analysis]
    
    Analysis --> Issues[Issues Found]
    Issues --> I1[DB Connection Leak]
    Issues --> I2[Backtracking Regex]
    Issues --> I3[Cartesian SQL Joins]
    
    Issues --> Fixes[Applied Fixes]
    Fixes --> F1[Fixed Connection Pool]
    Fixes --> F2[Optimized Regex]
    Fixes --> F3[Rewrote SQL Query]
    
    Fixes --> After[After<br/>Response Time: 2s]
    
    After --> Improvement[50% Improvement]
    
    style Before fill:#FF5252
    style After fill:#4CAF50
    style Improvement fill:#2196F3

Accomplishment Details:

  • Reduced response time from 4 seconds to 2 seconds (50% improvement)
  • Used JMeter to simulate peak load and identify performance degradation
  • Profiling revealed database connection leak causing resource exhaustion
  • Fixed backtracking regular expression causing CPU spikes
  • Rewrote SQL query to eliminate Cartesian joins reducing database load
  • Verified improvements under sustained load testing

Q3: JMeter Test Structure

graph TB
    TestPlan[Test Plan<br/>OrderExecution.jmx] --> ThreadGroup[Thread Group<br/>30 Concurrent Users]
    
    ThreadGroup --> Config[Configuration Elements]
    Config --> Variables[User Defined Variables<br/>HOST, PORT, DATA_PATH]
    Config --> CSV[CSV Data Config<br/>TestData.csv]
    Config --> Headers[HTTP Header Manager<br/>Content-Type: application xml]
    Config --> Defaults[HTTP Request Defaults<br/>Server, Protocol]
    
    ThreadGroup --> Controllers[Controllers]
    Controllers --> Loop[Loop Controller<br/>Iterations: 1]
    
    Loop --> Samplers[Samplers]
    Samplers --> HTTP[HTTP Request<br/>POST Order XML]
    
    HTTP --> Assertions[Assertions]
    Assertions --> XPath[XPath Assertion<br/>Verify Response]
    
    HTTP --> Timers[Timers]
    Timers --> Gaussian[Gaussian Timer<br/>3 min delay]
    
    HTTP --> Listeners[Listeners]
    Listeners --> Results[View Results Tree]
    Listeners --> Graph[Graph Results]
    Listeners --> Summary[Summary Report]
    
    style TestPlan fill:#FF9900
    style ThreadGroup fill:#4CAF50

Test Components:

  • Thread Group: Simulates 30 concurrent users with 180s ramp-up (3 minutes)
  • User Defined Variables: Centralize configuration (HOST, PORT, paths) for easy modification
  • CSV Data Config: Read test data from file, cycle through different account IDs
  • HTTP Request Defaults: Set common parameters to avoid repetition in each request
  • Samplers: Execute actual HTTP requests with dynamic file paths using variables
  • Listeners: Collect and display test results (tree view, graphs, summary reports)

Q4: JMeter Recording Methods

sequenceDiagram
    participant Browser
    participant Proxy as JMeter Proxy<br/>Port 9090
    participant JMeter as JMeter WorkBench
    participant TestPlan as Test Plan
    
    Note over Browser,TestPlan: Method 1: JMeter as Proxy
    
    Browser->>Proxy: Configure Browser<br/>Proxy: localhost:9090
    Browser->>Proxy: Browse Application<br/>http://myhost:7001/myapp
    Proxy->>JMeter: Record HTTP Requests
    JMeter->>JMeter: Filter Requests<br/>Include: .*myapp.*<br/>Exclude: .*\.jpg
    JMeter->>TestPlan: Move Recorded Elements
    
    Note over Browser,TestPlan: Method 2: BadBoy Tool
    
    Browser->>Browser: Use BadBoy to Record
    Browser->>Browser: Export as .jmx file
    Browser->>TestPlan: Import into JMeter
    TestPlan->>TestPlan: Clean up and extend

Recording Approaches:

  • JMeter Proxy: Configure JMeter as HTTP proxy server on port 9090
  • Set browser to use JMeter proxy, then browse application to record actions
  • Use include/exclude patterns to filter relevant requests (avoid images, CSS)
  • BadBoy Tool: External tool for recording web interactions, exports to .jmx format
  • Generated scripts require cleanup but provide good starting point
  • Add user-defined variables, CSV config, and assertions after recording

Q5: JMeter Element Execution Order

flowchart TD
    Start[Test Execution Starts] --> Config[0. Configuration Elements<br/>Variables, Defaults, CSV]
    
    Config --> PreProc[1. Pre-Processors<br/>Modify Request Before Execution]
    
    PreProc --> Timer[2. Timers<br/>Delay Before Request]
    
    Timer --> Sampler[3. Sampler<br/>Execute HTTP Request]
    
    Sampler --> Check{SampleResult<br/>Not Null?}
    
    Check -->|Yes| PostProc[4. Post-Processors<br/>Extract Values from Response]
    Check -->|No| End[Skip Remaining]
    
    PostProc --> Assert[5. Assertions<br/>Validate Response]
    
    Assert --> Listen[6. Listeners<br/>Record Results]
    
    Listen --> Next{More<br/>Iterations?}
    
    Next -->|Yes| Config
    Next -->|No| Complete[Test Complete]
    
    style Config fill:#E3F2FD
    style Sampler fill:#FF9900
    style Complete fill:#4CAF50

Execution Sequence:

  • Configuration Elements: Set up variables, defaults, and data sources first
  • Pre-Processors: Modify sampler settings before request execution
  • Timers: Introduce delays to simulate realistic user behavior
  • Samplers: Execute actual requests (HTTP, JDBC, JMS, etc.)
  • Post-Processors: Extract values from response (regex, XPath) for subsequent requests
  • Assertions: Validate response content, status codes, response times

Q6: Pre-Processor and Post-Processor Usage

graph TB
    subgraph PreProcessor[Pre-Processor Use Cases]
        Pre[Pre-Processor] --> P1[Modify Request Parameters]
        Pre --> P2[Update Variables]
        Pre --> P3[Set HTTP Headers]
        Pre --> P4[Prepare Request Body]
    end
    
    Sampler[HTTP Sampler<br/>Execute Request] --> Response[Response Received]
    
    subgraph PostProcessor[Post-Processor Use Cases]
        Post[Post-Processor] --> PP1[Extract Values<br/>Regex Extractor]
        Post --> PP2[Parse Response<br/>XPath Extractor]
        Post --> PP3[Extract Tokens<br/>jsfViewState, CID]
        Post --> PP4[Store for Next Request]
    end
    
    PreProcessor --> Sampler
    Response --> PostProcessor
    
    style PreProcessor fill:#E3F2FD
    style PostProcessor fill:#FFF3E0
    style Sampler fill:#FF9900

Processor Functions:

  • Pre-Processor: Executes before sampler, modifies request settings or updates variables
  • Common use: Set dynamic headers, modify request parameters based on previous responses
  • Post-Processor: Executes after sampler, processes response data
  • Regular Expression Extractor: Extract values using regex patterns for correlation
  • XPath Extractor: Parse XML/HTML responses to extract specific elements
  • Example: Extract jsfViewState and CID from JSF/Seam framework responses for subsequent requests

Q7: BeanShell Scripting for Flexibility

graph TB
    JMeter[JMeter Test] --> BeanShell[BeanShell Scripting]
    
    BeanShell --> Features[Features]
    Features --> F1[Embedded Java Interpreter]
    Features --> F2[Custom Functions]
    Features --> F3[File Operations]
    Features --> F4[Complex Logic]
    
    BeanShell --> Examples[Use Cases]
    Examples --> E1[Extract and Write Order IDs]
    Examples --> E2[Date Calculations<br/>getReportStartDate]
    Examples --> E3[Conditional Logic<br/>isTenth loopCounter]
    Examples --> E4[Custom Validations]
    
    BeanShell --> Integration[Integration]
    Integration --> I1[BeanShell PostProcessor]
    Integration --> I2[BeanShell PreProcessor]
    Integration --> I3[Custom Functions<br/>MyBeanShell.bsh]
    Integration --> I4[Built-in Functions<br/>__time, __Random]
    
    style BeanShell fill:#FF9900
    style Features fill:#4CAF50

BeanShell Capabilities:

  • Embedded Java interpreter for custom scripting within JMeter
  • Write complex logic not possible with standard JMeter elements
  • Extract values from responses and write to files for analysis
  • Create reusable custom functions in .bsh files stored in JMETER_HOME/bin
  • Invoke functions using ${__BeanShell(return myFunction();)} syntax
  • Alternative: Write custom Java functions implementing org.apache.jmeter.functions.Function interface

Q8: JMeter Reusability Best Practices

graph TB
    Reusability[JMeter Reusability] --> Config[Configuration Reuse]
    Reusability --> Modular[Modularization]
    Reusability --> Scripting[Custom Scripting]
    
    Config --> C1[CSV Data Set Config<br/>External Test Data]
    Config --> C2[User Defined Variables<br/>Centralized Settings]
    Config --> C3[HTTP Request Defaults<br/>Common Parameters]
    Config --> C4[Property Files<br/>Environment Config]
    
    Modular --> M1[Module Controller<br/>Reusable Test Fragments]
    Modular --> M2[Test Fragment<br/>Shared Login Logic]
    Modular --> M3[Include Controller<br/>External Test Plans]
    
    Scripting --> S1[BeanShell Functions<br/>Custom Utilities]
    Scripting --> S2[JSR223 Sampler<br/>Groovy Scripts]
    Scripting --> S3[Function Helper<br/>Reusable Functions]
    
    style Reusability fill:#FF9900
    style Config fill:#4CAF50
    style Modular fill:#2196F3

Reusability Strategies:

  • CSV Data Set Config: Externalize test data for easy modification without changing scripts
  • User Defined Variables: Centralize configuration (URLs, credentials) for environment switching
  • Module Controller: Create reusable test fragments (login, logout) invoked from multiple tests
  • BeanShell Functions: Write custom functions once, reuse across multiple test plans
  • Test Fragments: Define shared logic (authentication, common workflows) referenced by multiple thread groups
  • Avoid hardcoding values—use variables and properties for flexibility