Chapter 03Lesson 04~125 minutes

Test Plan Tree, Scope, Execution Order, and Component Semantics: Diagnostics, Failure Modes, and Production Practices

A bad tree can create a believable but false performance story. Diagnose scope and execution semantics before blaming the target, increasing heap, changing workload, or deleting failed artifacts.

Mis-scopeDiagnosticsTransaction samplesListenersValidity

Learning objectives

  • Reject the assumption that visual top-to-bottom order governs all element types.
  • Diagnose timer and assertion scope faults from JMX/JTL/target evidence.
  • Recognize overlapping configuration managers and broad unintended effects.
  • Distinguish controller-generated SampleResults from protocol requests.
  • Identify heavy listeners as generator overhead rather than target latency.
  • Repair the smallest tree layer and rerun the smallest controlled workload.

1. Diagnostic safety boundary

All reruns remain at http://127.0.0.1:8000, one thread × one loop. A scope problem is not fixed by increasing traffic or trying a public target. Preserve failed JMX/JTL/jmeter.log/fixture counters first.

2. Diagnostic sequence

Scope-first diagnostic workflow

Read the arrows as execution and scope relationships, not decorative visual ordering.

flowchart TD
E[Preserve JMX + JTL + jmeter.log + target counters] --> V[Confirm Java/JMeter versions]
V --> I[Confirm exact CLI/properties/data + authorized target]
I --> T[Map ordered samplers + hierarchical scope]
T --> R[Inspect variables/headers/assertion results]
R --> P[Inspect protocol/session/data]
P --> G[Inspect generator JVM/OS/network/listener cost]
G --> S[Inspect SUT telemetry]
S --> X[Distributed/CI/container layer if relevant]
X --> F[Smallest correction]
F --> N[New artifact directory + smallest rerun]

3. Failure mode: visual order equals execution order

Simple Controller
├── Post-Processor
├── Alpha
├── Beta
├── Constant Timer
├── Response Assertion
└── Pre-Processor

The Post-Processor does not run before Alpha because it is drawn first. For each applicable sampler, JMeter processes element types by phase: configuration, pre-processing, timers, sampler, post-processing, assertions, listeners.

4. Failure mode: broad timer blamed as server latency

A Constant Timer sits at Thread Group scope when only Alpha should pause. Every applicable sampler is delayed, iteration time increases, and achieved throughput can fall. If sampler elapsed stays near the local fixture's response time while request-start gaps expand, the timer is the causal change—not server latency.

5. Failure mode: broad assertion fails the wrong request

An assertion expecting "path": "/alpha" is placed under a controller containing Alpha and Beta. Alpha passes; Beta returns a correct Beta response but fails the Alpha-specific rule. The least destructive correction is to move that assertion under Alpha, not weaken it until both pass.

6. Intentionally broken example: narrow header, broad assertion

Use the Lesson 2 header-narrow tree: Alpha has the Header Manager, Beta does not, but the controller-level assertion requires scope_header=broad for both.

  • Fixture: Alpha 1, Beta 1.
  • Alpha echoes broad and succeeds.
  • Beta echoes <missing> and fails the assertion.
  • jmeter.log should not show an engine-startup failure; this is a planned correctness failure.

If both requests should have the header, restore broad Header Manager scope. If only Alpha should have it, narrow the assertion too. Intent determines the repair.

7. Failure mode: duplicate configuration managers

Current Header Manager merging can be deliberate, but accidental duplicate ownership is dangerous. Two managers may both set X-Lab-Scope; a later tree edit can alter which value wins. Name broad and override managers clearly, and do not assume Cookie/Authorization/Defaults elements follow Header Manager semantics.

8. Failure mode: controller sample counted as a network request

A Transaction Controller can generate an additional SampleResult for nested work. If the fixture received two HTTP requests but JTL also contains a transaction label, the transaction result is measurement structure—not a third target call. Cross-check result labels with server counters.

9. Failure mode: heavy listeners remain enabled under load

View Results Tree can retain/render detailed results. Under meaningful load this consumes injector CPU/memory and can reduce achieved load. Preserve the tiny GUI debug run, disable heavy listeners/Debug Sampler in the load profile, rerun the same workload from CLI, and measure generator headroom.

10. Causal separation

Observed symptom Possible tree cause Other possible cause Evidence
Long gap between starts Timer/pacing in scope Closed-loop response time or scheduling JTL timestamps + tree.
High sampler elapsed Not a pre-sampler timer Network/target/connect/generator stall JTL elapsed + telemetry.
Unexpected failure Broad/wrong assertion Protocol/target error Assertion message + response + tree.
Extra result label Transaction/Debug sample Real extra request only if target count rises JTL labels + fixture counters.
Lower throughput Broad timers/heavy listeners Target saturation or injector limit Tree + JTL rate + resources.

11. Preserve first-failure provenance

Use immutable run directories such as results/broad-ok, results/header-mis-scoped, and results/restored. Never overwrite the red run with the green rerun; the failed artifact is evidence for the diagnosis.

12. Shortcuts to reject

  • Do not add retries/sleeps to hide assertion or scope failures.
  • Do not increase heap without heap evidence.
  • Do not move every element to Thread Group scope merely to “make it apply.”
  • Do not disable TLS/RMI/security controls for unrelated diagnosis.
  • Do not delete JTL/logs after a green rerun.
  • Do not increase threads to reproduce a semantic bug already visible at one thread.

Knowledge check

Why can Beta fail even when its HTTP response is correct?

A Transaction Controller adds a result label but fixture request count is unchanged. What happened?

Why can View Results Tree reduce achieved load?

Two Header Managers set the same header. Is that automatically invalid?

What is the smallest repair for an Alpha-only assertion at controller scope?

Next lesson

Checkpoint: prove scope with a controlled failure

Lesson 5 records a baseline, deliberately narrows the Header Manager while leaving the assertion broad, diagnoses Beta's planned failure, restores the tree, and produces before/broken/after evidence.

Official references and version notes

  • Elements of a Test Plan — execution order, scoping rules, variables/properties, timers, assertions, configuration elements, processors, listeners, controllers, and samplers.
  • Component Reference — Header Manager, Constant Timer, Response Assertion, Regular Expression Extractor, Debug Sampler, Transaction Controller, and listeners.
  • Functions and Variables — sampler-context functions and variable semantics.
  • Hints and Tips — current quick-add bindings for common debug elements.
  • Getting Started and Best Practices — GUI authoring versus CLI load execution and lean result collection.
  • Apache JMeter downloads — current production release and Java requirement.
Version and compatibility note

Version-sensitive statements were rechecked against current Apache JMeter primary documentation on 2026-09-04. The baseline is Apache JMeter 5.6.3 with a Java 17 JDK for labs and no third-party plugins; JMeter 5.6.3 itself requires Java 8+. The current Test Plan manual defines applicable execution order as Configuration Elements → Pre-Processors → Timers → Sampler → Post-Processors → Assertions → Listeners. Controllers and samplers are primarily ordered; listeners, configuration elements, pre/post-processors, assertions, and timers are hierarchical/scoped. Mandatory traffic is restricted to http://127.0.0.1:8000, one thread and one loop. Debug Sampler/View Results Tree are bounded GUI diagnostics only; CLI remains the load-evidence path.

Keep the academy open

Support free, practical DevOps education.

Every lesson is designed to remain readable in a browser, downloadable from GitHub, and usable without a paid learning platform. Contributions help expand and maintain the curriculum.

Ethereum / ERC-20
0x716c4Ab160C4B66F31a28AE2448BfF68fc3a2ef0 Send only Ethereum/ERC-20 compatible assets to this address.