Learning Notes #76 β Specifying Virtual Users (VUs) and Test duration in K6
When running load tests with K6, two fundamental aspects that shape test execution are the number of Virtual Users (VUs) and the test duration. These parameters help simulate realistic user behavior and measure system performance under different load conditions.
In this blog, i jot down notes on virtual users and test duration in options. Using this we can ramp up users.
- Defining VUs and Duration in K6
- Basic VU and Duration Configuration
- Specifying VUs and Duration from the Command Line
- Ramp Up and Ramp Down with Stages
- Custom Execution Scenarios
- Choosing the Right Configuration
- References
Defining VUs and Duration in K6
K6 offers multiple ways to define VUs and test duration, primarily through options in the test script or the command line.
Basic VU and Duration Configuration
The simplest way to specify VUs and test duration is by setting them in the options
object of your test script.
import http from 'k6/http'; import { sleep } from 'k6'; export const options = { vus: 10, // Number of virtual users duration: '30s', // Duration of the test }; export default function () { http.get('https://test.k6.io/'); sleep(1); }
This script runs a load test with 10 virtual users for 30 seconds, making requests to the specified URL.
Specifying VUs and Duration from the Command Line
You can also set the VUs and duration dynamically using command-line arguments without modifying the script.
k6 run --vus 20 --duration 1m script.js
This command runs the test with 20 virtual users for 1 minute.
Ramp Up and Ramp Down with Stages
Instead of a fixed number of VUs, you can simulate user load variations over time using stages
. This helps to gradually increase or decrease the load on the system.
export const options = { stages: [ { duration: '30s', target: 10 }, // Ramp up to 10 VUs { duration: '1m', target: 50 }, // Ramp up to 50 VUs { duration: '30s', target: 10 }, // Ramp down to 10 VUs { duration: '20s', target: 0 }, // Ramp down to 0 VUs ], };
This test gradually increases the load, sustains it, and then reduces it, simulating real-world traffic patterns.
Custom Execution Scenarios
For more advanced load testing strategies, K6 supports scenarios
, allowing fine-grained control over execution behavior.
Syntax of Custom Execution Scenarios
A scenarios
object defines different execution strategies. Each scenario consists of
- executor: Defines how the test runs (e.g.,
ramping-vus
,constant-arrival-rate
, etc.). - vus: Number of virtual users (for certain executors).
- duration: How long the scenario runs.
- iterations: Total number of iterations per VU (for certain executors).
- stages: Used in
ramping-vus
to define load variations over time. - rate: Defines the number of iterations per time unit in
constant-arrival-rate
. - preAllocatedVUs: Number of VUs reserved for the test.
Different Executors in K6
K6 provides several executors that define how virtual users (VUs) generate load
shared-iterations
β Distributes a fixed number of iterations across multiple VUs.per-vu-iterations
β Each VU runs a specific number of iterations independently.constant-vus
β Maintains a fixed number of VUs for a set duration.ramping-vus
β Increases or decreases the number of VUs over time.constant-arrival-rate
β Ensures a constant number of requests per time unit, independent of VUs.ramping-arrival-rate
β Gradually increases or decreases the request rate over time.externally-controlled
β Allows dynamic control of VUs via an external API.
Example: Ramping VUs Scenario
export const options = { scenarios: { ramping_users: { executor: 'ramping-vus', startVUs: 0, stages: [ { duration: '30s', target: 20 }, { duration: '1m', target: 100 }, { duration: '30s', target: 0 }, ], }, }, }; export default function () { http.get('https://test-api.example.com'); sleep(1); }
Example: Constant Arrival Rate Scenario
export const options = { scenarios: { constant_request_rate: { executor: 'constant-arrival-rate', rate: 50, // 50 iterations per second timeUnit: '1s', // Per second duration: '1m', // Test duration preAllocatedVUs: 20, // Number of VUs to allocate }, }, }; export default function () { http.get('https://test-api.example.com'); sleep(1); }
Example: Per VU Iteration Scenario
export const options = { scenarios: { per_vu_iterations: { executor: 'per-vu-iterations', vus: 10, iterations: 50, // Each VU executes 50 iterations maxDuration: '1m', }, }, }; export default function () { http.get('https://test-api.example.com'); sleep(1); }
Choosing the Right Configuration
- Use fixed VUs and duration for simple, constant load testing.
- Use stages for ramping up and down load gradually.
- Use scenarios for more complex and controlled testing setups.
References
- Scenarios & Executors β https://grafana.com/docs/k6/latest/using-k6/scenarios/