E2E Testing Framework for Microservices
Project description
Testing Engine Core
A reusable E2E testing framework for microservices architectures.
Features
- 🎯 Universal: Works with any REST API microservices
- 🔧 Flexible: Dynamic service registration - no hardcoded dependencies
- 🧪 Complete: HTTP requests, database assertions, message queue monitoring
- 📝 Declarative: Clean DSL for defining test scenarios
- 🔌 Extensible: Custom clients and step handlers
- ✅ Backward Compatible: Works with existing POC services
Installation
From Source (Development)
pip install -e .
From Wheel
pip install testing-engine-0.1.0-py3-none-any.whl
Quick Start
Basic Usage (POC Services)
from engine.orchestrator import TestOrchestrator
from engine.scenario import TestScenario
# Initialize with default POC services
orchestrator = TestOrchestrator()
# Create test scenario
scenario = TestScenario("User Registration")
scenario.http_request(
service="user",
method="POST",
endpoint="/api/users",
json_data={
"username": "testuser",
"email": "test@example.com",
"password": "SecurePass123!"
},
expected_status=201
)
# Execute
result = orchestrator.execute_scenario(scenario)
print(f"Test status: {result['status']}")
orchestrator.close()
Custom Services (Any Architecture)
from engine.config import EngineConfig, ServiceConfig
# Configure for your services
config = EngineConfig()
config.services = ServiceConfig.from_dict({
"order": "http://order-api:8001",
"payment": "http://payment-api:8002",
"inventory": "http://inventory-api:8003"
})
orchestrator = TestOrchestrator(config)
# Use your service names
scenario = TestScenario("Order Flow")
scenario.http_request("order", "POST", "/api/orders", json_data=order_data)
scenario.http_request("payment", "POST", "/api/charge", json_data=payment_data)
orchestrator.execute_scenario(scenario)
Custom Authentication
from engine.clients import GenericServiceClient
class AuthClient(GenericServiceClient):
def __init__(self, base_url, api_key):
super().__init__(
base_url,
default_headers={"Authorization": f"Bearer {api_key}"}
)
# Register custom client
orchestrator.register_service("secure_api", AuthClient(url, "your-api-key"))
Core Components
TestOrchestrator
Coordinates test execution across multiple services:
- HTTP client management
- Database inspection
- Message queue monitoring
- Test scenario execution
TestScenario
Declarative test definition:
http_request()- Make HTTP callswait_for_message()- Wait for RabbitMQ messagesassert_database()- Verify database statecustom_step()- Add custom logic
GenericServiceClient
Universal HTTP client for any REST API:
- Automatic retries
- Timeout handling
- Convenience methods (
get_json,post_json, etc.) - Custom headers support
Configuration
Environment Variables
# Services
export USER_SERVICE_URL=http://localhost:8001
export NOTIFICATION_SERVICE_URL=http://localhost:8002
export ADMIN_SERVICE_URL=http://localhost:8003
# Database
export DB_HOST=localhost
export DB_PORT=5432
export DB_NAME=testdb
export DB_USER=testuser
export DB_PASSWORD=testpass
# RabbitMQ
export RABBITMQ_HOST=localhost
export RABBITMQ_PORT=5672
export RABBITMQ_USER=testuser
export RABBITMQ_PASSWORD=testpass
Programmatic Configuration
config = EngineConfig()
config.services = ServiceConfig.from_dict({"api": "http://api:8080"})
config.database = DatabaseConfig(host="db.example.com", port=5432)
config.rabbitmq = RabbitMQConfig(host="mq.example.com", port=5672)
Advanced Features
Custom Step Handlers
def kafka_handler(step):
kafka.publish(step.params['topic'], step.params['message'])
orchestrator.register_step_handler("kafka_publish", kafka_handler)
# Use in scenarios
scenario.custom_step(
custom_type="kafka_publish",
params={"topic": "events", "message": {...}}
)
Context Manager
with TestOrchestrator(config) as orchestrator:
# Test code
orchestrator.execute_scenario(scenario)
# Automatically cleaned up
Architecture Support
Works with any microservices architecture:
- ✅ E-Commerce (order, payment, inventory, shipping)
- ✅ IoT (device, telemetry, alerts)
- ✅ Banking (account, transaction, fraud detection)
- ✅ SaaS (user, subscription, billing)
- ✅ And more...
Documentation
- Reusability Guide - Complete guide for using with any services
- Examples - 6 complete usage examples
- How-to Guide - Practical usage patterns
Requirements
- Python 3.8+
- PostgreSQL (for database assertions)
- RabbitMQ (for message queue monitoring)
- Your microservices
Testing
Run API tests (no infrastructure needed):
python test_api_only.py
Run full integration tests (requires running services):
python test_refactored_engine.py
License
MIT License
Contributing
Contributions welcome! This engine is designed to be universal and extensible.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file testing_engine_core-0.1.0.tar.gz.
File metadata
- Download URL: testing_engine_core-0.1.0.tar.gz
- Upload date:
- Size: 26.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e9fb0828ede1b7acbb5e8e63c0664e9847698aa62b534082a39d6d10f93703ac
|
|
| MD5 |
e913ecc3f0cc62e3b1eff6e981eb678e
|
|
| BLAKE2b-256 |
0e10fb8709e99a11b72d111b549d90ffb020794adfe0e235efbbe1ffa5525999
|
File details
Details for the file testing_engine_core-0.1.0-py3-none-any.whl.
File metadata
- Download URL: testing_engine_core-0.1.0-py3-none-any.whl
- Upload date:
- Size: 26.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d600ef884de3e3d5600679e618febf29528f813ab535901b4fc8f5c03b3bf827
|
|
| MD5 |
e8c7e48043d3efc75903c476dd34fc34
|
|
| BLAKE2b-256 |
574037e387f39ef732713d4973d68fd81c92281520ee54548c482226cd907d6d
|