33 / 65 · 14 API Testing Fundamentals · Error Handling and Environment Management← prev⊞ allnext →☰ Read as one page
5.2Error Response Validation
Error responses should be structured, informative for the client, and silent about internals.
def test_error_response_structure(api):
"""Error responses should have a consistent format."""
r = api.post("/users", json={}) # Missing required fields
assert r.status_code in (400, 422)
error = r.json()
# Error should have a message and optionally field-level details
assert "message" in error or "error" in error
# If field-level errors are returned, verify structure
if "errors" in error:
for field_error in error["errors"]:
assert "field" in field_error
assert "message" in field_error
def test_error_does_not_leak_internals(api):
"""Error responses should never expose stack traces or internal paths."""
r = api.get("/users/nonexistent-id-format")
body = r.text.lower()
assert "traceback" not in body
assert "/usr/src/app" not in body
assert "node_modules" not in body
assert "sql" not in body.lower() or r.status_code != 500 # SQL errors in 500 = bad
assert "at object." not in body # JavaScript stack trace
def test_validation_error_identifies_field(api):
"""Validation errors should tell the client which field is wrong."""
r = api.post("/users", json={
"name": "",
"email": "not-an-email",
"role": "invalid_role"
})
assert r.status_code in (400, 422)
error_text = r.text.lower()
# At least one of the invalid fields should be mentioned
assert any(field in error_text for field in ["name", "email", "role"])