34 / 65 · 14 API Testing Fundamentals · Error Handling and Environment Management← prev⊞ allnext →☰ Read as one page
5.3Rate Limiting
APIs should enforce rate limits to prevent abuse. Your tests should verify this protection exists.
def test_rate_limiting_returns_429(base_url):
"""Sending too many requests should trigger rate limiting."""
responses = []
for _ in range(150):
r = requests.get(f"{base_url}/public/health")
responses.append(r)
if r.status_code == 429:
break
assert any(r.status_code == 429 for r in responses), \
"Rate limiting was not triggered after 150 requests"
def test_rate_limit_includes_retry_after(base_url):
"""429 responses should include Retry-After header."""
# Trigger rate limiting first
for _ in range(200):
r = requests.get(f"{base_url}/public/health")
if r.status_code == 429:
break
if r.status_code == 429:
assert "Retry-After" in r.headers, "429 response missing Retry-After header"
retry_after = int(r.headers["Retry-After"])
assert retry_after > 0
def test_rate_limit_resets(base_url):
"""After waiting, rate limit should reset."""
import time
# Trigger rate limiting
for _ in range(200):
r = requests.get(f"{base_url}/public/health")
if r.status_code == 429:
break
if r.status_code == 429:
retry_after = int(r.headers.get("Retry-After", 5))
time.sleep(retry_after + 1)
r = requests.get(f"{base_url}/public/health")
assert r.status_code == 200, "Rate limit did not reset after Retry-After period"