intermediate By Mathias Paulenko

Load Test Execution Plan Template

A template to plan, execute, and document load tests that measure system behavior under realistic or peak traffic.

Note: This guide follows English-language naming conventions and terminology standards common in international development teams. Examples use English identifiers and comments to maximize compatibility across codebases and tooling.

Overview

Load testing evaluates how a system behaves under realistic or peak traffic. This template helps teams define test goals, select scenarios, prepare environments, execute tests, and document results. It ensures that performance work is repeatable and tied to clear success criteria.

When to Use

  • For alternatives, see Logging, Monitoring & Observability Guide.

  • Before a major product launch or marketing campaign.

  • After major architecture or infrastructure changes.

  • When scaling targets or user growth projections change.

  • When latency or error rate issues appear under load.

  • As part of a regular performance regression test suite.

  • Before capacity planning or cost optimization work.

Prerequisites

  • A production-like test environment that mirrors topology and data.
  • Load testing tools such as k6, JMeter, Gatling, or Locust.
  • Monitoring and observability for the system under test.
  • Baseline metrics from normal production traffic.
  • Clear ownership and a scheduled test window.
  • A rollback or scaling plan if the test reveals problems.

Solution

Template

1. Test Goals and Scope

FieldDescriptionExample
Test IDUnique identifierLT-2026-Q3-001
System under testApplication or serviceCheckout API
Test dateWhen the test runs2026-06-27
Test ownerResponsible engineerPerformance team
StakeholdersTeams to notifySRE, backend, platform, product
GoalWhy the test is runValidate checkout handles 10x traffic at launch
ScopeWhat is includedAPI endpoints, database, cache, queue
Out of scopeWhat is not testedPayment processor, third-party integrations

2. Test Scenarios

Scenario IDDescriptionEndpoint / FlowVirtual UsersRamp UpDurationThink Time
S01Browse catalogGET /products5002 min10 min1-3 s
S02Add to cartPOST /cart/items3002 min10 min1-3 s
S03CheckoutPOST /orders2002 min10 min2-5 s
S04SearchGET /search?q=...4002 min10 min1-2 s
S05Peak burstAll endpoints combined20005 min15 min0-1 s

3. Success Criteria

MetricBaselineTargetMust Stay BelowNotes
p50 latency45 ms< 60 ms80 msFor API responses
p95 latency120 ms< 150 ms200 msFor API responses
p99 latency300 ms< 400 ms600 msFor API responses
Error rate0.01%< 0.1%0.5%HTTP 5xx and timeouts
Throughput1000 RPS> 2000 RPS-Orders per second
CPU utilization40%< 70%80%Per application node
Memory utilization50%< 70%85%Per application node
Database connections80< 150200Active connections
Queue depth10< 50100Background jobs

4. Environment Setup

Resourcedev/testproductionNotes
Application nodes26Same instance size
Load balancer12Same configuration
DatabaseSingle instanceMulti-AZ clusterSame major version
Cache1 node3 nodesSame engine version
Message queue1 node3 nodesSame configuration
Load generator4 injectorsN/ACloud instances or containers
NetworkIsolated VPCProduction VPCMirror latency and topology
Data volume10% of productionFull productionUse anonymized data

5. Execution Plan

StepActionOwnerTime
1Verify environment and monitoringSRET-30 min
2Reset environment to known stateSRET-20 min
3Deploy test scripts and dataPerformance teamT-15 min
4Run baseline test at low loadPerformance teamT-10 min
5Execute scenario S01-S04Performance teamT0
6Execute peak scenario S05Performance teamT+15 min
7Monitor system and collect metricsSRET+15 to T+30 min
8Gradually reduce load and stop testPerformance teamT+30 min
9Export results and logsPerformance teamT+35 min
10Restore environmentSRET+45 min

6. Results and Analysis

ScenarioMax VUsPeak RPSp95 Latencyp99 LatencyError RateCPU AvgMemory AvgResult
S01500120055 ms180 ms0.01%45%60%Pass
S0230080090 ms250 ms0.02%55%65%Pass
S03200450140 ms380 ms0.05%60%70%Pass
S0440095070 ms210 ms0.01%50%62%Pass
S0520003400220 ms700 ms0.8%85%88%Fail

7. Findings and Remediation

Finding IDDescriptionSeverityRecommendationOwnerDue Date
LT-001Database connection pool exhausted during peakHighIncrease pool size and add connection retryBackend team2026-07-04
LT-002Cache hit ratio drops under search loadMediumAdd search result caching and tune TTLBackend team2026-07-11
LT-003Queue depth grows when order rate exceeds consumer capacityMediumScale background workers horizontallyPlatform team2026-07-11

Explanation

Load testing is not just about finding the breaking point. It is about understanding how a system degrades, where the bottlenecks are, and whether the current capacity meets user and business expectations. A documented execution plan makes performance testing repeatable, comparable across releases, and useful for engineering teams.

k6 Load Test Script Example

import http from 'k6/http';
import { check, sleep } from 'k6';
import { Rate } from 'k6/metrics';

const failureRate = new Rate('check_failure_rate');

export const options = {
  stages: [
    { duration: '2m', target: 100 },
    { duration: '5m', target: 100 },
    { duration: '2m', target: 300 },
    { duration: '5m', target: 300 },
    { duration: '2m', target: 500 },
    { duration: '5m', target: 500 },
    { duration: '2m', target: 2000 },
    { duration: '5m', target: 2000 },
    { duration: '5m', target: 0 },
  ],
  thresholds: {
    http_req_duration: ['p(95)<500', 'p(99)<1000'],
    http_req_failed: ['rate<0.01'],
    check_failure_rate: ['rate<0.05'],
  },
};

export default function () {
  const correlationId = `corr_${__VU}_${__ITER}`;
  const headers = {
    'X-Correlation-Id': correlationId,
    'Content-Type': 'application/json',
  };

  const loginRes = http.post('https://api.example.com/auth/login', JSON.stringify({
    username: `user_${__VU % 100}`,
    password: 'test-password',
  }), { headers });

  check(loginRes, {
    'login status 200': (r) => r.status === 200,
    'login has token': (r) => r.json('token') !== undefined,
  });

  failureRate.add(!check(loginRes, {
    'login success': (r) => r.status === 200,
  }));

  sleep(Math.random() * 2 + 1);

  const listRes = http.get('https://api.example.com/orders', {
    headers: { ...headers, Authorization: `Bearer ${loginRes.json('token')}` },
  });

  check(listRes, {
    'orders status 200': (r) => r.status === 200,
    'orders has items': (r) => r.json('items').length > 0,
  });

  sleep(Math.random() * 3 + 1);
}

Variants

  • Spike test plan: Focus on sudden traffic bursts and recovery behavior.
  • Stress test plan: Push the system beyond expected limits to find failure modes.
  • Endurance test plan: Run moderate load for hours or days to detect memory leaks or drift.
  • Soak test plan: Long-running test at production-like load to validate stability.
  • Scalability test plan: Increase load while adding resources to measure scaling efficiency.
  • Browser-based load test plan: Use real browser sessions to measure frontend and API performance together.

What Works

  • Test in a production-like environment with representative data and traffic patterns.
  • Define success criteria before running the test.
  • Start with a baseline and increase load gradually.
  • Monitor both application metrics and infrastructure metrics.
  • Run tests multiple times to confirm reproducibility.
  • Include business metrics such as conversion rate or transaction throughput.
  • Document findings and assign owners before closing the test.
  • Automate regression tests in CI/CD for critical paths.
  • Coordinate with the team to avoid impacting production or shared environments.

Common Mistakes

  • Running load tests directly against production.
  • Using synthetic traffic that does not match real user behavior.
  • Testing only one endpoint instead of the full user journey.
  • Ignoring cold start, cache warm-up, or database seeding effects.
  • Not involving the platform or SRE team during execution.
  • Setting success criteria that are too lenient or undefined.
  • Running tests once and never repeating them after changes.
  • Failing to correlate infrastructure metrics with application latency.

Troubleshooting

  • Largest Contentful Paint is high: optimize images, preload critical resources, and reduce server response time.
  • JavaScript bundle size grows: analyze the bundle, split code by route, and tree-shake unused dependencies. Lazy-load non-critical components.
  • Cache hit rate is low: review cache keys, TTLs, and invalidation patterns.
  • Database CPU spikes: find the top queries by execution time and frequency. Add indexes, rewrite queries, or cache results.
  • Throughput drops under load: profile for contention, garbage collection, and blocked threads. Scale horizontally only after optimizing the hot path.

Further Reading

  • Official documentation: check the current reference for the framework or tool used.
  • Related guides: explore the load-testing and performance guides for deeper coverage.
  • Complementary patterns: review design patterns applicable to your technology stack.
  • Public postmortems: study real incidents from teams that faced similar production issues.

Production Notes

  • Deploy gradually using canary or blue-green to catch regressions early.
  • Configure alerts for error rate, p99 latency, and failure rate before enabling in production.
  • Document the rollback in the runbook; test the procedure in staging at least once per quarter.
  • Review structured logs with correlation IDs to trace requests end-to-end during incidents.

Key Takeaways

  • Apply load test execution plan template when you need a practical solution for your use case.
  • Monitor performance after implementation; measure latency, errors, and resource usage before and after.
  • Check the Troubleshooting section for common failures; most have documented root causes with fixes.
  • Keep dependencies updated and run tests in CI to prevent production regressions.

Common Production Pitfalls

  • Leaving required fields blank or using vague one-word answers.
  • Filling the document once and never updating it after scope or decisions change.
  • Storing the document where the team does not look during incidents or reviews.
  • Not assigning an owner, due date, or review cadence.
  • Copying boilerplate without removing sections that do not apply.
  • Skipping version control, which makes rollback and accountability impossible.
  • Failing to link the document to related decisions or follow-up actions.
  • Avoiding quarterly reviews that would retire stale or unused sections.

Frequently Asked Questions

What tools are commonly used for load testing?
Popular tools include k6, Apache JMeter, Gatling, Locust, and Artillery. The choice depends on protocol support, scripting language, and reporting needs.
How do we simulate realistic user behavior?
Use production logs to model request patterns, add think time between requests, vary data inputs, and include a mix of read and write operations.
Should we run load tests in production?
Production load tests are risky and usually only done with synthetic traffic, feature flags, and isolation. Prefer dedicated production-like environments for most load testing.
How do we correlate load test results with infrastructure metrics?
During the test, capture infrastructure metrics (CPU, memory, network, disk I/O) alongside application metrics (RPS, latency, error rate). Use a dashboard that overlays load test events with...
What is the difference between spike, stress, and endurance testing?
Spike testing: sudden, extreme increase in traffic (e.g., 10x normal for 30 seconds) to test if the system survives and recovers. Stress testing: gradually increase load until the system breaks, to...
How do we handle load testing for stateful services?
Stateful services (databases, message queues, caches) require special load testing considerations. Use realistic data volumes — testing with 100 rows when production has 10 million hides performance...
What should we do if the load test fails?
If the load test fails: do not immediately re-run — analyze the failure first. Identify which scenario failed and which threshold was breached. Check infrastructure metrics for the bottleneck. Review...
How often should we run load tests?
Run full load tests before every major release (monthly or quarterly). Run regression load tests in CI for critical paths (every PR or daily). Run endurance tests quarterly to detect memory leaks....