Files
PlexPlaylistSync/tests/REGEX_TESTS_SUMMARY.md
T

284 lines
8.7 KiB
Markdown
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.
# 正则路径替换功能测试总结
## 📊 测试统计
- **总测试数**: 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` - 保持顺序
**关键测试点**:
- 完整的播放列表处理流程
- 注释和空行过滤
- 真实使用场景验证
**真实场景示例**:
```python
# 输入
\\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` - 复杂正则表达式
**性能示例**:
```python
# 复杂正则模式
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+`
### 边界情况
- ✅ 空输入(规则/路径)
- ✅ 无效正则表达式
- ✅ 不匹配的规则
- ✅ 超长路径
- ✅ 特殊字符
- ✅ 链式替换
### 容错性
- ✅ 跳过空模式
- ✅ 跳过无效正则
- ✅ 默认替换为空字符串
- ✅ 保留不匹配的路径
## 🎓 测试用例示例
### 基础替换
```python
paths = ["/old/path/file.mp3"]
rules = [{"pattern": r"/old/", "replacement": "/new/"}]
# 结果: ["/new/path/file.mp3"]
```
### 捕获组替换
```python
paths = ["/music/2024/album/track.mp3"]
rules = [{"pattern": r"/music/(\d+)/", "replacement": r"/archive/\1/"}]
# 结果: ["/archive/2024/album/track.mp3"]
```
### 链式替换(真实场景)
```python
paths = [r"\\nas\Music\Album\track.mp3"]
rules = [
{"pattern": r"\\\\nas\\Music", "replacement": "/mnt/music"},
{"pattern": r"\\", "replacement": "/"},
]
# 结果: ["/mnt/music/Album/track.mp3"]
```
### 复杂模式匹配
```python
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"]
```
## 🚀 运行测试
### 运行正则替换测试
```bash
pytest tests/test_regex_path_replacement.py -v
```
### 运行特定测试类
```bash
pytest tests/test_regex_path_replacement.py::TestApplyRegexRulesToPaths -v
```
### 运行特定测试
```bash
pytest tests/test_regex_path_replacement.py::TestPreprocessPlaylistText::test_preprocess_real_world_scenario -v
```
### 查看测试覆盖率
```bash
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()`