Skip to content

JMX Linter & Test Plan Health Analyzer

Lint JMeter JMX files in your browser, find load-testing anti-patterns, calculate a health score, and inspect test plan structure without uploading your plan.

Difficulty
intermediate
Guide type
reference
Estimated read time
5 min read
Presets:
Maximum file size: 5 MB
Health Score-
Errors-
Warnings-
Enabled Standard Threads (No Plugins)-

Findings

Test Plan Inventory

ElementCountElementCount

Add this analyzer to your AI agent (MCP)

Claude Code, Cursor, Windsurf, and other agents can call lint_jmx_snippet directly:

claude mcp add jmeter-docs https://docs.jmeter.ai/api/mcp --transport http

All analysis runs locally in your browser. Rules are heuristics, not a replacement for executing and reviewing your plan. See JMeter Best Practices and JMeter MCP Reference.

The linter starts at 100 points and subtracts 25 points per error, 10 points per warning, and 5 points per informational finding, with a floor of zero. The score is a fast review signal, not proof that a test plan is valid or safe to run. The analyzer uses deterministic browser-side heuristics and does not execute the plan.

Rule IDSeverityWhat it catchesRecommended fix
ACTIVE_GUI_LISTENERErrorEnabled View Results Tree, table, graph, or aggregate GUI listenersDisable GUI listeners and write JTL results or use a Backend Listener during load runs
LEGACY_BEANSHELLErrorEnabled BeanShell samplers, processors, assertions, timers, or listenersReplace with cached JSR223 elements using Groovy
JSR223_NO_CACHEWarningActive JSR223 elements with an absent, empty, or false cache keyEnable Cache compiled script if available
JSR223_NON_GROOVY_LANGUAGEWarningActive JSR223 scripts using a language other than GroovySelect Groovy to use compilation caching and the supported JMeter scripting path
THREAD_SLEEP_IN_SCRIPTErrorThread.sleep() inside active JSR223 scriptsModel waits with JMeter Timers or Flow Control Action
ZERO_RAMP_UP_HIGH_CONCURRENCYWarningAt least 50 threads launched in zero or one secondAdd a gradual ramp-up or use Concurrency Thread Group
MISSING_HTTP_TIMEOUTSWarningHTTP plans without positive connect and response timeoutsSet both values in HTTP Request Defaults
JAVA_HTTP_IMPLEMENTATIONWarningThe legacy Java HTTP implementationUse HttpClient4 or leave the implementation blank

The inventory summarizes thread groups, samplers, scripts, listeners, assertions, timers, controllers, configuration elements, processors, and disabled elements. It also identifies common shared configuration such as HTTP Request Defaults, CSV Data Set Config, Header Manager, Cookie Manager, Cache Manager, and Backend Listener. Total Threads sums enabled standard ThreadGroup, SetupThreadGroup, and PostThreadGroup elements only; plugin groups such as Concurrency Thread Group are excluded. Thread-group details expose static thread counts, ramp-up, loops, and scheduler duration; property expressions such as ${threads} are intentionally reported as unknown rather than guessed.

Plugin class names beginning with kg.apc. or com.blazemeter. are listed so you can confirm that every load generator has the required plugin JARs.

After fixing findings, validate the plan with JMeter and run load tests outside the GUI:

Terminal window
jmeter -n -t test-plan.jmx -l results.jtl -e -o report/

A clean lint score does not replace a one-user smoke run, response assertions, realistic test data, or monitoring the system under test.

Connect an MCP-compatible agent:

Terminal window
claude mcp add jmeter-docs https://docs.jmeter.ai/api/mcp --transport http

The agent can call lint_jmx_snippet with a JMX snippet or full test plan and return the same findings, score, and remediation guidance.

On this page