Skip to content

Software Testing & QA Tools

Postman

Postman is a desktop and web application for sending HTTP requests by hand, organizing them into reusable collections, and layering automated checks on top with JavaScript test scripts. It started in 2012 as a simple Chrome extension for poking at REST endpoints and has since grown into a much larger platform: collections, environments, mock servers, a command-line runner (Newman), and cloud-synced team workspaces. Most developers reach for it first when exploring an unfamiliar API or debugging a request by hand, before any automated test exists.

Why it matters

It's most teams' default for manually exploring and debugging an API
Before writing a single automated test, most developers reach for Postman (or a similar client) to poke at an endpoint and see what a response actually looks like, rather than reading documentation alone.
Collections turn one-off requests into something a whole team can reuse
A folder of related requests, saved with real values and organized by feature, replaces everyone re-typing the same curl command from memory or an outdated wiki page.
Built-in JavaScript scripting adds real automated checks on top of manual requests
The pm.test/pm.expect API lets you assert on a response's status, body, and headers directly inside the request that produced them, without a separate test file.
Newman lets the same collection run headlessly in CI
A collection built and debugged interactively in the GUI can be exported and run from the command line inside a pipeline, so manual exploration and automated regression checks share one source of truth.
Auto-generated docs lower the cost of sharing an API's shape with a team
Publishing a collection produces a browsable reference of every endpoint, its parameters, and example responses, without a separate documentation tool.

Requests, collections, and environments

A request in Postman is built through the UI: method, URL, query params, headers, body, and auth are set in dedicated tabs rather than typed as flags the way they would be in curl. Requests are saved into a collection, a folder tree that groups related endpoints, and a collection can reference variables such as {{baseUrl}} or {{authToken}} that come from an environment. Switching from a 'Local' environment to 'Staging' to 'Production' means swapping which variable set is active, not editing every request by hand.

JSON
{
  "name": "Get order",
  "request": {
    "method": "GET",
    "url": "{{baseUrl}}/orders/{{orderId}}",
    "header": [
      { "key": "Authorization", "value": "Bearer {{authToken}}" }
    ]
  }
}

Test scripts: pm.test and chaining requests

Postman runs test scripts in a sandboxed JavaScript environment through the pm.* API. A post-response script can assert on the response with pm.test and Chai-style pm.expect matchers, and it can write a value out of that response into an environment variable with pm.environment.set, which the next request in the collection then reads. This is how a login request's token gets picked up automatically by every request after it, without pasting the token in by hand.

JavaScript
pm.test("Status code is 200", function () {
  pm.response.to.have.status(200);
});

const body = pm.response.json();
pm.environment.set("orderId", body.id);

From the GUI to CI: Collection Runner and Newman

The Collection Runner executes every request in a collection in sequence, optionally iterating over rows of a CSV or JSON data file to run the same requests with different inputs. Newman is Postman's official command-line tool that runs an exported collection the same way, outside the app entirely — which is what makes a collection useful as a regression suite instead of just a scratchpad, since a pipeline can fail a build on a failed Newman run the same way it would on a failed unit test. Postman also now ships a separate, newer Postman CLI, and its current documentation increasingly points there as the default path from an app collection into CI; Postman has said it has no plans to deprecate Newman, but Newman's own release cadence has slowed as that investment shifts.

Shell
newman run orders-api.postman_collection.json \
  --environment staging.postman_environment.json \
  --reporters cli,junit

Where the collection actually lives

Because collections and environments are just JSON, they can be exported and checked into version control like any other file — but the default workflow syncs them to Postman's own cloud instead, which is what makes shared team workspaces and live collaboration work. That's convenient, but it also means request history and saved values leave a laptop and land on a third party's servers unless a team deliberately keeps collections local or uses Postman's Vault feature to keep secret values out of synced storage.

Mistakes people make here

Hardcoding a token or API key into a request instead of an environment variable
It works until that collection gets shared, exported, or synced to a team workspace, at which point the secret goes with it. A variable marked as a secret type, or Postman Vault, keeps the value out of what gets synced or shown to teammates.
Treating a folder of passing manual requests as an automated regression suite
Clicking Send on each request by hand doesn't run on every commit the way a CI-integrated test does. Without wiring the collection into Newman (or an equivalent) as part of a build, the checks catch nothing until someone remembers to click through them again.
Writing test scripts that depend on the request run immediately before them
Chaining requests through environment variables (grab an ID from one response, use it in the next) is convenient, but it means a request run out of order, in isolation, or in parallel fails for reasons that have nothing to do with the API itself.
Assuming everyone on the team is looking at the same environment values
Environments can be edited locally without syncing, depending on settings; two teammates can end up debugging against different base URLs or stale variable values without realizing their environments have drifted apart.
Never exporting collections into version control
A collection is just JSON, but if it only ever lives inside Postman's cloud with no export checked into git, there's no history of who changed a request's assertions or why — the review discipline applied to code doesn't automatically apply to a cloud-synced collection.

Strengths and trade-offs

Where it is strong

  • No code required to build and send a request, which makes it approachable for manual/exploratory testers as well as developers.
  • Collections double as shareable, browsable documentation without a separate docs tool.
  • Broad built-in support for auth flows (OAuth 2.0, AWS Signature, API keys) and protocols beyond plain REST (GraphQL, WebSocket, gRPC), so that logic doesn't have to be written by hand.
  • Newman closes the loop from manual exploration to an automatable, CI-runnable check without switching tools.

The trade-offs

  • Collections are JSON blobs; reviewing a change to one in a pull request is far noisier than reviewing a diff to a code-based test file.
  • The default workflow syncs collections, environments, and history to Postman's cloud, a real consideration for teams with strict data-residency or secrets-handling requirements.
  • Test scripts run in a sandboxed JavaScript environment with a limited API surface — no external libraries, no real module system — so complex, data-driven test logic is more naturally written in an actual test framework.
  • Team collaboration (shared workspaces) requires a paid plan; the free plan is limited to a single user.

Who needs this

Useful to almost anyone who calls an API by hand: backend developers debugging their own endpoints, frontend developers checking a contract before integrating, and manual/QA testers who aren't writing code. Teams that keep all API tests as code in the same repository as the service, run through something like REST Assured or pytest, may use Postman only for ad hoc exploration rather than as their test suite of record.

Questions about postman

Is Postman free to use?
There's a free plan for individual use, but it's limited to a single user and can't create a shared team workspace — collaboration features require a paid Solo, Team, or Enterprise plan.
Can Postman collections replace a real automated test suite?
They can get close once wired into Newman (or Postman's newer CLI) and a CI pipeline, but the test scripts run in a sandboxed JavaScript environment with fewer assertion and data-handling capabilities than a full test framework. Many teams use Postman for exploration and manual checks alongside, not instead of, a code-based suite like REST Assured or pytest.
What's the difference between Postman and Newman?
Postman is the GUI application; Newman is its original command-line collection runner, and it's still officially supported. Newman runs an exported collection the same way the app's Collection Runner would, but headlessly, which is what lets the same tests run inside a CI pipeline. Postman has more recently introduced a separate, newer Postman CLI that its own docs now lean on more heavily for CI, though Newman hasn't been deprecated.
Do I need Postman if I can already use curl?
curl is fine for a single one-off request. Postman's value shows up once there are many related, reusable requests that need to chain together, get shared with a team, or get documented, needs curl alone doesn't address well.

The primary source

Related concepts

← All concept guides