Bird
Raised Fist0
PyTesttesting~5 mins

API client testing in PyTest

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction

API client testing helps check if your program talks correctly with other software through APIs. It makes sure your requests and responses work as expected.

When you want to verify that your API calls return the right data.
When you need to check how your client handles errors from the API.
When you update your API client code and want to confirm it still works.
When you want to automate testing of API endpoints without manual checks.
Syntax
PyTest
def test_api_client():
    response = client.get('/endpoint')
    assert response.status_code == 200
    assert response.json() == expected_data

Use assert to check if the API response matches what you expect.

Use a test client or mock to simulate API calls in tests.

Examples
Test that getting user with ID 1 returns status 200 and includes a username.
PyTest
def test_get_user(client):
    response = client.get('/users/1')
    assert response.status_code == 200
    assert 'username' in response.json()
Test creating a new item with POST and check the response data.
PyTest
def test_post_create_item(client):
    data = {'name': 'item1'}
    response = client.post('/items', json=data)
    assert response.status_code == 201
    assert response.json()['name'] == 'item1'
Test that requesting an unknown endpoint returns 404 error.
PyTest
def test_handle_404(client):
    response = client.get('/unknown')
    assert response.status_code == 404
Sample Program

This test script uses a fake client to simulate API calls. It tests a successful user fetch and a 404 error for unknown URL.

PyTest
import pytest

class FakeClient:
    def get(self, url):
        if url == '/users/1':
            return FakeResponse(200, {'username': 'alice'})
        return FakeResponse(404, {})

class FakeResponse:
    def __init__(self, status_code, json_data):
        self.status_code = status_code
        self._json = json_data
    def json(self):
        return self._json

@pytest.fixture
def client():
    return FakeClient()

def test_get_user(client):
    response = client.get('/users/1')
    assert response.status_code == 200
    assert 'username' in response.json()

def test_handle_404(client):
    response = client.get('/unknown')
    assert response.status_code == 404
OutputSuccess
Important Notes

Use fixtures in pytest to create reusable API clients for tests.

Mock external API calls to avoid real network requests during testing.

Check both status codes and response data for thorough testing.

Summary

API client testing checks if your code correctly sends requests and handles responses.

Use assertions to verify status codes and response content.

Mock or fake clients help test without real API calls.

Practice

(1/5)
1. What is the main purpose of API client testing in pytest?
easy
A. To verify that the code correctly communicates with the API
B. To check the user interface layout
C. To test database schema changes
D. To measure application performance speed

Solution

  1. Step 1: Understand API client testing goal

    API client testing ensures the code sends requests and receives responses correctly from an API.
  2. Step 2: Compare options with API client testing focus

    Only To verify that the code correctly communicates with the API relates to verifying communication with the API, others focus on unrelated areas.
  3. Final Answer:

    To verify that the code correctly communicates with the API -> Option A
  4. Quick Check:

    API client testing = verify API communication [OK]
Hint: API client testing checks API communication correctness [OK]
Common Mistakes:
  • Confusing API testing with UI testing
  • Thinking it tests database directly
  • Mixing performance testing with API client testing
2. Which pytest code snippet correctly asserts that an API response status code is 200?
easy
A. assert response.statusCode == 200
B. assert response.status == 200
C. assert response.code == 200
D. assert response.status_code == 200

Solution

  1. Step 1: Identify correct attribute for status code in response

    In most Python HTTP clients, the status code is accessed via response.status_code.
  2. Step 2: Verify assertion syntax

    The assertion assert response.status_code == 200 is syntactically correct and checks the status code properly.
  3. Final Answer:

    assert response.status_code == 200 -> Option D
  4. Quick Check:

    Correct attribute is status_code [OK]
Hint: Use response.status_code to check HTTP status [OK]
Common Mistakes:
  • Using incorrect attribute names like status or code
  • Missing assert keyword
  • Using camelCase instead of snake_case
3. Given the pytest test below, what will be the output if the API returns JSON {'success': true}?
def test_api_response(client):
    response = client.get('/status')
    data = response.json()
    assert data['success'] is True
medium
A. Test fails due to assertion error
B. Test fails due to KeyError
C. Test passes because 'success' is True
D. Test raises a syntax error

Solution

  1. Step 1: Analyze the API response and JSON parsing

    The API returns JSON with key 'success' set to true, which maps to Python True after parsing.
  2. Step 2: Check the assertion logic

    The assertion checks if data['success'] is True, which matches the parsed value, so it passes.
  3. Final Answer:

    Test passes because 'success' is True -> Option C
  4. Quick Check:

    JSON true = Python True, assertion passes [OK]
Hint: True in JSON becomes True in Python, assertion passes [OK]
Common Mistakes:
  • Confusing JSON true with string 'true'
  • Expecting KeyError when key exists
  • Misreading assertion logic
4. Identify the error in this pytest API test code:
def test_get_user(client):
    response = client.get('/user/1')
    assert response.status_code = 200
    assert response.json()['id'] == 1
medium
A. Using single equals '=' instead of double '==' in assertion
B. Missing parentheses in response.json call
C. Incorrect endpoint URL format
D. No error, code is correct

Solution

  1. Step 1: Check assertion syntax

    The line assert response.status_code = 200 uses single '=' which is assignment, not comparison.
  2. Step 2: Confirm correct assertion operator

    Assertions require '==' to compare values, so it should be assert response.status_code == 200.
  3. Final Answer:

    Using single equals '=' instead of double '==' in assertion -> Option A
  4. Quick Check:

    Use '==' for comparison in assert [OK]
Hint: Use '==' in assert, not '=' [OK]
Common Mistakes:
  • Confusing assignment '=' with comparison '=='
  • Forgetting parentheses in method calls
  • Assuming no syntax error in assert
5. You want to test an API client method that sends a POST request with JSON data and expects a 201 status code. Which pytest test code correctly performs this check?
hard
A. def test_create_item(client): response = client.post('/items', data={'name': 'book'}) assert response.status_code == 201
B. def test_create_item(client): response = client.post('/items', json={'name': 'book'}) assert response.status_code == 201
C. def test_create_item(client): response = client.post('/items', json='name=book') assert response.status_code == 201
D. def test_create_item(client): response = client.post('/items', json={'name': 'book'}) assert response.status == 201

Solution

  1. Step 1: Identify correct way to send JSON data in POST request

    Using json={'name': 'book'} sends JSON properly; data= sends form data, which is incorrect here.
  2. Step 2: Verify correct status code assertion

    Use response.status_code == 201 to check for created resource status; response.status is invalid.
  3. Final Answer:

    def test_create_item(client): response = client.post('/items', json={'name': 'book'}) assert response.status_code == 201 -> Option B
  4. Quick Check:

    Use json= for JSON, assert status_code == 201 [OK]
Hint: Use json= dict and assert status_code == 201 [OK]
Common Mistakes:
  • Using data= instead of json= for JSON payload
  • Passing JSON as string instead of dict
  • Using response.status instead of response.status_code