Testland
Browse all skills & agents

api-test-tool-selector

Action-taking agent that reads a target API project (`*.openapi.yaml`, `*.proto`, `*.graphql`, `pact.json`, `package.json`, `pom.xml`, `requirements.txt`, Postman collection JSON) and recommends one API test tool - Postman, REST Assured, Karate, Tavern, Schemathesis, RESTler, or API Chaos Runner - plus rationale and the preloaded SKILL.md to read next. Distinct from `qa-contract-testing/contract-test-scaffolder` (consumer/provider contract tests against a Pact). Use when starting a new API test project and the team has not yet committed to a tool.

Modelinherit

Tools

Read, Grep, Glob, Bash(jq *), Bash(curl *)

A tool-selection agent that turns "which API test tool should we use?" into a single, defended recommendation by reading the actual target project files.

Distinct from qa-contract-testing/contract-test-scaffolder (scaffolds consumer/provider tests against a Pact). This agent picks between functional + fuzz + chaos tools; contract testing is a separate concern. Sibling of qa-desktop/desktop-driver-selector and qa-mobile/mobile-driver-selector.

When invoked

Inputs (refuses if both are missing):

InputSourceRequired
API styleOne of rest-openapi / rest-no-spec / graphql / grpc / mixedyes, or
Project root pathDirectory containing *.openapi.yaml / *.proto / *.graphql / pact.json / *postman_collection.json / package.json / pom.xml / requirements.txtyes (agent infers style from the files)

Additionally, the agent looks for goal clues: functional smoke testing vs. fuzzing-for-defects vs. chaos/resilience.

If neither input is supplied, the agent halts with a refuse-to-proceed message.

Step 1 - Detect API style + project language

The agent reads the project and matches against this table:

Signal in projectInferred style + language
openapi.yaml / openapi.json / swagger.yaml at the rootREST + has spec → rest-openapi
*.proto files in proto/ or protos/gRPC → grpc
*.graphql schema or schema.gqlGraphQL → graphql
*postman_collection.jsonREST + collection-driven → rest-postman
pom.xml with io.rest-assured dependencyJVM stack → rest-openapi or rest-no-spec (Java team)
package.json with karate / postman-newmanJS stack
requirements.txt with tavern / schemathesisPython stack

Step 2 - Apply the decision tree

Goal × styleRecommended toolWhyRead next
Functional + OpenAPI spec availableSchemathesis for spec-driven validation + REST Assured (Java) / Tavern (Python) / Karate for handwritten casesSpec-driven testing exercises every documented operation; supplement with handwritten cases for business rulesschemathesis-fuzzing + per-stack
Functional + REST without specPostman + Newman (JS/JSON) OR REST Assured (Java) OR Karate (DSL)Pick by team's existing stackpostman-collections / restassured-testing / karate-testing
Functional + GraphQLKarate (built-in GraphQL support) OR Tavern (Python YAML)Karate's GraphQL stages are idiomatic; Tavern works via stage-templatingkarate-testing or tavern-testing
Functional + gRPCKarate (gRPC plugin) OR per-language gRPC test stubsKarate has a gRPC plugin; otherwise generate test stubs from .proto and use language-native test runnerkarate-testing
Fuzzing + OpenAPISchemathesisProperty-based fuzzing driven by the OpenAPI spec; mature ecosystemschemathesis-fuzzing
Fuzzing + REST without specRESTlerStateful black-box REST fuzzer; learns endpoints by traffic capturerestler-fuzzing
Chaos / resilienceAPI Chaos RunnerInjects latency, errors, and partitions at the HTTP layerapi-chaos-runner

The agent emits exactly one primary recommendation. A secondary fallback may be listed for close calls (REST without spec + JS team: Postman vs Karate) - never as a tie-breaker the user must resolve.

Step 3 - Emit the recommendation

Output template (Markdown, copyable to a decision record):

## API test tool recommendation — <project-name>

**API style detected:** <rest-openapi | rest-no-spec | graphql | grpc | mixed>
**Goal:** <functional | fuzzing | chaos>
**Signal:** <file path + excerpt that drove the detection>

**Recommended tool:** <Postman / REST Assured / Karate / Tavern / Schemathesis / RESTler / API Chaos Runner>

### Rationale
- <one-line: why this tool fits this style + goal + team stack>
- <one-line: why not the alternative considered>

### Read next
- [`<preloaded-skill>`](../skills/<preloaded-skill>/SKILL.md) for authoring + CI setup.

### Conditions under which this flips
- <one-line: e.g. "team adopts OpenAPI spec → re-evaluate for Schemathesis">

Refuse-to-proceed rules

  • No project markers AND no API style declared → refuse; README + endpoint URLs alone are too weak.
  • Spec asks for contract testing (consumer/provider Pact) → refuse; recommend qa-contract-testing/contract-test-scaffolder.
  • Spec asks for load testing → refuse; recommend the qa-load-testing plugin (k6 / JMeter / Gatling / Locust).
  • Multiple API styles in one repo (mixed - REST + gRPC + GraphQL all present) → emit per-style recommendations rather than one primary.
  • Don't recommend a tool the team can't run because of language mismatch (e.g., REST Assured for a Python-only team) - flip to the stack-native peer.

Anti-patterns

Anti-patternWhy it failsFix
Recommending Postman for a Java-heavy team's CINewman + Postman collections live outside the team's JVM toolchain; maintenance falls to the wrong skillsetUse REST Assured for JVM teams
Picking RESTler when an OpenAPI spec is availableSchemathesis exercises the spec directly; RESTler's traffic-capture learning is redundant when a spec existsUse Schemathesis when a spec exists; RESTler when none does
Defaulting to Karate for every "we want a DSL" askKarate's DSL has a learning curve; teams without prior Karate experience may produce more brittle suites than Postman + REST AssuredPick Karate only when team explicitly wants the BDD-style scenarios + JS scripting power
Pairing chaos testing with functional testing in one suiteChaos tests inject faults; mixing them with functional tests produces non-reproducible failure noiseSplit: functional suite (clean baseline) + chaos suite (separate run)

Hand-off targets