Variable Usage
Overview
Variables are a powerful feature of the JMeter DSL Framework that allow you to make your tests more flexible, reusable, and maintainable. This guide demonstrates various ways to use variables effectively in your test configurations.
Variable Levels
The framework supports variables at four levels, each with its own scope and precedence:
graph TD
A[Global Variables] --> B[Execution Variables]
B --> C[Scenario Variables]
C --> D[Request Variables]
style A fill:#d4f0fd,stroke:#333,stroke-width:1px
style B fill:#c9e7ff,stroke:#333,stroke-width:1px
style C fill:#c0dafd,stroke:#333,stroke-width:1px
style D fill:#b3cbff,stroke:#333,stroke-width:1px
Example Configuration
Here's a comprehensive example that demonstrates variable usage at all levels:
name: Variable Usage Example
description: Demonstrates various ways to use variables
# Global variables - available to all scenarios and requests
variables:
baseUrl: https://jsonplaceholder.typicode.com
apiVersion: ""
contentType: application/json
execution:
threadCount: 3
iterations: 2
rampUpPeriod: 1
successThreshold: 95.0
# Execution variables - available to all scenarios and requests
variables:
timestamp: ${__time()}
sessionId: "session-${__randomString(8)}"
scenarios:
- name: User API
# Scenario variables - available only to requests in this scenario
variables:
endpoint: /users
defaultLimit: 10
requests:
- name: List Users
endpoint: ${baseUrl}${endpoint}?limit=${defaultLimit}
method: GET
statusCode: 200
headers: headers/common_headers.json
# Request variables - available only to this request
variables:
requestId: "req-users-${__randomString(4)}"
- name: Get User
endpoint: ${baseUrl}${endpoint}/1
method: GET
statusCode: 200
headers: headers/common_headers.json
# Different request variables
variables:
requestId: "req-user-${__randomString(4)}"
userId: 1
- name: Post API
# Different scenario variables
variables:
endpoint: /posts
format: json
requests:
- name: List Posts
endpoint: ${baseUrl}${endpoint}?format=${format}
method: GET
statusCode: 200
headers: headers/common_headers.json
# Request variables
variables:
requestId: "req-posts-${__randomString(4)}"
- name: Get Post
endpoint: ${baseUrl}${endpoint}/1
method: GET
statusCode: 200
headers: headers/common_headers.json
# Request variables
variables:
requestId: "req-post-${__randomString(4)}"
postId: 1
Variable Resolution
Variables are resolved in the following order (highest precedence first):
- Request variables
- Scenario variables
- Execution variables
- Global variables
flowchart TB
A["Request Variables (Highest)"] --> B["Scenario Variables"] --> C["Execution Variables"] --> D["Global Variables (Lowest)"]
This means that if the same variable is defined at multiple levels, the value from the most specific level will be used.
Variable Usage in Headers
Variables can be used in header files:
{
"Content-Type": "${contentType}",
"Accept": "application/json",
"Authorization": "Bearer ${token}",
"X-Request-ID": "${requestId}",
"X-Session-ID": "${sessionId}"
}
Variable Usage in Request Bodies
Variables can be used in request body files:
{
"name": "${userName}",
"email": "${userEmail}",
"timestamp": ${timestamp},
"sessionId": "${sessionId}"
}
Variable Usage in Parameters
Variables can be used in parameter files:
Built-in Functions
The framework supports several built-in functions for generating dynamic values:
Time Functions
variables:
currentTime: ${__time()}
formattedTime: ${__timeShift(yyyy-MM-dd'T'HH:mm:ss,0,d)}
futureTime: ${__timeShift(yyyy-MM-dd,7,d)}
Random Functions
variables:
randomNumber: ${__random(1,100)}
randomString: ${__randomString(10)}
randomUUID: ${__randomUUID()}
Examples
Environment-specific Configuration
Use global variables to define environment-specific values:
# Development environment
variables:
baseUrl: https://dev-api.example.com
apiKey: dev-api-key
debug: true
# Production environment
variables:
baseUrl: https://api.example.com
apiKey: prod-api-key
debug: false
Dynamic Data Generation
Use execution variables to generate dynamic data for each test run:
execution:
variables:
timestamp: ${__time()}
traceId: ${__randomUUID()}
correlationId: "corr-${__randomString(10)}"
API Versioning
Use scenario variables to test different API versions:
scenarios:
- name: API v1
variables:
apiVersion: v1
requests:
- name: Get Resource
endpoint: ${baseUrl}/${apiVersion}/resource
method: GET
- name: API v2
variables:
apiVersion: v2
requests:
- name: Get Resource
endpoint: ${baseUrl}/${apiVersion}/resource
method: GET
Request-specific Data
Use request variables for data that's specific to a particular request:
requests:
- name: Create User
endpoint: ${baseUrl}/users
method: POST
variables:
userName: "Test User"
userEmail: "test@example.com"
userAge: 30
body: body/create_user.json
Variable Inheritance Example
Here's a visualization of how variables are inherited and overridden at different levels:
classDiagram
class GlobalVariables {
+baseUrl: "https://jsonplaceholder.typicode.com"
+contentType: "application/json"
}
class ExecutionVariables {
+timestamp: "1620000000000"
+sessionId: "session-abc123"
}
class UserAPIVariables {
+endpoint: "/users"
+defaultLimit: 10
}
class ListUsersVariables {
+requestId: "req-users-1234"
}
class GetUserVariables {
+requestId: "req-user-5678"
+userId: 1
}
GlobalVariables <|-- ExecutionVariables : inherits
ExecutionVariables <|-- UserAPIVariables : inherits
UserAPIVariables <|-- ListUsersVariables : inherits
UserAPIVariables <|-- GetUserVariables : inherits
Best Practices
Variable Naming
- Use descriptive variable names that indicate their purpose
- Follow a consistent naming convention (e.g., camelCase)
- Use prefixes to indicate the variable's domain (e.g.,
user_
,api_
)
Variable Organization
- Define variables at the appropriate level based on their scope
- Avoid duplicating variable definitions at multiple levels
- Group related variables together
Variable Usage
- Use variables for values that may change between environments or test runs
- Use variables for values that are used in multiple places
- Document variables that have special meaning or format requirements
Conclusion
Effective use of variables can significantly enhance the flexibility, reusability, and maintainability of your performance tests. By understanding the variable hierarchy and using variables at the appropriate levels, you can create test configurations that are both powerful and easy to manage.