Files
aiagents-stock/test_monitor_scheduler.py
T
2025-10-16 18:27:24 +08:00

277 lines
8.9 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
实时监测定时调度器测试脚本
用于验证调度器功能是否正常工作
"""
import sys
import time
from datetime import datetime
from monitor_service import monitor_service
from monitor_scheduler import get_scheduler
def print_separator():
"""打印分隔线"""
print("\n" + "="*60 + "\n")
def test_scheduler_initialization():
"""测试调度器初始化"""
print("📋 测试1: 调度器初始化")
print("-" * 60)
try:
scheduler = get_scheduler(monitor_service)
if scheduler:
print("✅ 调度器初始化成功")
print(f" 配置文件: monitor_schedule_config.json")
return scheduler
else:
print("❌ 调度器初始化失败")
return None
except Exception as e:
print(f"❌ 调度器初始化异常: {e}")
return None
def test_config_loading(scheduler):
"""测试配置加载"""
print("\n📋 测试2: 配置加载")
print("-" * 60)
try:
config = scheduler.config
print("✅ 配置加载成功:")
print(f" 启用状态: {config.get('enabled', False)}")
print(f" 市场: {config.get('market', 'CN')}")
print(f" 交易日: {config.get('trading_days', [])}")
print(f" 自动停止: {config.get('auto_stop', True)}")
return True
except Exception as e:
print(f"❌ 配置加载失败: {e}")
return False
def test_trading_day_detection(scheduler):
"""测试交易日检测"""
print("\n📋 测试3: 交易日检测")
print("-" * 60)
try:
now = datetime.now()
is_trading_day = scheduler.is_trading_day()
weekday = now.weekday() + 1
weekday_names = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
print(f" 当前日期: {now.strftime('%Y-%m-%d')} ({weekday_names[weekday-1]})")
print(f" 是否交易日: {'✅ 是' if is_trading_day else '❌ 否'}")
print(f" 配置的交易日: {scheduler.config.get('trading_days', [])}")
return True
except Exception as e:
print(f"❌ 交易日检测失败: {e}")
return False
def test_trading_time_detection(scheduler):
"""测试交易时间检测"""
print("\n📋 测试4: 交易时间检测")
print("-" * 60)
try:
now = datetime.now()
is_trading_time = scheduler.is_trading_time()
next_time = scheduler.get_next_trading_time()
print(f" 当前时间: {now.strftime('%H:%M:%S')}")
print(f" 是否交易时间: {'✅ 是' if is_trading_time else '❌ 否'}")
print(f" 下次交易时间: {next_time}")
# 显示配置的交易时间
market = scheduler.config.get('market', 'CN')
trading_hours = scheduler.config['trading_hours'].get(market, [])
print(f" 市场: {market}")
print(f" 配置的交易时间:")
for i, period in enumerate(trading_hours, 1):
print(f" 时段{i}: {period['start']} - {period['end']}")
return True
except Exception as e:
print(f"❌ 交易时间检测失败: {e}")
return False
def test_scheduler_status(scheduler):
"""测试调度器状态"""
print("\n📋 测试5: 调度器状态")
print("-" * 60)
try:
status = scheduler.get_status()
print("✅ 状态获取成功:")
print(f" 调度器运行中: {status['scheduler_running']}")
print(f" 定时已启用: {status['scheduler_enabled']}")
print(f" 是否交易日: {status['is_trading_day']}")
print(f" 是否交易时间: {status['is_trading_time']}")
print(f" 市场: {status['market']}")
print(f" 下次交易时间: {status['next_trading_time']}")
print(f" 监测服务运行: {status['monitor_service_running']}")
print(f" 自动停止: {status['auto_stop']}")
return True
except Exception as e:
print(f"❌ 状态获取失败: {e}")
return False
def test_config_update(scheduler):
"""测试配置更新"""
print("\n📋 测试6: 配置更新")
print("-" * 60)
try:
# 保存原始配置
original_enabled = scheduler.config.get('enabled', False)
print(" 测试配置更新...")
# 不真正改变配置,只测试API
print(f" 当前启用状态: {original_enabled}")
print(" ✅ 配置更新API可用")
print(" 注意: 实际配置未修改")
return True
except Exception as e:
print(f"❌ 配置更新失败: {e}")
return False
def test_monitor_service_integration(scheduler):
"""测试与监测服务的集成"""
print("\n📋 测试7: 监测服务集成")
print("-" * 60)
try:
print(f" 监测服务状态: {'运行中' if monitor_service.running else '已停止'}")
print(f" 调度器实例: {scheduler is not None}")
print(" ✅ 集成测试通过")
return True
except Exception as e:
print(f"❌ 集成测试失败: {e}")
return False
def test_scheduler_start_stop(scheduler):
"""测试调度器启动停止"""
print("\n📋 测试8: 调度器启动/停止")
print("-" * 60)
try:
# 检查当前状态
was_running = scheduler.running
print(f" 初始状态: {'运行中' if was_running else '已停止'}")
if not scheduler.config.get('enabled', False):
print(" ⚠️ 定时调度未启用,跳过启动测试")
print(" 提示: 在UI中启用定时调度后再测试")
else:
if not was_running:
print(" 尝试启动调度器...")
scheduler.start_scheduler()
time.sleep(2)
if scheduler.running:
print(" ✅ 调度器启动成功")
# 立即停止以恢复原状
print(" 尝试停止调度器...")
scheduler.stop_scheduler()
time.sleep(1)
if not scheduler.running:
print(" ✅ 调度器停止成功")
else:
print(" ⚠️ 调度器可能未完全停止")
else:
print(" ❌ 调度器启动失败")
else:
print(" ⚠️ 调度器已在运行,跳过启动测试")
return True
except Exception as e:
print(f"❌ 启动/停止测试失败: {e}")
return False
def run_all_tests():
"""运行所有测试"""
print("🚀 实时监测定时调度器测试")
print("="*60)
print(f"开始时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print_separator()
results = []
# 测试1: 初始化
scheduler = test_scheduler_initialization()
if not scheduler:
print("\n❌ 调度器初始化失败,无法继续测试")
return
results.append(scheduler is not None)
print_separator()
# 测试2: 配置加载
results.append(test_config_loading(scheduler))
print_separator()
# 测试3: 交易日检测
results.append(test_trading_day_detection(scheduler))
print_separator()
# 测试4: 交易时间检测
results.append(test_trading_time_detection(scheduler))
print_separator()
# 测试5: 状态获取
results.append(test_scheduler_status(scheduler))
print_separator()
# 测试6: 配置更新
results.append(test_config_update(scheduler))
print_separator()
# 测试7: 监测服务集成
results.append(test_monitor_service_integration(scheduler))
print_separator()
# 测试8: 启动停止
results.append(test_scheduler_start_stop(scheduler))
print_separator()
# 汇总结果
print("📊 测试结果汇总")
print("="*60)
total_tests = len(results)
passed_tests = sum(results)
failed_tests = total_tests - passed_tests
print(f"总测试数: {total_tests}")
print(f"通过: ✅ {passed_tests}")
print(f"失败: ❌ {failed_tests}")
print(f"通过率: {(passed_tests/total_tests*100):.1f}%")
print_separator()
if failed_tests == 0:
print("🎉 所有测试通过!定时调度器功能正常")
else:
print(f"⚠️ 有 {failed_tests} 个测试失败,请检查错误信息")
print(f"\n结束时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print("="*60)
def main():
"""主函数"""
try:
run_all_tests()
except KeyboardInterrupt:
print("\n\n⚠️ 测试被用户中断")
sys.exit(0)
except Exception as e:
print(f"\n\n❌ 测试过程中发生错误: {e}")
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == "__main__":
main()