Skip to content

Restful Testing

DodaTech 2 min read

title: "RESTful Testing — Unit, Integration, and Contract Testing for APIs" description: "RESTful testing covers unit tests for handlers, integration tests for endpoints, contract tests for API agreements, and end-to-end tests for complete workflows." date: 2026-06-28 lastmod: 2026-06-28 weight: 25 tags: [apis, restful] }

RESTful testing ensures API correctness through unit tests for individual handlers, integration tests for endpoint behavior, and contract tests for provider-consumer agreements.

What You'll Learn

  • Testing REST API endpoints
  • Contract testing with Pact
  • API test automation

Why It Matters

Untested APIs break with changes. Comprehensive testing catches regressions before they reach production.

Code Examples

import pytest
from app import app

@pytest.fixture
def client():
    app.config['TESTING'] = True
    with app.test_client() as client:
        yield client

# Unit test: handler logic
def test_user_serialization():
    user = User(id=1, name="Alice", email="alice@example.com")
    result = user.to_dict()
    assert result['name'] == "Alice"
    assert 'email' in result

# Integration test: endpoint behavior
class TestUsersAPI:
    def test_list_users(self, client):
        response = client.get('/api/users')
        assert response.status_code == 200
        assert isinstance(response.json, list)

    def test_get_user_found(self, client):
        response = client.get('/api/users/1')
        assert response.status_code == 200
        assert response.json['id'] == 1

    def test_get_user_not_found(self, client):
        response = client.get('/api/users/999')
        assert response.status_code == 404
        assert 'error' in response.json

    def test_create_user_success(self, client):
        response = client.post('/api/users', json={
            'name': 'Bob', 'email': 'bob@example.com'
        })
        assert response.status_code == 201
        assert response.json['name'] == 'Bob'

    def test_create_user_validation_error(self, client):
        response = client.post('/api/users', json={})
        assert response.status_code == 422

    def test_create_user_missing_name(self, client):
        response = client.post('/api/users', json={'email': 'test@test.com'})
        assert response.status_code == 422
        assert any(e['field'] == 'name' for e in response.json['error']['details'])
// Jest API testing
const request = require('supertest');
const app = require('../app');

describe('Users API', () => {
  test('GET /api/users returns 200', async () => {
    const res = await request(app).get('/api/users');
    expect(res.status).toBe(200);
    expect(Array.isArray(res.body)).toBe(true);
  });

  test('GET /api/users/:id returns user', async () => {
    const res = await request(app).get('/api/users/1');
    expect(res.status).toBe(200);
    expect(res.body).toHaveProperty('id', 1);
    expect(res.body).toHaveProperty('name');
  });

  test('POST /api/users validates input', async () => {
    const res = await request(app)
      .post('/api/users')
      .send({ name: '' });
    expect(res.status).toBe(422);
    expect(res.body.error).toBeDefined();
  });
});

Common Mistakes

1. No Tests for Error Paths

Only testing happy paths misses error handling bugs.

2. Testing Implementation, Not Behavior

Test API responses, not internal function calls.

3. No Contract Tests

Provider-consumer APIs break silently without contract verification.

4. Flaky Tests

Tests that depend on shared state or external services.

5. Low Test Coverage on API Layer

Handler code is often the least tested but most critical.

Practice Questions

  1. What is the difference between unit and integration tests?
  2. What is contract testing?
  3. Why test error paths?
  4. What is a test fixture?
  5. How do you test API authentication?

Answers:

  1. Unit tests test isolated code; integration tests test endpoint behavior.
  2. Testing that provider and consumer agree on the API contract.
  3. Most bugs occur in error handling, not happy paths.
  4. Setup code that provides test data or configuration.
  5. Include auth headers in test requests and test both valid and invalid tokens.

Challenge: Write comprehensive API tests for a RESTful endpoint. Cover success, validation errors, not found, and authentication scenarios.

FAQ

What testing framework is best for REST APIs?

: Pytest (Python), Jest (JavaScript), RSpec (Ruby).

How do I test database-dependent API endpoints?

: Use test databases or in-memory databases with fixtures.

What is API contract testing?

: Verifying that the API provider meets consumer expectations, typically with Pact.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro