#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 系统综合测试脚本 用于验证各个模块是否正常工作 """ import cv2 import numpy as np import sys import traceback import requests import json import time def test_opencv(): """测试OpenCV是否正常工作""" print("=" * 50) print("测试 OpenCV...") try: print(f"OpenCV 版本: {cv2.__version__}") # 测试摄像头 cap = cv2.VideoCapture(0) if cap.isOpened(): print("✓ 摄像头可以正常打开") ret, frame = cap.read() if ret: print(f"✓ 摄像头可以正常读取画面,分辨率: {frame.shape[1]}x{frame.shape[0]}") else: print("✗ 无法从摄像头读取画面") cap.release() else: print("✗ 无法打开摄像头") return True except Exception as e: print(f"✗ OpenCV 测试失败: {e}") return False def test_yolo_model(): """测试YOLO模型是否正常工作""" print("=" * 50) print("测试 YOLO 模型...") try: from ultralytics import YOLO print("✓ ultralytics 库导入成功") # 尝试加载模型 model = YOLO('yolov8n.pt') print("✓ YOLOv8n 模型加载成功") # 创建一个测试图像 test_image = np.zeros((640, 480, 3), dtype=np.uint8) results = model(test_image, verbose=False) print("✓ YOLO 推理测试成功") return True except Exception as e: print(f"✗ YOLO 模型测试失败: {e}") traceback.print_exc() return False def test_modules(): """测试自定义模块""" print("=" * 50) print("测试自定义模块...") try: # 测试配置模块 from src import config print("✓ config 模块导入成功") # 测试距离计算模块 from src import DistanceCalculator calculator = DistanceCalculator() test_bbox = [100, 100, 200, 400] # 测试边界框 distance = calculator.get_distance(test_bbox) print(f"✓ distance_calculator 模块测试成功,测试距离: {calculator.format_distance(distance)}") # 测试人体检测模块 from src import PersonDetector detector = PersonDetector() print("✓ person_detector 模块导入成功") # 测试地图管理器 from src import MapManager map_manager = MapManager( api_key=config.GAODE_API_KEY, camera_lat=config.CAMERA_LATITUDE, camera_lng=config.CAMERA_LONGITUDE ) print("✓ map_manager 模块导入成功") # 测试手机连接器 from src import MobileConnector mobile_connector = MobileConnector(port=8081) # 使用不同端口避免冲突 print("✓ mobile_connector 模块导入成功") return True except Exception as e: print(f"✗ 自定义模块测试失败: {e}") traceback.print_exc() return False def test_flask(): """测试Flask是否安装""" print("=" * 50) print("测试 Flask 环境...") try: import flask print(f"✓ Flask 导入成功,版本: {flask.__version__}") # 测试Web服务器模块 from src import WebServer print("✓ WebServer 模块导入成功") return True except ImportError: print("✗ Flask 未安装,Web功能不可用") return False except Exception as e: print(f"✗ Flask 测试失败: {e}") return False def test_web_apis(base_url="http://127.0.0.1:5000"): """测试Web API接口(仅在服务器运行时测试)""" print("=" * 50) print("测试Web API接口...") try: # 测试主页面 response = requests.get(f"{base_url}/", timeout=5) if response.status_code == 200: print("✓ 主页面访问正常") # 测试人员数据API response = requests.get(f"{base_url}/api/get_persons_data", timeout=5) if response.status_code == 200: data = response.json() print(f"✓ 人员数据API正常: {len(data)} 个人员") # 测试调试信息API response = requests.get(f"{base_url}/api/debug_info", timeout=5) if response.status_code == 200: data = response.json() print(f"✓ 调试信息API正常") print(f" 摄像头状态: {'在线' if data.get('camera_active') else '离线'}") # 测试手机相关API response = requests.get(f"{base_url}/api/mobile/devices", timeout=5) if response.status_code == 200: devices = response.json() print(f"✓ 手机设备API正常: {len(devices)} 个设备") # 测试手机端页面 response = requests.get(f"{base_url}/mobile/mobile_client.html", timeout=5) if response.status_code == 200: print(f"✓ 手机端页面可访问") return True else: print("✗ Web服务器未响应") return False except requests.exceptions.ConnectionError: print("⚠️ Web服务器未运行,跳过API测试") return True # 不算失败,因为服务器可能没启动 except Exception as e: print(f"✗ Web API测试失败: {e}") return False def main(): """主测试函数""" print("🔧 开始系统综合测试...") print("测试将验证所有必要的组件是否正常工作") tests = [ ("OpenCV", test_opencv), ("YOLO模型", test_yolo_model), ("自定义模块", test_modules), ("Flask环境", test_flask), ("Web API", test_web_apis), ] results = {} for test_name, test_func in tests: print(f"\n🧪 开始测试: {test_name}") results[test_name] = test_func() # 显示测试结果摘要 print("\n" + "=" * 50) print("📊 测试结果摘要:") print("=" * 50) passed = 0 total = len(tests) for test_name, result in results.items(): status = "✓ 通过" if result else "✗ 失败" print(f"{test_name:<15}: {status}") if result: passed += 1 print(f"\n总体结果: {passed}/{total} 测试通过") if passed >= total - 1: # 允许Web API测试失败(因为可能没启动服务器) print("🎉 系统基本功能正常!") print("\n📖 使用建议:") print(" 1. 运行 'python run.py' 选择运行模式") print(" 2. 使用Web模式获得最佳体验") print(" 3. 配置摄像头位置获得准确的地图显示") else: print("⚠️ 系统存在问题,请检查相关组件") print("\n🔧 建议操作:") print(" 1. 重新运行 'python tools/install.py' 安装依赖") print(" 2. 检查requirements.txt中的依赖版本") print(" 3. 确认摄像头设备连接正常") print("\n测试完成!") if __name__ == "__main__": main()