mxivideo/scripts/test_simple_no_fallback.py

261 lines
8.5 KiB
Python
Raw 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
"""
简化的测试:验证移除降级逻辑的效果
"""
import sys
from pathlib import Path
# 添加项目根目录到Python路径
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
def test_basic_functionality():
"""测试基本功能"""
print("🎯 测试基本功能")
print("=" * 50)
try:
# 检查PySceneDetect
try:
import scenedetect
print(f"✅ PySceneDetect {scenedetect.__version__} 可用")
except ImportError:
print("❌ PySceneDetect不可用这会导致明确的错误")
return True # 这是预期的行为
# 测试导入
from python_core.services.video_splitter import VideoSplitterService, DetectionConfig, DetectorType
print("✅ 模块导入成功")
# 测试服务创建
service = VideoSplitterService()
print("✅ 服务创建成功")
# 查找测试视频
assets_dir = project_root / "assets"
video_files = list(assets_dir.rglob("*.mp4"))
if not video_files:
print("⚠️ 没有找到测试视频,跳过视频分析测试")
return True
test_video = str(video_files[0])
print(f"📹 测试视频: {test_video}")
# 测试视频分析
config = DetectionConfig(threshold=30.0, detector_type=DetectorType.CONTENT)
result = service.analyze_video(test_video, config)
if result.success:
print(f"✅ 视频分析成功:")
print(f" 总场景数: {result.total_scenes}")
print(f" 总时长: {result.total_duration:.2f}")
print(f" 分析时间: {result.analysis_time:.2f}")
else:
print(f"❌ 视频分析失败: {result.error}")
return False
return True
except Exception as e:
print(f"❌ 测试失败: {e}")
# 如果是依赖相关的错误,这是预期的
if "DependencyError" in str(type(e)) or "PySceneDetect" in str(e):
print("✅ 这是预期的依赖错误,说明快速失败机制工作正常")
return True
return False
def test_validation_without_fallback():
"""测试没有降级的验证"""
print("\n🛡️ 测试没有降级的验证")
print("=" * 50)
try:
from python_core.services.video_splitter.types import SceneInfo, DetectionConfig, ValidationError
# 测试数据验证
print("🔍 测试数据验证...")
# 正确的数据应该成功
valid_scene = SceneInfo(
scene_number=1,
start_time=0.0,
end_time=5.0,
duration=5.0,
start_frame=0,
end_frame=120
)
print("✅ 正确数据创建成功")
# 错误的数据应该立即失败
try:
invalid_scene = SceneInfo(
scene_number=0, # 无效
start_time=0.0,
end_time=5.0,
duration=5.0,
start_frame=0,
end_frame=120
)
print("❌ 应该抛出验证错误")
return False
except ValidationError as e:
print(f"✅ 正确抛出验证错误: {e}")
# 测试配置验证
valid_config = DetectionConfig(threshold=30.0)
print("✅ 正确配置创建成功")
try:
invalid_config = DetectionConfig(threshold=150.0) # 超出范围
print("❌ 应该抛出配置验证错误")
return False
except ValidationError as e:
print(f"✅ 正确抛出配置验证错误: {e}")
return True
except Exception as e:
print(f"❌ 验证测试失败: {e}")
return False
def test_error_clarity():
"""测试错误信息的清晰性"""
print("\n🔍 测试错误信息的清晰性")
print("=" * 50)
try:
from python_core.services.video_splitter.validators import BasicVideoValidator
from python_core.services.video_splitter.types import ValidationError
validator = BasicVideoValidator()
# 测试不存在文件的错误信息
try:
validator.validate("/clearly/nonexistent/path/video.mp4")
print("❌ 应该抛出错误")
return False
except ValidationError as e:
error_msg = str(e)
print(f"✅ 错误信息: {error_msg}")
# 验证错误信息包含有用信息
if "not found" in error_msg and "/clearly/nonexistent/path/video.mp4" in error_msg:
print("✅ 错误信息包含完整路径和明确描述")
else:
print("⚠️ 错误信息可能不够详细")
return True
except Exception as e:
print(f"❌ 错误清晰性测试失败: {e}")
return False
def test_no_silent_failures():
"""测试没有静默失败"""
print("\n🚫 测试没有静默失败")
print("=" * 50)
try:
# 检查依赖
try:
import scenedetect
except ImportError:
print("⚠️ PySceneDetect不可用跳过此测试")
return True
from python_core.services.video_splitter import VideoSplitterService
service = VideoSplitterService()
# 测试无效输入,应该明确失败而不是静默
result = service.analyze_video("/invalid/path.mp4")
# 结果应该明确标记为失败
if result.success:
print("❌ 应该失败但标记为成功")
return False
# 应该有明确的错误信息
if not result.error:
print("❌ 失败但没有错误信息")
return False
print(f"✅ 明确失败,错误信息: {result.error}")
# 错误信息应该有用
if "not found" in result.error.lower() or "invalid" in result.error.lower():
print("✅ 错误信息有用且具体")
else:
print(f"⚠️ 错误信息可能不够具体: {result.error}")
return True
except Exception as e:
print(f"❌ 静默失败测试失败: {e}")
return False
def main():
"""主函数"""
print("🚀 简化测试:验证移除降级逻辑的效果")
try:
# 运行测试
tests = [
test_basic_functionality,
test_validation_without_fallback,
test_error_clarity,
test_no_silent_failures
]
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("📊 移除降级逻辑测试总结")
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(" 1. 立即失败 - 发现问题立即抛出异常")
print(" 2. 明确信息 - 提供足够的上下文信息")
print(" 3. 结构化异常 - 使用专门的异常类型")
print(" 4. 完整传播 - 保持错误信息的完整性")
print(" 5. 用户友好 - 错误信息对用户有帮助")
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)