Skip to content

Executors

When you upload a script instead of using a scriptless builder, MaxoPerf runs it through one of many underlying load-testing and browser-automation tools. This page lists every supported executor, meaning every engine MaxoPerf can run a test with.

MaxoPerf detects the executor from the file you upload. A .jmx is JMeter, a k6 .js/.ts is k6, a Taurus YAML’s executor: field names its own executor, and so on. You never pick the executor from a dropdown. Upload the right file, and MaxoPerf infers the executor and validates the scenario against its rules.

Scenario and files: MaxoPerf shows the detected executor as a badge once it recognizes the uploaded file. There is no manual executor picker.

packages/test-config/src/detect-taurus-executors.ts (SUPPORTED_TAURUS_EXECUTORS) defines the authoritative executor list. It is the single source of truth for the database engine-kind enum, the Platform API DTOs, and this page. When MaxoPerf validates your upload, it checks the executor value against this same list.

ExecutorUnderlying toolEntrypoint file kindSupport levelNotes
taurusTaurus native HTTP runner.yaml / .yml (no executor: key, or executor: taurus)First-classThe default when no executor: is set. Handles HTTP requests itself, with no separate engine. Good for simple HTTP load with a single declarative YAML.
jmeterApache JMeter.jmx (referenced by scenarios.*.script) or direct .jmx uploadFirst-classThe most widely used executor. Upload your .jmx directly or reference it from a YAML. MaxoPerf validates JMX well-formedness and thread-group presence.
k6Grafana k6.js / .ts k6 scriptFirst-classFull k6 support via direct upload or a YAML reference. Your k6 script is the entrypoint.
seleniumSelenium WebDriver.py script or Selenium IDE .side fileFirst-classReal-browser tests (see Browser tests). Gets full video, step timeline, HAR, and console capture on Chrome/Chromium.
playwrightPlaywright.js / .ts / .mjs / .cjs / .mts / .cts Playwright spec or library script (any file name), uploaded directly or referenced by scenarios.*.script with executor: playwrightFirst-classReal-browser tests on Chrome, Edge and Firefox, one or several per test. MaxoPerf tells it apart from other JavaScript executors by file content as well as extension. An uploaded playwright.config.* is wrapped, not replaced. Uses the same capture pipeline as Selenium tests (see Playwright tests).
gatlingGatling (Scala).scala simulation fileSupportedPoint scenarios.*.script at a Gatling Scala simulation. Runs through the Gatling execution path; configure Gatling-specific settings in the YAML rather than a dedicated console UI.
locustLocust (Python)locustfile.py or any .py with from locust importSupportedManages Locust’s master/worker topology and metrics collection. Upload locustfile.py as a test asset and reference it from the YAML.
apiritifApiritif (Python HTTP client).py Apiritif scriptSupportedPython-native HTTP client framework with a recorder. Good for teams that prefer Python over YAML or JavaScript. Pure HTTP, not a browser executor.
wdioWebdriverIO.js / .ts WebdriverIO specSupportedBrowser automation through the WebdriverIO JavaScript API. Coverage is similar to Selenium, without the dedicated capture pipeline.
robotRobot Framework.robot keyword-driven testSupportedRuns Robot Framework keyword-driven tests as load. Good for teams already invested in Robot Framework.
siegeSiegeURL-list file or inline URLsSupportedSimple multi-threaded HTTP benchmarking. Effective for quick URL-list hammering; limited scenario expressiveness compared to JMeter or k6.
abApache Benchmark (ab)No file (URLs specified inline in the YAML)SupportedThe classic HTTP microbenchmark. Good for single-endpoint baseline measurements; not suited to multi-step flows.
vegetaVegeta (Go).txt URL-list or inline targetsSupportedHigh-performance HTTP load generator with constant-rate (rate:) attacks. Better rate control than ab for sustained throughput tests.
tsungTsung (Erlang)Tsung XML configSupportedDistributed load testing for HTTP, WebSocket, XMPP, and more. Complex setup; use when you need Erlang-based distributed load or XMPP protocol support.
molotovMolotov (Python asyncio).py Molotov scenarioSupportedAsync Python load-testing library. Scenarios are Python functions decorated with @scenario.
grinderThe Grinder.py Grinder script (Jython)SupportedJava-based framework with Jython scripting. Legacy tool; prefer JMeter or k6 for new work.
junitJUnit (Java)Maven pom.xml or JARSupportedRuns Java JUnit load tests. Requires a Maven project structure; better suited to teams with existing JUnit performance tests.
testngTestNG (Java)Maven pom.xml or JARSupportedLike junit, using the TestNG framework. Same considerations apply.
mochaMocha (Node.js).js Mocha test fileSupportedRuns Node.js Mocha tests as load. Prefer k6 for new JavaScript load tests.
pbenchPbench-fio / Pbench toolsPbench configSupportedPerformance benchmarking suite from Red Hat. Niche use case. Use it when you need Pbench’s tooling in particular.
scalableScalable (internal)YAMLSupportedAn internal executor for distributed load-generation scenarios. Rarely needed, because MaxoPerf handles distribution at the runner-fleet level.
externalExternal processAny commandSupportedRuns an arbitrary external process as the load generator. MaxoPerf validates that the command: key is set. Use only when no other executor fits.

Most new MaxoPerf tests should use one of the first-class executors:

  • taurus (native): a single declarative YAML with no external tooling.
  • jmeter: for teams with existing JMX files, or who need JMeter’s plugin ecosystem.
  • k6: for teams that prefer JavaScript and want fast iteration on API load tests.
  • selenium / playwright: for browser tests, see Browser tests.

The other supported executors work well but get less specialized console tooling. If you hit a problem with one of them, MaxoPerf support can help.

execution:
- executor: locust # must be one of the executors listed above
concurrency: 20
hold-for: 5m
scenario: locust-scenario
scenarios:
locust-scenario:
script: locustfile.py # must be uploaded as a Test asset

On the apiritif executor, a request fails when the response status is 400 or higher, the same as in JMeter. The sample is counted as an error, and the run’s Errors tab groups it under Client errors (4xx) or Server errors (5xx).

If you assert on the status yourself (an assert with subject: http-code, on a request, the scenario, or an included scenario), your assertion decides and the automatic check is off for every request in that scenario, not only the request you assert on. To expect an error status without an assertion, switch the automatic check off for the scenario:

scenarios:
expect-errors:
auto-assert-ok: false # 4xx/5xx responses are no longer failures
requests:
- url: https://api.example.com/legacy