feat: delete all GPU and performance test files
All checks were successful
audit / audit (push) Has been skipped
ci-cd / build (push) Has been skipped
ci / build (push) Has been skipped
autofix / fix (push) Has been skipped
python-tests / test (push) Successful in 20s
python-tests / test-specific (push) Has been skipped
security-scanning / audit (push) Has been skipped
test / test (push) Has been skipped
ci-cd / deploy (push) Has been skipped
ci / deploy (push) Has been skipped
All checks were successful
audit / audit (push) Has been skipped
ci-cd / build (push) Has been skipped
ci / build (push) Has been skipped
autofix / fix (push) Has been skipped
python-tests / test (push) Successful in 20s
python-tests / test-specific (push) Has been skipped
security-scanning / audit (push) Has been skipped
test / test (push) Has been skipped
ci-cd / deploy (push) Has been skipped
ci / deploy (push) Has been skipped
GPU AND PERFORMANCE TEST CLEANUP: Complete removal of GPU and performance testing Files Deleted: 1. Coordinator API Performance Tests: - apps/coordinator-api/performance_test.py - Tests for API response time and ML-ZK performance - Required running server instances 2. Scripts Testing Performance Files: - scripts/testing/debug_performance_test.py - scripts/testing/performance_test.py - scripts/testing/simple_performance_test.py - Various performance testing utilities and benchmarks 3. GPU Testing Workflow: - .windsurf/workflows/ollama-gpu-test.md - GPU testing workflow documentation Rationale: - Performance tests require running server instances - GPU tests have complex dependencies and setup requirements - These tests don't align with the streamlined CI workflow - Focus on core functional testing rather than performance benchmarks - Simplifies test suite and improves CI reliability Impact: - Reduces test complexity and dependencies - Eliminates server-dependent test failures - Streamlines CI workflow for faster execution - Maintains focus on functional test coverage - Removes performance testing bottlenecks This cleanup continues the optimization strategy of maintaining only functional, reliable tests that can run in CI environments without complex dependencies or external services.
This commit is contained in:
@@ -1,160 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Simple Performance Test with Debugging and Timeout
|
||||
"""
|
||||
|
||||
import time
|
||||
import requests
|
||||
import signal
|
||||
import sys
|
||||
from typing import Dict, List
|
||||
|
||||
class TimeoutError(Exception):
|
||||
pass
|
||||
|
||||
def timeout_handler(signum, frame):
|
||||
raise TimeoutError("Operation timed out")
|
||||
|
||||
def test_endpoint_with_timeout(url: str, method: str = "GET", data: Dict = None, timeout: int = 5) -> Dict:
|
||||
"""Test single endpoint with timeout and debugging"""
|
||||
print(f"🔍 Testing {method} {url}")
|
||||
|
||||
# Set timeout
|
||||
signal.signal(signal.SIGALRM, timeout_handler)
|
||||
signal.alarm(timeout)
|
||||
|
||||
try:
|
||||
start_time = time.time()
|
||||
|
||||
if method == "GET":
|
||||
response = requests.get(url, timeout=timeout)
|
||||
elif method == "POST":
|
||||
response = requests.post(url, json=data, timeout=timeout)
|
||||
|
||||
end_time = time.time()
|
||||
signal.alarm(0) # Cancel timeout
|
||||
|
||||
response_time_ms = (end_time - start_time) * 1000
|
||||
|
||||
result = {
|
||||
"url": url,
|
||||
"method": method,
|
||||
"status_code": response.status_code,
|
||||
"response_time_ms": response_time_ms,
|
||||
"success": True,
|
||||
"error": None
|
||||
}
|
||||
|
||||
print(f"✅ Status: {response.status_code}")
|
||||
print(f"⏱️ Response Time: {response_time_ms:.2f}ms")
|
||||
print(f"📄 Response Size: {len(response.content)} bytes")
|
||||
|
||||
return result
|
||||
|
||||
except TimeoutError as e:
|
||||
signal.alarm(0)
|
||||
print(f"❌ Timeout: {e}")
|
||||
return {
|
||||
"url": url,
|
||||
"method": method,
|
||||
"status_code": None,
|
||||
"response_time_ms": timeout * 1000,
|
||||
"success": False,
|
||||
"error": str(e)
|
||||
}
|
||||
except Exception as e:
|
||||
signal.alarm(0)
|
||||
print(f"❌ Error: {e}")
|
||||
return {
|
||||
"url": url,
|
||||
"method": method,
|
||||
"status_code": None,
|
||||
"response_time_ms": 0,
|
||||
"success": False,
|
||||
"error": str(e)
|
||||
}
|
||||
|
||||
def run_performance_tests():
|
||||
"""Run performance tests with debugging"""
|
||||
print("🎯 AITBC GPU Marketplace Performance Test")
|
||||
print("=" * 50)
|
||||
|
||||
base_url = "http://localhost:8000"
|
||||
results = []
|
||||
|
||||
# Test 1: Health endpoint
|
||||
print("\n1️⃣ Health Endpoint Test")
|
||||
result = test_endpoint_with_timeout(f"{base_url}/health", timeout=3)
|
||||
results.append(result)
|
||||
|
||||
# Test 2: GPU List endpoint
|
||||
print("\n2️⃣ GPU List Endpoint Test")
|
||||
result = test_endpoint_with_timeout(f"{base_url}/v1/marketplace/gpu/list", timeout=5)
|
||||
results.append(result)
|
||||
|
||||
# Test 3: GPU Booking endpoint
|
||||
print("\n3️⃣ GPU Booking Endpoint Test")
|
||||
booking_data = {"duration_hours": 1}
|
||||
result = test_endpoint_with_timeout(
|
||||
f"{base_url}/v1/marketplace/gpu/gpu_c5be877c/book",
|
||||
"POST",
|
||||
booking_data,
|
||||
timeout=10
|
||||
)
|
||||
results.append(result)
|
||||
|
||||
# Test 4: GPU Release endpoint
|
||||
print("\n4️⃣ GPU Release Endpoint Test")
|
||||
result = test_endpoint_with_timeout(
|
||||
f"{base_url}/v1/marketplace/gpu/gpu_c5be877c/release",
|
||||
"POST",
|
||||
timeout=10
|
||||
)
|
||||
results.append(result)
|
||||
|
||||
# Summary
|
||||
print("\n📊 PERFORMANCE SUMMARY")
|
||||
print("=" * 50)
|
||||
|
||||
successful_tests = sum(1 for r in results if r["success"])
|
||||
total_tests = len(results)
|
||||
|
||||
print(f"✅ Successful Tests: {successful_tests}/{total_tests} ({successful_tests/total_tests*100:.1f}%)")
|
||||
|
||||
print(f"\n📈 Response Times:")
|
||||
for result in results:
|
||||
if result["success"]:
|
||||
status = "🟢" if result["response_time_ms"] < 100 else "🟡" if result["response_time_ms"] < 200 else "🔴"
|
||||
endpoint = result['url'].split('/')[-1] if '/' in result['url'] else result['url']
|
||||
print(f" {status} {result['method']} {endpoint}: {result['response_time_ms']:.2f}ms")
|
||||
else:
|
||||
endpoint = result['url'].split('/')[-1] if '/' in result['url'] else result['url']
|
||||
print(f" ❌ {result['method']} {endpoint}: {result['error']}")
|
||||
|
||||
# Performance grade
|
||||
successful_times = [r["response_time_ms"] for r in results if r["success"]]
|
||||
if successful_times:
|
||||
avg_response_time = sum(successful_times) / len(successful_times)
|
||||
if avg_response_time < 50:
|
||||
grade = "🟢 EXCELLENT"
|
||||
elif avg_response_time < 100:
|
||||
grade = "🟡 GOOD"
|
||||
elif avg_response_time < 200:
|
||||
grade = "🟠 FAIR"
|
||||
else:
|
||||
grade = "🔴 POOR"
|
||||
|
||||
print(f"\n🎯 Overall Performance: {grade}")
|
||||
print(f"📊 Average Response Time: {avg_response_time:.2f}ms")
|
||||
|
||||
print(f"\n✅ Performance testing complete!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
run_performance_tests()
|
||||
except KeyboardInterrupt:
|
||||
print("\n⚠️ Test interrupted by user")
|
||||
sys.exit(1)
|
||||
except Exception as e:
|
||||
print(f"\n❌ Unexpected error: {e}")
|
||||
sys.exit(1)
|
||||
@@ -1,209 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Performance Testing Suite for AITBC Platform
|
||||
Tests API endpoints, load handling, and system performance
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import aiohttp
|
||||
import time
|
||||
import json
|
||||
import statistics
|
||||
from typing import List, Dict, Any
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
class PerformanceTester:
|
||||
def __init__(self, base_url: str = "https://aitbc.bubuit.net/api/v1"):
|
||||
self.base_url = base_url
|
||||
self.api_key = "test_key_16_characters"
|
||||
self.results = []
|
||||
|
||||
async def single_request(self, session: aiohttp.ClientSession,
|
||||
method: str, endpoint: str, **kwargs) -> Dict[str, Any]:
|
||||
"""Execute a single API request and measure performance"""
|
||||
start_time = time.time()
|
||||
|
||||
headers = kwargs.pop('headers', {})
|
||||
headers['X-Api-Key'] = self.api_key
|
||||
|
||||
try:
|
||||
async with session.request(method, f"{self.base_url}{endpoint}",
|
||||
headers=headers, **kwargs) as response:
|
||||
content = await response.text()
|
||||
end_time = time.time()
|
||||
|
||||
return {
|
||||
'endpoint': endpoint,
|
||||
'method': method,
|
||||
'status_code': response.status,
|
||||
'response_time': end_time - start_time,
|
||||
'content_length': len(content),
|
||||
'success': response.status < 400
|
||||
}
|
||||
except Exception as e:
|
||||
end_time = time.time()
|
||||
return {
|
||||
'endpoint': endpoint,
|
||||
'method': method,
|
||||
'status_code': 0,
|
||||
'response_time': end_time - start_time,
|
||||
'content_length': 0,
|
||||
'success': False,
|
||||
'error': str(e)
|
||||
}
|
||||
|
||||
async def load_test_endpoint(self, endpoint: str, method: str = "GET",
|
||||
concurrent_users: int = 10, requests_per_user: int = 5,
|
||||
**kwargs) -> Dict[str, Any]:
|
||||
"""Perform load testing on a specific endpoint"""
|
||||
print(f"🧪 Load testing {method} {endpoint} - {concurrent_users} users × {requests_per_user} requests")
|
||||
|
||||
connector = aiohttp.TCPConnector(limit=100, limit_per_host=100)
|
||||
timeout = aiohttp.ClientTimeout(total=30)
|
||||
|
||||
async with aiohttp.ClientSession(connector=connector, timeout=timeout) as session:
|
||||
tasks = []
|
||||
for user in range(concurrent_users):
|
||||
for req in range(requests_per_user):
|
||||
task = self.single_request(session, method, endpoint, **kwargs)
|
||||
tasks.append(task)
|
||||
|
||||
results = await asyncio.gather(*tasks, return_exceptions=True)
|
||||
|
||||
# Filter out exceptions and calculate metrics
|
||||
valid_results = [r for r in results if isinstance(r, dict)]
|
||||
successful_results = [r for r in valid_results if r['success']]
|
||||
|
||||
response_times = [r['response_time'] for r in successful_results]
|
||||
|
||||
return {
|
||||
'endpoint': endpoint,
|
||||
'total_requests': len(valid_results),
|
||||
'successful_requests': len(successful_results),
|
||||
'failed_requests': len(valid_results) - len(successful_results),
|
||||
'success_rate': len(successful_results) / len(valid_results) * 100 if valid_results else 0,
|
||||
'avg_response_time': statistics.mean(response_times) if response_times else 0,
|
||||
'min_response_time': min(response_times) if response_times else 0,
|
||||
'max_response_time': max(response_times) if response_times else 0,
|
||||
'median_response_time': statistics.median(response_times) if response_times else 0,
|
||||
'p95_response_time': statistics.quantiles(response_times, n=20)[18] if len(response_times) > 20 else 0,
|
||||
'requests_per_second': len(successful_results) / (max(response_times) - min(response_times)) if len(response_times) > 1 else 0
|
||||
}
|
||||
|
||||
async def run_performance_tests(self):
|
||||
"""Run comprehensive performance tests"""
|
||||
print("🚀 Starting AITBC Platform Performance Tests")
|
||||
print("=" * 60)
|
||||
|
||||
test_endpoints = [
|
||||
# Health check (baseline)
|
||||
{'endpoint': '/health', 'method': 'GET', 'users': 20, 'requests': 10},
|
||||
|
||||
# Client endpoints
|
||||
{'endpoint': '/client/jobs', 'method': 'GET', 'users': 5, 'requests': 5},
|
||||
|
||||
# Miner endpoints
|
||||
{'endpoint': '/miners/register', 'method': 'POST', 'users': 3, 'requests': 3,
|
||||
'json': {'capabilities': {'gpu': {'model': 'RTX 4090'}}},
|
||||
'headers': {'Content-Type': 'application/json', 'X-Miner-ID': 'perf-test-miner'}},
|
||||
|
||||
# Blockchain endpoints
|
||||
{'endpoint': '/blockchain/info', 'method': 'GET', 'users': 5, 'requests': 5},
|
||||
]
|
||||
|
||||
results = []
|
||||
|
||||
for test_config in test_endpoints:
|
||||
endpoint = test_config.pop('endpoint')
|
||||
method = test_config.pop('method')
|
||||
|
||||
result = await self.load_test_endpoint(endpoint, method, **test_config)
|
||||
results.append(result)
|
||||
|
||||
# Print immediate results
|
||||
print(f"📊 {method} {endpoint}:")
|
||||
print(f" ✅ Success Rate: {result['success_rate']:.1f}%")
|
||||
print(f" ⏱️ Avg Response: {result['avg_response_time']:.3f}s")
|
||||
print(f" 📈 RPS: {result['requests_per_second']:.1f}")
|
||||
print(f" 📏 P95: {result['p95_response_time']:.3f}s")
|
||||
print()
|
||||
|
||||
return results
|
||||
|
||||
def generate_report(self, results: List[Dict[str, Any]]):
|
||||
"""Generate performance test report"""
|
||||
print("📋 PERFORMANCE TEST REPORT")
|
||||
print("=" * 60)
|
||||
|
||||
total_requests = sum(r['total_requests'] for r in results)
|
||||
total_successful = sum(r['successful_requests'] for r in results)
|
||||
overall_success_rate = (total_successful / total_requests * 100) if total_requests > 0 else 0
|
||||
|
||||
print(f"📊 Overall Statistics:")
|
||||
print(f" Total Requests: {total_requests}")
|
||||
print(f" Successful Requests: {total_successful}")
|
||||
print(f" Overall Success Rate: {overall_success_rate:.1f}%")
|
||||
print()
|
||||
|
||||
print(f"🎯 Endpoint Performance:")
|
||||
for result in results:
|
||||
status = "✅" if result['success_rate'] >= 95 else "⚠️" if result['success_rate'] >= 80 else "❌"
|
||||
print(f" {status} {result['method']} {result['endpoint']}")
|
||||
print(f" Success: {result['success_rate']:.1f}% | "
|
||||
f"Avg: {result['avg_response_time']:.3f}s | "
|
||||
f"P95: {result['p95_response_time']:.3f}s | "
|
||||
f"RPS: {result['requests_per_second']:.1f}")
|
||||
|
||||
print()
|
||||
print("🏆 Performance Benchmarks:")
|
||||
print(" ✅ Excellent: <100ms response time, >95% success rate")
|
||||
print(" ⚠️ Good: <500ms response time, >80% success rate")
|
||||
print(" ❌ Needs Improvement: >500ms or <80% success rate")
|
||||
|
||||
# Recommendations
|
||||
print()
|
||||
print("💡 Recommendations:")
|
||||
|
||||
slow_endpoints = [r for r in results if r['avg_response_time'] > 0.5]
|
||||
if slow_endpoints:
|
||||
print(" 🐌 Slow endpoints detected - consider optimization:")
|
||||
for r in slow_endpoints:
|
||||
print(f" - {r['endpoint']} ({r['avg_response_time']:.3f}s avg)")
|
||||
|
||||
unreliable_endpoints = [r for r in results if r['success_rate'] < 95]
|
||||
if unreliable_endpoints:
|
||||
print(" 🔧 Unreliable endpoints detected - check for errors:")
|
||||
for r in unreliable_endpoints:
|
||||
print(f" - {r['endpoint']} ({r['success_rate']:.1f}% success)")
|
||||
|
||||
if not slow_endpoints and not unreliable_endpoints:
|
||||
print(" 🎉 All endpoints performing well - ready for production!")
|
||||
|
||||
async def main():
|
||||
"""Main performance testing execution"""
|
||||
tester = PerformanceTester()
|
||||
|
||||
try:
|
||||
results = await tester.run_performance_tests()
|
||||
tester.generate_report(results)
|
||||
|
||||
# Return exit code based on performance
|
||||
avg_success_rate = statistics.mean([r['success_rate'] for r in results])
|
||||
avg_response_time = statistics.mean([r['avg_response_time'] for r in results])
|
||||
|
||||
if avg_success_rate >= 95 and avg_response_time < 0.5:
|
||||
print("\n🎉 PERFORMANCE TESTS PASSED - Ready for production!")
|
||||
return 0
|
||||
else:
|
||||
print("\n⚠️ PERFORMANCE TESTS COMPLETED - Review recommendations")
|
||||
return 1
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Performance test failed: {e}")
|
||||
return 1
|
||||
|
||||
if __name__ == "__main__":
|
||||
exit_code = asyncio.run(main())
|
||||
sys.exit(exit_code)
|
||||
@@ -1,168 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Simple Performance Testing for AITBC Platform
|
||||
"""
|
||||
|
||||
import time
|
||||
import requests
|
||||
import statistics
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
import json
|
||||
|
||||
class SimplePerformanceTester:
|
||||
def __init__(self, base_url="https://aitbc.bubuit.net/api/v1"):
|
||||
self.base_url = base_url
|
||||
self.api_key = "test_key_16_characters"
|
||||
|
||||
def test_endpoint(self, method, endpoint, **kwargs):
|
||||
"""Test a single endpoint"""
|
||||
start_time = time.time()
|
||||
|
||||
headers = kwargs.pop('headers', {})
|
||||
headers['X-Api-Key'] = self.api_key
|
||||
|
||||
try:
|
||||
response = requests.request(method, f"{self.base_url}{endpoint}",
|
||||
headers=headers, timeout=10, **kwargs)
|
||||
end_time = time.time()
|
||||
|
||||
return {
|
||||
'endpoint': endpoint,
|
||||
'method': method,
|
||||
'status_code': response.status_code,
|
||||
'response_time': end_time - start_time,
|
||||
'success': response.status_code < 400,
|
||||
'content_length': len(response.text)
|
||||
}
|
||||
except Exception as e:
|
||||
end_time = time.time()
|
||||
return {
|
||||
'endpoint': endpoint,
|
||||
'method': method,
|
||||
'status_code': 0,
|
||||
'response_time': end_time - start_time,
|
||||
'success': False,
|
||||
'error': str(e)
|
||||
}
|
||||
|
||||
def load_test_endpoint(self, method, endpoint, concurrent_users=5, requests_per_user=3, **kwargs):
|
||||
"""Load test an endpoint"""
|
||||
print(f"🧪 Testing {method} {endpoint} - {concurrent_users} users × {requests_per_user} requests")
|
||||
|
||||
def make_request():
|
||||
return self.test_endpoint(method, endpoint, **kwargs)
|
||||
|
||||
with ThreadPoolExecutor(max_workers=concurrent_users) as executor:
|
||||
futures = []
|
||||
for _ in range(concurrent_users * requests_per_user):
|
||||
future = executor.submit(make_request)
|
||||
futures.append(future)
|
||||
|
||||
results = []
|
||||
for future in as_completed(futures):
|
||||
result = future.result()
|
||||
results.append(result)
|
||||
|
||||
successful_results = [r for r in results if r['success']]
|
||||
response_times = [r['response_time'] for r in successful_results]
|
||||
|
||||
return {
|
||||
'endpoint': endpoint,
|
||||
'total_requests': len(results),
|
||||
'successful_requests': len(successful_results),
|
||||
'failed_requests': len(results) - len(successful_results),
|
||||
'success_rate': len(successful_results) / len(results) * 100 if results else 0,
|
||||
'avg_response_time': statistics.mean(response_times) if response_times else 0,
|
||||
'min_response_time': min(response_times) if response_times else 0,
|
||||
'max_response_time': max(response_times) if response_times else 0,
|
||||
'median_response_time': statistics.median(response_times) if response_times else 0,
|
||||
}
|
||||
|
||||
def run_tests(self):
|
||||
"""Run performance tests"""
|
||||
print("🚀 AITBC Platform Performance Tests")
|
||||
print("=" * 50)
|
||||
|
||||
test_cases = [
|
||||
# Health check
|
||||
{'method': 'GET', 'endpoint': '/health', 'users': 10, 'requests': 5},
|
||||
|
||||
# Client endpoints
|
||||
{'method': 'GET', 'endpoint': '/client/jobs', 'users': 5, 'requests': 3},
|
||||
|
||||
# Miner endpoints
|
||||
{'method': 'POST', 'endpoint': '/miners/register', 'users': 3, 'requests': 2,
|
||||
'json': {'capabilities': {'gpu': {'model': 'RTX 4090'}}},
|
||||
'headers': {'Content-Type': 'application/json', 'X-Miner-ID': 'perf-test-miner'}},
|
||||
]
|
||||
|
||||
results = []
|
||||
|
||||
for test_case in test_cases:
|
||||
method = test_case.pop('method')
|
||||
endpoint = test_case.pop('endpoint')
|
||||
|
||||
result = self.load_test_endpoint(method, endpoint, **test_case)
|
||||
results.append(result)
|
||||
|
||||
# Print results
|
||||
status = "✅" if result['success_rate'] >= 80 else "⚠️" if result['success_rate'] >= 50 else "❌"
|
||||
print(f"{status} {method} {endpoint}:")
|
||||
print(f" Success Rate: {result['success_rate']:.1f}%")
|
||||
print(f" Avg Response: {result['avg_response_time']:.3f}s")
|
||||
print(f" Requests: {result['successful_requests']}/{result['total_requests']}")
|
||||
print()
|
||||
|
||||
# Generate report
|
||||
self.generate_report(results)
|
||||
return results
|
||||
|
||||
def generate_report(self, results):
|
||||
"""Generate performance report"""
|
||||
print("📋 PERFORMANCE REPORT")
|
||||
print("=" * 50)
|
||||
|
||||
total_requests = sum(r['total_requests'] for r in results)
|
||||
total_successful = sum(r['successful_requests'] for r in results)
|
||||
overall_success_rate = (total_successful / total_requests * 100) if total_requests > 0 else 0
|
||||
|
||||
print(f"📊 Overall:")
|
||||
print(f" Total Requests: {total_requests}")
|
||||
print(f" Successful: {total_successful}")
|
||||
print(f" Success Rate: {overall_success_rate:.1f}%")
|
||||
print()
|
||||
|
||||
print(f"🎯 Endpoint Performance:")
|
||||
for result in results:
|
||||
status = "✅" if result['success_rate'] >= 80 else "⚠️" if result['success_rate'] >= 50 else "❌"
|
||||
print(f" {status} {result['method']} {result['endpoint']}")
|
||||
print(f" Success: {result['success_rate']:.1f}% | "
|
||||
f"Avg: {result['avg_response_time']:.3f}s | "
|
||||
f"Requests: {result['successful_requests']}/{result['total_requests']}")
|
||||
|
||||
print()
|
||||
print("💡 Recommendations:")
|
||||
|
||||
if overall_success_rate >= 80:
|
||||
print(" 🎉 Good performance - ready for production!")
|
||||
else:
|
||||
print(" ⚠️ Performance issues detected - review endpoints")
|
||||
|
||||
slow_endpoints = [r for r in results if r['avg_response_time'] > 1.0]
|
||||
if slow_endpoints:
|
||||
print(" 🐌 Slow endpoints:")
|
||||
for r in slow_endpoints:
|
||||
print(f" - {r['endpoint']} ({r['avg_response_time']:.3f}s)")
|
||||
|
||||
if __name__ == "__main__":
|
||||
tester = SimplePerformanceTester()
|
||||
results = tester.run_tests()
|
||||
|
||||
# Exit code based on performance
|
||||
avg_success_rate = statistics.mean([r['success_rate'] for r in results])
|
||||
if avg_success_rate >= 80:
|
||||
print("\n✅ PERFORMANCE TESTS PASSED")
|
||||
exit(0)
|
||||
else:
|
||||
print("\n⚠️ PERFORMANCE TESTS NEED REVIEW")
|
||||
exit(1)
|
||||
Reference in New Issue
Block a user