import pytest import time import sys import os # Ensure project root is in path sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) from api_hook_client import ApiHookClient # Session-wide storage for comparing metrics _shared_metrics = {} def test_performance_benchmarking(live_gui: tuple) -> None: """ Collects performance metrics for the current GUI script. """ process, gui_script = live_gui client = ApiHookClient() # Wait for app to stabilize and render some frames time.sleep(3.0) # Collect metrics over 5 seconds fps_values = [] cpu_values = [] frame_time_values = [] start_time = time.time() while time.time() - start_time < 5: try: perf_data = client.get_performance() metrics = perf_data.get('performance', {}) if metrics: fps = metrics.get('fps', 0.0) cpu = metrics.get('cpu_percent', 0.0) ft = metrics.get('last_frame_time_ms', 0.0) if fps > 0: fps_values.append(fps) cpu_values.append(cpu) frame_time_values.append(ft) time.sleep(0.1) except Exception: break avg_fps = sum(fps_values) / len(fps_values) if fps_values else 0 avg_cpu = sum(cpu_values) / len(cpu_values) if cpu_values else 0 avg_ft = sum(frame_time_values) / len(frame_time_values) if frame_time_values else 0 _shared_metrics[gui_script] = { "avg_fps": avg_fps, "avg_cpu": avg_cpu, "avg_ft": avg_ft } print(f"\n[Test] Results for {gui_script}: FPS={avg_fps:.2f}, CPU={avg_cpu:.2f}%, FT={avg_ft:.2f}ms") # Absolute minimum requirements if avg_fps > 0: assert avg_fps >= 30, f"{gui_script} FPS {avg_fps:.2f} is below 30 FPS threshold" assert avg_ft <= 33.3, f"{gui_script} Frame time {avg_ft:.2f}ms is above 33.3ms threshold" def test_performance_baseline_check() -> None: """ Verifies that we have performance metrics for gui_2.py. """ if "gui_2.py" not in _shared_metrics: pytest.skip("Metrics for gui_2.py not yet collected.") gui2_m = _shared_metrics["gui_2.py"] assert gui2_m["avg_fps"] >= 30 assert gui2_m["avg_ft"] <= 33.3