mxivideo/scripts/test_modular_commander.py

388 lines
13 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
测试模块化的Commander
"""
import sys
from pathlib import Path
# 添加项目根目录到Python路径
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
def test_modular_imports():
"""测试模块化导入"""
print("🔍 测试模块化导入")
print("=" * 50)
try:
# 测试基础模块导入
from python_core.utils.commander.types import CommandConfig
from python_core.utils.commander.parser import ArgumentParser
from python_core.utils.commander.base import JSONRPCCommander
from python_core.utils.commander.simple import SimpleJSONRPCCommander, create_simple_commander
print("✅ 基础模块导入成功")
# 测试统一导入
from python_core.utils.commander import (
CommandConfig, ArgumentParser, JSONRPCCommander,
SimpleJSONRPCCommander, create_simple_commander
)
print("✅ 统一导入成功")
# 测试进度模块导入
from python_core.utils.progress import (
ProgressInfo, TaskResult, ProgressiveTask,
ProgressJSONRPCCommander, create_progress_commander
)
print("✅ 进度模块导入成功")
return True
except ImportError as e:
print(f"❌ 导入失败: {e}")
return False
except Exception as e:
print(f"❌ 测试失败: {e}")
return False
def test_command_config():
"""测试命令配置"""
print("\n📋 测试命令配置")
print("=" * 50)
try:
from python_core.utils.commander.types import CommandConfig
# 创建命令配置
config = CommandConfig(
name="test_command",
description="测试命令",
required_args=["input"],
optional_args={
"output": {"type": str, "default": "output.txt"},
"verbose": {"type": bool, "default": False}
}
)
print(f"✅ 命令配置创建成功: {config.name}")
print(f" 描述: {config.description}")
print(f" 必需参数: {config.required_args}")
print(f" 可选参数: {list(config.optional_args.keys())}")
return True
except Exception as e:
print(f"❌ 命令配置测试失败: {e}")
return False
def test_argument_parser():
"""测试参数解析器"""
print("\n🔧 测试参数解析器")
print("=" * 50)
try:
from python_core.utils.commander.types import CommandConfig
from python_core.utils.commander.parser import ArgumentParser
# 创建命令配置
commands = {
"process": CommandConfig(
name="process",
description="处理文件",
required_args=["input_file"],
optional_args={
"output": {"type": str, "default": "output.txt"},
"format": {"type": str, "default": "json", "choices": ["json", "xml"]},
"verbose": {"type": bool, "default": False}
}
)
}
# 创建解析器
parser = ArgumentParser(commands)
# 测试解析
test_cases = [
(["process", "input.txt"], True),
(["process", "input.txt", "--output", "result.txt"], True),
(["process", "input.txt", "--format", "xml", "--verbose"], True),
(["unknown"], False), # 未知命令
(["process"], False), # 缺少必需参数
]
for args, should_succeed in test_cases:
try:
command, parsed_args = parser.parse_arguments(args)
if should_succeed:
print(f"✅ 解析成功: {args} -> {command}, {parsed_args}")
else:
print(f"⚠️ 预期失败但成功了: {args}")
except ValueError as e:
if not should_succeed:
print(f"✅ 预期失败: {args} -> {e}")
else:
print(f"❌ 意外失败: {args} -> {e}")
return True
except Exception as e:
print(f"❌ 参数解析器测试失败: {e}")
return False
def test_simple_commander():
"""测试简单Commander"""
print("\n🚀 测试简单Commander")
print("=" * 50)
try:
from python_core.utils.commander import create_simple_commander
# 创建Commander
commander = create_simple_commander("test_service")
# 定义处理函数
def hello_handler(name: str = "World"):
return {"message": f"Hello, {name}!"}
def add_handler(a: str, b: str):
return {"result": float(a) + float(b)}
# 添加命令
commander.add_command(
name="hello",
handler=hello_handler,
description="打招呼",
optional_args={
"name": {"type": str, "default": "World"}
}
)
commander.add_command(
name="add",
handler=add_handler,
description="加法运算",
required_args=["a", "b"]
)
print("✅ 命令注册成功")
# 测试命令执行
test_cases = [
(["hello"], {"message": "Hello, World!"}),
(["hello", "--name", "Alice"], {"message": "Hello, Alice!"}),
(["add", "5", "3"], {"result": 8.0}),
]
for args, expected in test_cases:
try:
command, parsed_args = commander.parse_arguments(args)
result = commander.execute_command(command, parsed_args)
if result == expected:
print(f"✅ 命令测试成功: {args} -> {result}")
else:
print(f"❌ 结果不匹配: {args} -> 期望 {expected}, 得到 {result}")
return False
except Exception as e:
print(f"❌ 命令执行失败: {args} -> {e}")
return False
return True
except Exception as e:
print(f"❌ 简单Commander测试失败: {e}")
return False
def test_video_splitter_integration():
"""测试视频拆分服务集成"""
print("\n🎬 测试视频拆分服务集成")
print("=" * 50)
try:
# 检查依赖
try:
import scenedetect
print(f"✅ PySceneDetect {scenedetect.__version__} 可用")
except ImportError:
print("⚠️ PySceneDetect不可用跳过视频拆分集成测试")
return True
from python_core.services.video_splitter.cli import VideoSplitterCommander
# 创建Commander
commander = VideoSplitterCommander()
print("✅ 视频拆分Commander创建成功")
# 检查注册的命令
commands = list(commander.commands.keys())
expected_commands = ["analyze", "detect_scenes"]
for cmd in expected_commands:
if cmd in commands:
print(f"✅ 命令 '{cmd}' 已注册")
else:
print(f"❌ 命令 '{cmd}' 未注册")
return False
# 测试参数解析
test_args = ["analyze", "test.mp4", "--threshold", "30.0"]
try:
command, parsed_args = commander.parse_arguments(test_args)
print(f"✅ 参数解析成功: {command}, {parsed_args}")
except Exception as e:
print(f"❌ 参数解析失败: {e}")
return False
return True
except Exception as e:
print(f"❌ 视频拆分集成测试失败: {e}")
return False
def test_file_structure():
"""测试文件结构"""
print("\n📁 测试文件结构")
print("=" * 50)
try:
# 检查Commander模块文件
commander_files = [
"python_core/utils/commander/__init__.py",
"python_core/utils/commander/types.py",
"python_core/utils/commander/parser.py",
"python_core/utils/commander/base.py",
"python_core/utils/commander/simple.py"
]
for file_path in commander_files:
full_path = project_root / file_path
if full_path.exists():
print(f"{file_path} 存在")
else:
print(f"{file_path} 不存在")
return False
# 检查Progress模块文件
progress_files = [
"python_core/utils/progress/__init__.py",
"python_core/utils/progress/types.py",
"python_core/utils/progress/task.py",
"python_core/utils/progress/reporter.py",
"python_core/utils/progress/generator.py",
"python_core/utils/progress/decorators.py",
"python_core/utils/progress/commander.py"
]
for file_path in progress_files:
full_path = project_root / file_path
if full_path.exists():
print(f"{file_path} 存在")
else:
print(f"{file_path} 不存在")
return False
# 检查原文件是否已删除
old_files = [
"python_core/utils/jsonrpc_commander.py",
"python_core/utils/progress_commander.py"
]
for file_path in old_files:
full_path = project_root / file_path
if not full_path.exists():
print(f"{file_path} 已删除")
else:
print(f"⚠️ {file_path} 仍然存在")
return True
except Exception as e:
print(f"❌ 文件结构测试失败: {e}")
return False
def main():
"""主函数"""
print("🚀 测试模块化Commander")
try:
# 运行所有测试
tests = [
test_modular_imports,
test_command_config,
test_argument_parser,
test_simple_commander,
test_video_splitter_integration,
test_file_structure
]
results = []
for test in tests:
try:
result = test()
results.append(result)
except Exception as e:
print(f"❌ 测试 {test.__name__} 异常: {e}")
results.append(False)
# 总结
print("\n" + "=" * 60)
print("📊 模块化Commander测试总结")
print("=" * 60)
passed = sum(results)
total = len(results)
print(f"通过测试: {passed}/{total}")
if passed == total:
print("🎉 所有模块化测试通过!")
print("\n✅ 模块化优势:")
print(" 1. 代码组织 - 每个模块职责单一明确")
print(" 2. 易于维护 - 修改某个功能只需改对应模块")
print(" 3. 可重用性 - 模块可以独立使用")
print(" 4. 测试友好 - 可以单独测试每个模块")
print(" 5. 扩展性强 - 新功能可以独立添加")
print("\n📁 模块结构:")
print(" commander/")
print(" ├── types.py - 数据类型定义")
print(" ├── parser.py - 参数解析器")
print(" ├── base.py - 基础Commander类")
print(" ├── simple.py - 简化Commander类")
print(" └── __init__.py - 统一导入接口")
print(" ")
print(" progress/")
print(" ├── types.py - 进度相关类型")
print(" ├── task.py - 任务管理")
print(" ├── reporter.py - 进度报告")
print(" ├── generator.py - 进度生成器")
print(" ├── decorators.py - 装饰器")
print(" ├── commander.py - 进度Commander")
print(" └── __init__.py - 统一导入接口")
print("\n🎯 使用方式:")
print(" # 基础Commander")
print(" from python_core.utils.commander import JSONRPCCommander")
print(" # 简单Commander")
print(" from python_core.utils.commander import create_simple_commander")
print(" # 进度Commander")
print(" from python_core.utils.progress import ProgressJSONRPCCommander")
return 0
else:
print("⚠️ 部分模块化测试失败")
return 1
except Exception as e:
print(f"❌ 测试过程中出错: {e}")
import traceback
traceback.print_exc()
return 1
if __name__ == "__main__":
exit_code = main()
sys.exit(exit_code)