Files
PlexPlaylistSync/tests/REGEX_TESTS_SUMMARY.md
T

8.7 KiB
Raw Blame History

正则路径替换功能测试总结

📊 测试统计

  • 总测试数: 46 个
  • 测试状态: 全部通过
  • 执行时间: ~0.4 秒
  • 覆盖范围: 正则编译、路径替换、预处理、边界情况、性能测试

🎯 测试文件

tests/test_regex_path_replacement.py - 正则路径替换功能的全面测试套件

📝 测试分类

1. TestCompileRegexRules (7 个测试)

测试正则规则编译功能

  • test_compile_simple_pattern - 简单正则模式编译
  • test_compile_multiple_patterns - 多个正则模式编译
  • test_compile_empty_pattern_skipped - 跳过空模式
  • test_compile_missing_pattern_skipped - 跳过缺失模式
  • test_compile_invalid_regex_skipped - 跳过无效正则表达式
  • test_compile_empty_replacement - 空替换字符串
  • test_compile_missing_replacement - 缺失替换字符串(默认为空)

关键测试点:

  • 编译过程容错性(跳过无效规则)
  • 边界情况处理(空/缺失值)

2. TestApplyCompiledRulesToPaths (5 个测试)

测试应用已编译的正则规则到路径

  • test_apply_single_rule - 应用单个规则
  • test_apply_multiple_rules_in_order - 按顺序应用多个规则
  • test_apply_no_rules - 没有规则时返回原路径
  • test_apply_no_match - 规则不匹配时保持原路径
  • test_apply_partial_match - 部分路径匹配

关键测试点:

  • 规则顺序执行
  • 链式替换(第一个规则的输出作为第二个规则的输入)
  • 部分匹配处理

3. TestApplyRegexRulesToPaths (17 个测试)

测试完整的路径正则替换流程

基础替换

  • test_simple_replacement - 简单字符串替换
  • test_windows_path_replacement - Windows 路径替换
  • test_unc_path_replacement - UNC 网络路径替换

高级正则功能

  • test_case_sensitive_replacement - 大小写敏感替换
  • test_case_insensitive_replacement - 大小写不敏感替换((?i) 标志)
  • test_regex_special_characters - 正则特殊字符处理
  • test_capture_group_replacement - 捕获组替换 \1
  • test_multiple_capture_groups - 多个捕获组交换位置

实用场景

  • test_delete_pattern - 删除匹配内容(替换为空)
  • test_multiple_matches_in_path - 路径中多次匹配
  • test_chained_replacements - 链式替换(NAS 路径转换)
  • test_url_encoding_path - URL 编码路径处理
  • test_unicode_path - Unicode 路径支持

边界情况

  • test_empty_rules_list - 空规则列表
  • test_empty_paths_list - 空路径列表

关键测试点:

  • 各种路径格式(Windows、Linux、UNC、URL 编码)
  • 正则高级特性(捕获组、标志)
  • 国际化支持(Unicode

4. TestPreprocessPlaylistText (7 个测试)

测试预处理播放列表文本(含正则替换)

  • test_preprocess_with_replacements - 带替换的预处理
  • test_preprocess_removes_comments - 移除注释
  • test_preprocess_empty_text - 空文本处理
  • test_preprocess_with_blank_lines - 处理空行
  • test_preprocess_real_world_scenario - 真实场景:NAS 路径转换
  • test_preprocess_with_compiled_rules - 使用预编译规则
  • test_preprocess_preserves_order - 保持顺序

关键测试点:

  • 完整的播放列表处理流程
  • 注释和空行过滤
  • 真实使用场景验证

真实场景示例:

# 输入
\\koha9-nas\koha9-nas\Music\Rock\track.flac
/music/cache/temp.flac

# 规则
1. \\koha9-nas\koha9-nas\Music  N:\Music
2. /music/cache/  /data/music/
3. \  /

# 输出
N:/Music/Rock/track.flac
/data/music/temp.flac

5. TestEdgeCases (9 个测试)

测试边界情况和异常场景

  • test_very_long_path - 超长路径(1000+ 字符)
  • test_special_characters_in_path - 特殊字符 []()&#
  • test_dot_in_path - 相对路径符号 ../ ./
  • test_trailing_slash - 尾部斜杠处理
  • test_duplicate_slashes - 重复斜杠 // ///
  • test_mixed_path_separators - 混合路径分隔符 \ /
  • test_regex_metacharacters_in_replacement - 替换字符串中的元字符
  • test_empty_string_replacement - 替换为空字符串
  • test_replacement_creates_invalid_path - 可能产生无效路径

关键测试点:

  • 极端输入处理
  • 路径规范化场景
  • 错误容忍性

6. TestPerformance (3 个测试)

测试性能相关场景

  • test_large_playlist - 大型播放列表(10,000 首歌曲)
  • test_many_rules - 大量规则(5+ 个规则链式执行)
  • test_complex_regex_pattern - 复杂正则表达式

性能示例:

# 复杂正则模式
Pattern: /music/(.+?) - (.+?) \((\d+)\) \[([^\]]+)\]/
Input:   /music/Artist - Album (2024) [FLAC]/01. Track.flac
Output:  /library/FLAC/2024/Artist/Album/01. Track.flac

关键测试点:

  • 大数据量处理能力
  • 复杂模式匹配性能
  • 规则链执行效率

🔍 覆盖的功能点

核心功能

  • 正则规则编译和验证
  • 规则按顺序应用到路径
  • 播放列表文本预处理
  • 捕获组和反向引用
  • 大小写敏感/不敏感匹配

路径类型

  • Linux/Unix 绝对路径 /path/to/file
  • Windows 绝对路径 C:\path\to\file
  • UNC 网络路径 \\server\share\file
  • 相对路径 ../path/./file
  • URL 编码路径 /artist%20name/track.mp3
  • Unicode 路径 /音乐/专辑/歌曲.mp3

正则特性

  • 简单字符串匹配
  • 特殊字符转义 ()[].*+?
  • 捕获组 (pattern) 和引用 \1
  • 不区分大小写 (?i)
  • 量词 *+?{n}
  • 字符类 [^/]+ \d+ \w+

边界情况

  • 空输入(规则/路径)
  • 无效正则表达式
  • 不匹配的规则
  • 超长路径
  • 特殊字符
  • 链式替换

容错性

  • 跳过空模式
  • 跳过无效正则
  • 默认替换为空字符串
  • 保留不匹配的路径

🎓 测试用例示例

基础替换

paths = ["/old/path/file.mp3"]
rules = [{"pattern": r"/old/", "replacement": "/new/"}]
# 结果: ["/new/path/file.mp3"]

捕获组替换

paths = ["/music/2024/album/track.mp3"]
rules = [{"pattern": r"/music/(\d+)/", "replacement": r"/archive/\1/"}]
# 结果: ["/archive/2024/album/track.mp3"]

链式替换(真实场景)

paths = [r"\\nas\Music\Album\track.mp3"]
rules = [
    {"pattern": r"\\\\nas\\Music", "replacement": "/mnt/music"},
    {"pattern": r"\\", "replacement": "/"},
]
# 结果: ["/mnt/music/Album/track.mp3"]

复杂模式匹配

paths = ["/music/Artist - Album (2024) [FLAC]/01. Track.flac"]
rules = [
    {
        "pattern": r"/music/(.+?) - (.+?) \((\d+)\) \[([^\]]+)\]/",
        "replacement": r"/library/\4/\3/\1/\2/"
    }
]
# 结果: ["/library/FLAC/2024/Artist/Album/01. Track.flac"]

🚀 运行测试

运行正则替换测试

pytest tests/test_regex_path_replacement.py -v

运行特定测试类

pytest tests/test_regex_path_replacement.py::TestApplyRegexRulesToPaths -v

运行特定测试

pytest tests/test_regex_path_replacement.py::TestPreprocessPlaylistText::test_preprocess_real_world_scenario -v

查看测试覆盖率

pytest tests/test_regex_path_replacement.py --cov=app.utils.playlist_merge --cov-report=term

💡 测试最佳实践

本测试套件遵循的最佳实践:

  1. 分类清晰 - 按功能层级组织测试类
  2. 命名规范 - 测试名称清楚描述测试内容
  3. 独立性 - 每个测试独立运行,无依赖
  4. 覆盖全面 - 正常流程、边界情况、错误处理全覆盖
  5. 文档化 - 每个测试都有描述性文档字符串
  6. 真实场景 - 包含实际使用场景的测试用例
  7. 性能考虑 - 包含大数据量和复杂模式的性能测试

📈 测试价值

这套测试为正则路径替换功能提供了:

  • 信心保证 - 46 个测试覆盖各种场景
  • 回归防护 - 修改代码时快速验证功能完整性
  • 文档作用 - 测试即使用示例和功能文档
  • 重构支持 - 安全重构代码而不破坏功能
  • Bug 预防 - 边界情况测试防止潜在 Bug

🔧 维护建议

  1. 添加新功能时同步添加测试
  2. 发现 Bug 时先写失败测试,再修复
  3. 定期运行完整测试套件
  4. 保持测试更新与代码变更同步
  5. 关注覆盖率保持 80% 以上

相关文件

  • 测试文件: tests/test_regex_path_replacement.py
  • 被测代码: app/utils/playlist_merge.py
  • 相关函数:
    • _compile_regex_rules()
    • _apply_compiled_rules_to_paths()
    • apply_regex_rules_to_paths()
    • preprocess_playlist_text()