8.7 KiB
8.7 KiB
正则路径替换功能测试总结
📊 测试统计
- 总测试数: 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
💡 测试最佳实践
本测试套件遵循的最佳实践:
- 分类清晰 - 按功能层级组织测试类
- 命名规范 - 测试名称清楚描述测试内容
- 独立性 - 每个测试独立运行,无依赖
- 覆盖全面 - 正常流程、边界情况、错误处理全覆盖
- 文档化 - 每个测试都有描述性文档字符串
- 真实场景 - 包含实际使用场景的测试用例
- 性能考虑 - 包含大数据量和复杂模式的性能测试
📈 测试价值
这套测试为正则路径替换功能提供了:
- 信心保证 - 46 个测试覆盖各种场景
- 回归防护 - 修改代码时快速验证功能完整性
- 文档作用 - 测试即使用示例和功能文档
- 重构支持 - 安全重构代码而不破坏功能
- Bug 预防 - 边界情况测试防止潜在 Bug
🔧 维护建议
- 添加新功能时同步添加测试
- 发现 Bug 时先写失败测试,再修复
- 定期运行完整测试套件
- 保持测试更新与代码变更同步
- 关注覆盖率保持 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()