Files
MoviePilot/docs/testing-cleanup.md

6.1 KiB
Raw Blame History

后端测试清理审计

范围与方法

  • 日期2026-09-06。
  • 基准:v3976cecce8f72291516be74419cfc23922e99eef0,开始工作时本地与 origin/v3 一致。
  • tests/test_*.py 进行 AST 静态筛查,共 739 个文件、7,311 个测试函数/方法定义;该数字不是参数化展开后的 pytest 用例数。
  • 筛查空执行体、同名覆盖、完全重复执行体、重复参数化输入、无直接断言和语句包含关系再人工核对入口、fixture、输入、断言与状态差异。
  • 未发现纯空测试或重复参数化输入。静态相似性只用于找候选,不是自动删除规则;本轮不声称所有测试均已完成逐条业务审计。

已清理

仅删除以下 6 个冗余测试定义,保留全部独立断言和被测入口。生产代码、公共测试设施、数据库迁移、兼容清单和质量门槛均不修改。

文件 删除用例 保留覆盖及依据
tests/test_agent_background_output.py test_background_non_streaming_does_not_send_by_default 同类的 test_background_non_streaming_captures_without_sending_when_capture_only 执行体完全相同。两者都显式设置 ReplyMode.CAPTURE_ONLY,旧名称实际没有验证默认值。
tests/test_agent_summarization_streaming.py test_real_agent_does_not_recompact_small_tool_result_during_same_loop test_real_agent_executes_compacted_tool_call_once 使用相同真实 graph、模型响应及工具已同时断言工具执行一次、摘要一次、模型调用两次和最终结果。合并说明以保留两种回归意图。
tests/test_fs_proxy_copy.py test_worker_still_standalone_after_streaming_support tests/test_fs_proxy.py::test_worker_does_not_import_app_package 对同一 worker 源码做完全相同的断言;同文件还保留独立子进程启动验证。删除后顺带移除不再使用的 Path 导入。
tests/test_media_interaction.py test_noai_prefix_preserves_traditional_interaction_priority_after_search test_message_routes_text_reply_to_media_interaction_before_ai 执行体完全相同。删除用例并未发送 /noai,只构造同一会话后发送 1;实际 /noai 创建会话的专项测试保留。
tests/test_plugin_database_lifecycle.py test_remove_plugin_only_releases_the_database test_stop_releases_the_database_and_never_destroys_it 执行体完全相同,都只调用 lifecycle.stop。真正的卸载、删除数据及分身库销毁测试保留。
tests/test_metamusic.py test_apply_title_keeps_single_word_title test_apply_title_keeps_artist_abbreviation_dots 使用相同输入 E.S.Posthumus - Maraboot,已有完全相同的曲名断言并额外断言艺术家。合并说明以保留单词曲名不应被当作发布组的回归意图。

未机械删除

  • 架构、模块/事件合同、SDK/旧导入 ABI、数据库迁移测试它们约束当前仍需支持的入口或升级路径不是历史重构完成后即可删除的临时测试。
  • test_media_interaction.py 的过期敏感输入测试:直接过期与被另一用户触发清理后的迟到输入属于不同状态,不能因后者包含前者的语句就删掉前者。
  • test_transfer_job_manager.py 的相同元数据任务测试:是否调用 migrate_task 会改变作业关联状态,两条路径分别保留。
  • test_chain_external_ports.py 的未装配与重复初始化/重置测试:即使最终都断言端口未配置,之前是否装配过的状态不同。
  • test_security_utils.py 的公网 DNS 允许与异步缓存测试:保留独立同步安全决策与跨入口缓存契约,不以覆盖率重叠替代行为判断。
  • PostgreSQL、平台和 Rust 条件跳过测试:条件代表受支持的运行环境,不能把本机未执行误判为失效。
  • 无直接断言候选中,迁移验证、辅助断言、兼容导入和“不抛异常”测试仍有契约意义;不批量删除。
  • test_agent_image_support.py 的显式关闭图片能力用例与布尔配置用例存在重叠,但属于存量 TestCase 文件。本轮不为删除一个分支用例触发整文件转换,后续修改该文件时按“改到即转”一起合并。

验证

所有命令均使用项目 .venv 对应的 uv run --locked --no-sync 环境。

验证 结果
Agent 输出/压缩、文件代理、媒体交互、插件数据库生命周期,含保留 worker 用例的 6 个文件 清理前 160 passed清理后 155 passed
test_metamusic.py 清理前 86 passed清理后 85 passed
第一组生产代码覆盖 前后逐文件 executed_linesexecuted_branches 集合完全一致,均覆盖 35,597 行、1,228 条分支
音乐标题组生产代码覆盖 前后逐文件集合完全一致,均覆盖 23,538 行、325 条分支
保留用例 AST 复核 排除 docstring 后,全部保留用例的函数定义一致;仅删除表中 6 个定义
清理后重复扫描 7,305 个测试定义,按本轮 AST 规则未再发现完全重复的执行体
python tests/run.py -q --durations=10 4 个分片全部通过,合计 8,437 passed、9 skipped
改动 Python 文件 Pylint 10.00/10无诊断
git diff --check 通过

提交前已快进同步到 be415175208c2f7a3c1ebf556cc80c72cf322e10,上游音乐修复未触及本次清理文件。重新运行清理涉及的 7 个测试文件及上游音乐相关的 5 个测试文件,结果为 539 passed上表的扫描数量和覆盖率仍对应审计基准不混用不同提交的测量结果。

覆盖采集前后都有 sysmon 不支持动态 contexts 的提示,因此这里只比较汇总行/分支集合,不宣称逐用例 context 数据完整。全量运行结束阶段出现子进程/文件句柄的 ResourceWarning,不影响退出码;提示中的子进程在检查时已退出。本轮没有为消除警告修改公共测试设施。

覆盖率对比是辅助证据,删除决定仍以上述相同输入、状态和断言映射为准。本机为 macOS/Python 3.14,不写入 Ubuntu canonical 覆盖率基线。