Vitest --changed 漏掉被删依赖:空结果不能替代完整测试
删除仍被测试导入的文件后,变化筛选可能成功退出,完整运行却报模块不存在。为删除路径保留完整测试分支。
删掉一个测试仍在导入的文件,vitest run --changed 却显示 No affected test files found,退出码为 0;完整运行才报 Cannot find module。若本次变更包含删除文件,应检查变化筛选是否失去了原有依赖边。
这条具体路径出现在 Vitest 5.0.4,既可能涉及测试的直接 import,也可能藏在 setup 文件的 import 中。即使文件名是普通英文,删除后也可能漏跑;文件名转义的修复并不覆盖这条依赖图路径。
删除后,当前依赖图无法再解析旧路径
设 a.test.js 仍有 import { value } from './helper.js',而这次提交删除了 helper.js。Git 能报告删除路径,不代表 Vite 的当前模块解析还能把它连接到测试。
受影响的筛选器沿当前可解析模块建立联系。文件已经不存在,导入解析没有给出原来的目标节点,变化列表中的已删除路径就可能找不到可达测试。测试文件本身未被修改时,最终得到空集合;这不是证明删除无影响。
先确认实际命令使用的比较基准、Git 状态,以及失败文件是否属于配置中的测试范围。如果直接运行同一文件也找不到它,应先修正测试 include 或路径;如果完整运行可以发现模块加载错误,才符合这里的筛选缺口。
对包含删除的变更执行完整测试
在尚未确认目标正式版已补齐删除依赖跟踪前,让这类变更进入完整测试任务:
vitest run
命令表示使用项目已经安装、原本用于 CI 的 Vitest 入口;通过 npm、pnpm 或其他脚本运行时,应保留原来的配置、项目选择、环境变量和测试隔离。完整运行会增加资源与耗时,需要按项目已有 CI 预算安排。
如果流水线依据 Git 差异决定走完整任务,要使用与 --changed 一致的比较基准,并正确解析删除状态及路径。不要用一个随意的工作区 git diff 代替提交范围,也不要按换行拆分任意文件名后拼 shell 命令。无法可靠覆盖这些条件时,关键合并门槛直接跑完整集更容易核验。
不要加 --passWithNoTests 来“修复”空结果。故障本来就以成功结束,进一步允许空运行只会掩盖缺失。也不应恢复一个已经确定要删除的业务文件,仅仅为了让筛选器重新发现边。
验收必须让缺失依赖真正失败
在受控分支保留“测试仍引用、目标文件已删除”的状态,确认完整任务能收集到该测试并以模块加载错误失败。再正确移除导入或更新测试,确认任务恢复通过;setup 间接导入也应单独覆盖。
采用后续工具版本时,以相同删除条件检查筛选结果,不能只看普通修改文件已被发现。已核对的正式 5.0.5 仍沿当前可解析导入构建这条关系,因此这里只给完整运行兜底,不承诺从 5.0.4 升到 5.0.5 就能恢复删除文件的历史依赖跟踪。


