Back to Blog

The Complete Guide to API Testing with Postman and Newman

AlternateQA Team
APIs are the backbone of modern software. Learn how to build a robust API testing strategy using Postman collections and Newman for CI/CD integration, from authentication flows to data-driven testing.

Why API Testing is Non-Negotiable

In the microservices era, applications are built as a network of APIs talking to each other. The frontend is simply a consumer of these services. This means that if your API layer is broken, your entire product is broken — even if the UI looks perfect. API testing validates the contract between services, ensuring that data flows correctly, authentication holds up, and error cases are handled gracefully.

Unlike UI testing, API tests are fast, reliable, and don't break when designers change the button color. They sit at the "service layer" of the testing pyramid, offering the best return on investment for most teams.

Getting Started with Postman

Postman is the industry-standard GUI tool for API testing. It allows you to send HTTP requests, inspect responses, and write assertions — all without writing a single line of code upfront.

Setting Up Your First Collection

A Postman Collection is a group of saved API requests organized into folders. Think of it as your test suite. To create one:

  1. Open Postman and click New Collection.
  2. Name it after your service (e.g., "User Authentication API").
  3. Add a description explaining what the collection covers.
  4. Start creating requests by clicking Add Request.

Environment Variables: The Key to Reusable Tests

Never hardcode URLs, tokens, or credentials in your requests. Instead, use Environments:

  • {{base_url}}: Set to https://api.staging.myapp.com for staging, https://api.myapp.com for production.
  • {{auth_token}}: Populated dynamically by a login request's response.
  • {{user_id}}: Set from a previous request's response body.

This pattern allows your entire collection to run against any environment with a single click.

Writing Pre-request Scripts

Pre-request scripts run before your API call is sent. Use them to:

  • Generate dynamic data (e.g., unique email addresses with timestamps)
  • Compute HMAC signatures for secured endpoints
  • Set up state required by the request
// Generate a unique email for each test run
const timestamp = new Date().getTime();
pm.environment.set("unique_email", `testuser_${timestamp}@test.com`);

Writing Tests in Postman

The Tests tab is where the real magic happens. Every test is a JavaScript snippet using the Postman API (pm.* methods).

// Test 1: Status code must be 200
pm.test("Status code is 200", () => {
    pm.response.to.have.status(200);
});

// Test 2: Response body must contain a token
pm.test("Response contains access token", () => {
    const jsonData = pm.response.json();
    pm.expect(jsonData).to.have.property('access_token');
    pm.environment.set("auth_token", jsonData.access_token);
});

// Test 3: Response time must be under 500ms
pm.test("Response time is acceptable", () => {
    pm.expect(pm.response.responseTime).to.be.below(500);
});

Advanced Testing Patterns

Chaining Requests

Real-world testing involves sequences of API calls. A typical e-commerce flow looks like:

  1. POST /auth/login → Extract auth_token
  2. POST /products/cart → Add item to cart, extract cart_id
  3. POST /checkout → Place order using cart_id
  4. GET /orders/{order_id} → Verify order was created correctly

By storing values in environment variables between requests, you create a realistic end-to-end flow.

Data-Driven Testing with CSV Files

To test an endpoint with hundreds of different inputs, use Postman's Collection Runner with a CSV or JSON data file:

username,password,expected_status
admin@test.com,correct_pass,200
admin@test.com,wrong_pass,401
notauser@test.com,anypass,404

The runner will iterate through each row, replacing {{username}}, {{password}}, and {{expected_status}} in your requests and tests automatically.

Testing Error Cases and Edge Cases

Don't just test the happy path. For every endpoint, test:

  • Missing required fields → Expect 400 Bad Request
  • Invalid data types → Expect 422 Unprocessable Entity
  • Unauthorized access → Expect 401 Unauthorized
  • Accessing another user's resource → Expect 403 Forbidden
  • Non-existent resource → Expect 404 Not Found

Newman: Running Postman in Your CI/CD Pipeline

Newman is the command-line runner for Postman collections. Install it via npm and integrate it directly into your pipeline.

npm install -g newman
newman run MyCollection.json -e staging_environment.json --reporters cli,junit --reporter-junit-export results.xml

The --reporters junit flag generates a JUnit XML report that any CI system (Jenkins, GitHub Actions, GitLab CI) can parse and display.

Example GitHub Actions Workflow

name: API Tests
on: [push, pull_request]
jobs:
  api-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Install Newman
        run: npm install -g newman
      - name: Run API Tests
        run: |
          newman run ./tests/api/collection.json \
            -e ./tests/api/env.staging.json \
            --reporters cli,junit \
            --reporter-junit-export ./results/api-results.xml

Best Practices Summary

  • Organize by feature, not by HTTP method. Group all user-related requests together.
  • Always test negative paths. Most security vulnerabilities are found in error-handling code.
  • Use schema validation to ensure the response structure never changes unexpectedly.
  • Keep collections version-controlled by exporting them to JSON and committing to Git.
  • Set up monitors in Postman to run your collections on a schedule against production, acting as a synthetic monitoring solution.

API testing with Postman and Newman is one of the highest-value investments a QA team can make. The tests are fast, reliable, and provide a living documentation of how your services are expected to behave.