Skip to main content
Learn how to test APIs using Hopx Sandboxes for isolated, reproducible API testing.

Basic API Testing

Test a simple API endpoint:
  • Python
  • JavaScript/TypeScript
from hopx_ai import Sandbox

def test_api_endpoint(url: str):
    """Test an API endpoint"""
    with Sandbox.create(template="code-interpreter") as sandbox:
        sandbox.commands.run("pip install requests pytest --quiet")
        
        result = sandbox.run_code(f"""
import requests
import json

# Test GET request
response = requests.get('{url}')

test_results = {{
    'url': '{url}',
    'status_code': response.status_code,
    'success': response.status_code == 200,
    'response_time_ms': response.elapsed.total_seconds() * 1000,
    'headers': dict(response.headers),
    'content_type': response.headers.get('Content-Type', 'unknown')
}}

# Try to parse JSON
try:
    test_results['json_data'] = response.json()
    test_results['has_json'] = True
except:
    test_results['has_json'] = False
    test_results['text_preview'] = response.text[:200]

# Save results
with open('/workspace/test_results.json', 'w') as f:
    json.dump(test_results, f, indent=2)

print(f"API Test Results:")
print(f"Status: {test_results['status_code']}")
print(f"Response Time: {test_results['response_time_ms']:.2f}ms")
        """)
        
        # Download results
        results_json = sandbox.files.read("/workspace/test_results.json")
        import json
        return json.loads(results_json)

# Example
results = test_api_endpoint("https://jsonplaceholder.typicode.com/posts/1")
print(f"Status: {results['status_code']}")
print(f"Success: {results['success']}")

Comprehensive API Test Suite

Create a complete API test suite:
  • Python
  • JavaScript/TypeScript
from hopx_ai import Sandbox
import json

def run_api_test_suite(base_url: str):
    """Run comprehensive API tests"""
    with Sandbox.create(template="code-interpreter") as sandbox:
        sandbox.commands.run("pip install requests pytest --quiet")
        
        result = sandbox.run_code(f"""
import requests
import json
import time

base_url = '{base_url}'
test_results = []

# Test 1: GET request
start = time.time()
response = requests.get(f'{{base_url}}/posts/1')
elapsed = (time.time() - start) * 1000

test_results.append({{
    'test': 'GET /posts/1',
    'status_code': response.status_code,
    'success': response.status_code == 200,
    'response_time_ms': elapsed,
    'has_data': 'id' in response.json() if response.status_code == 200 else False
}})

# Test 2: POST request
post_data = {{'title': 'Test Post', 'body': 'Test Body', 'userId': 1}}
start = time.time()
response = requests.post(f'{{base_url}}/posts', json=post_data)
elapsed = (time.time() - start) * 1000

test_results.append({{
    'test': 'POST /posts',
    'status_code': response.status_code,
    'success': response.status_code in [200, 201],
    'response_time_ms': elapsed,
    'created_id': response.json().get('id') if response.status_code in [200, 201] else None
}})

# Test 3: PUT request
put_data = {{'title': 'Updated Post', 'body': 'Updated Body', 'userId': 1}}
start = time.time()
response = requests.put(f'{{base_url}}/posts/1', json=put_data)
elapsed = (time.time() - start) * 1000

test_results.append({{
    'test': 'PUT /posts/1',
    'status_code': response.status_code,
    'success': response.status_code == 200,
    'response_time_ms': elapsed
}})

# Test 4: DELETE request
start = time.time()
response = requests.delete(f'{{base_url}}/posts/1')
elapsed = (time.time() - start) * 1000

test_results.append({{
    'test': 'DELETE /posts/1',
    'status_code': response.status_code,
    'success': response.status_code in [200, 204],
    'response_time_ms': elapsed
}})

# Summary
summary = {{
    'total_tests': len(test_results),
    'passed': sum(1 for t in test_results if t['success']),
    'failed': sum(1 for t in test_results if not t['success']),
    'avg_response_time_ms': sum(t['response_time_ms'] for t in test_results) / len(test_results),
    'tests': test_results
}}

# Save results
with open('/workspace/test_suite_results.json', 'w') as f:
    json.dump(summary, f, indent=2)

print(f"Test Suite Results:")
print(f"Total: {{summary['total_tests']}}, Passed: {{summary['passed']}}, Failed: {{summary['failed']}}")
print(f"Average Response Time: {{summary['avg_response_time_ms']:.2f}}ms")
        """)
        
        # Download results
        results_json = sandbox.files.read("/workspace/test_suite_results.json")
        return json.loads(results_json)

# Example
results = run_api_test_suite("https://jsonplaceholder.typicode.com")
print(f"Passed: {results['passed']}/{results['total_tests']}")

Load Testing

Perform load testing on APIs:
  • Python
  • JavaScript/TypeScript
from hopx_ai import Sandbox
import json

def load_test_api(url: str, num_requests: int = 100):
    """Perform load testing on an API"""
    with Sandbox.create(template="code-interpreter") as sandbox:
        sandbox.commands.run("pip install requests --quiet")
        
        result = sandbox.run_code(f"""
import requests
import json
import time
import statistics

url = '{url}'
num_requests = {num_requests}

response_times = []
status_codes = []
errors = []

print(f"Running {{num_requests}} requests to {{url}}...")

for i in range(num_requests):
    try:
        start = time.time()
        response = requests.get(url, timeout=10)
        elapsed = (time.time() - start) * 1000
        
        response_times.append(elapsed)
        status_codes.append(response.status_code)
    except Exception as e:
        errors.append(str(e))

# Calculate statistics
# Build status code distribution manually
status_dist = dict()
for code in set(status_codes):
    status_dist[code] = status_codes.count(code)

if response_times:
    stats = {{
        'total_requests': num_requests,
        'successful_requests': len(response_times),
        'failed_requests': len(errors),
        'min_response_time_ms': min(response_times),
        'max_response_time_ms': max(response_times),
        'avg_response_time_ms': statistics.mean(response_times),
        'median_response_time_ms': statistics.median(response_times),
        'p95_response_time_ms': sorted(response_times)[int(len(response_times) * 0.95)] if response_times else 0,
        'p99_response_time_ms': sorted(response_times)[int(len(response_times) * 0.99)] if response_times else 0,
        'status_code_distribution': status_dist
    }}
else:
    stats = {{'error': 'All requests failed'}}

# Save results
with open('/workspace/load_test_results.json', 'w') as f:
    json.dump(stats, f, indent=2)

print(f"\\nLoad Test Results:")
print(f"Successful: {{stats.get('successful_requests', 0)}}/{{num_requests}}")
print(f"Average Response Time: {{stats.get('avg_response_time_ms', 0):.2f}}ms")
        """)
        
        # Download results
        results_json = sandbox.files.read("/workspace/load_test_results.json")
        return json.loads(results_json)

# Example
results = load_test_api("https://jsonplaceholder.typicode.com/posts/1", num_requests=50)
print(f"Average response time: {results['avg_response_time_ms']:.2f}ms")
print(f"P95 response time: {results['p95_response_time_ms']:.2f}ms")

Next Steps