277 lines
8.9 KiB
Python
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()
|
|
|