Files
PlexPlaylistSync/tests/REGEX_TESTS_QUICKREF.md
T

3.2 KiB

🎯 正则路径替换测试 - 快速参考

测试状态

✅ 59/59 测试通过
⚡ 执行时间: 0.56s
📦 包含: 13 个合并测试 + 46 个正则测试

🚀 快速运行

# 运行所有测试
pytest tests/

# 只运行正则测试
pytest tests/test_regex_path_replacement.py -v

# 运行特定测试类
pytest tests/test_regex_path_replacement.py::TestApplyRegexRulesToPaths -v

# 查看覆盖率
pytest tests/test_regex_path_replacement.py --cov=app.utils.playlist_merge

📋 测试分类

测试类 数量 说明
TestCompileRegexRules 7 正则编译和验证
TestApplyCompiledRulesToPaths 5 应用已编译规则
TestApplyRegexRulesToPaths 17 完整替换流程
TestPreprocessPlaylistText 7 播放列表预处理
TestEdgeCases 9 边界情况处理
TestPerformance 3 性能测试

💡 常用示例

简单替换

rules = [{"pattern": r"/old/", "replacement": "/new/"}]
"/old/music/track.mp3"  "/new/music/track.mp3"

Windows 路径

rules = [{"pattern": r"C:\\Music", "replacement": r"D:\\Audio"}]
r"C:\Music\track.mp3"  r"D:\Audio\track.mp3"

捕获组

rules = [{"pattern": r"/(\d+)/", "replacement": r"/year-\1/"}]
"/music/2024/track.mp3"  "/music/year-2024/track.mp3"

NAS 路径转换(真实场景)

rules = [
    {"pattern": r"\\\\nas\\Music", "replacement": r"N:\\Music"},
    {"pattern": r"\\", "replacement": "/"},
]
r"\\nas\Music\Album\track.mp3"  "N:/Music/Album/track.mp3"

🎨 测试覆盖的场景

路径类型

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

正则特性

  • 简单匹配 foo
  • 特殊字符 \(\d+\)
  • 捕获组 (pattern)\1
  • 不区分大小写 (?i)pattern
  • 字符类 [A-Z]+ \d+ \w+

边界情况

  • 空输入(规则/路径)
  • 无效正则表达式
  • 超长路径 (1000+ 字符)
  • 特殊字符 []()&#
  • 链式替换

性能测试

  • 10,000 首歌曲的播放列表
  • 5+ 条规则链式执行
  • 复杂正则模式匹配

📖 相关文档

  • 详细总结: tests/REGEX_TESTS_SUMMARY.md
  • 测试文件: tests/test_regex_path_replacement.py
  • 被测代码: app/utils/playlist_merge.py

🔍 调试技巧

# 显示详细输出
pytest tests/test_regex_path_replacement.py -v -s

# 遇到第一个失败就停止
pytest tests/test_regex_path_replacement.py -x

# 进入调试器
pytest tests/test_regex_path_replacement.py --pdb

# 只运行失败的测试
pytest tests/test_regex_path_replacement.py --lf

🎓 测试即文档

每个测试都是一个使用示例,查看测试代码了解如何使用正则替换功能!

# 示例: 查看如何使用捕获组
def test_capture_group_replacement():
    paths = ["/music/2024/album/track.mp3"]
    rules = [{"pattern": r"/music/(\d+)/", "replacement": r"/archive/\1/"}]
    result = apply_regex_rules_to_paths(paths, rules)
    assert result == ["/archive/2024/album/track.mp3"]