{ "testedAt": "2026-09-28T12:35:02", "scope": "文档契约黑盒测试(README 为准)", "sandbox": "C:\\Users\\Shuery\\AppData\\Local\\Temp\\baknret-bb-45647a8d", "total": 11, "passed": 9, "failed": 2, "fatalOrSevere": 0, "cases": [ { "Id": "BB-01", "Module": "备份", "Title": "文档承诺:备份成功返回 0,并产出 .7z 归档", "Priority": "P0", "Precondition": "沙盒清单:1 个目录(含排除)+ 1 个不存在的源", "Steps": "Backup-Data.ps1(无 -DryRun)", "Expected": "退出码 0;Backups\\ 下出现 1 个 .7z;manifest.json 存在", "Actual": "退出码=0;归档=1 个(srcdocs_from_C_+Users+Shuery+AppData+Local+Temp+baknret-bb-45647a8d.7z)", "Status": "PASS", "Severity": "" }, { "Id": "BB-02", "Module": "排除", "Title": "文档承诺::- 排除模式把内容挡在归档之外", "Priority": "P0", "Precondition": "清单里对源目录写了 :- 'nested\\skipme.log'", "Steps": "7z l 列出归档内容", "Expected": "归档里**没有** skipme.log,但有 a.txt 与 b.txt", "Actual": "skipme.log 命中=False;a/b.txt 命中=True", "Status": "PASS", "Severity": "" }, { "Id": "BB-03", "Module": "干跑", "Title": "文档承诺:-DryRun 一个字节都不写(含 manifest.json)", "Priority": "P0", "Precondition": "已有 1 份归档与 manifest.json", "Steps": "记录 SHA256 → 跑 -DryRun → 再记录 SHA256", "Expected": "退出码 0;manifest.json 的 SHA256 前后完全一致", "Actual": "退出码=0;哈希 6D726A618FD8 → 6D726A618FD8", "Status": "PASS", "Severity": "" }, { "Id": "BB-04", "Module": "异常流", "Title": "文档承诺:源路径不存在记 missing-source,不算失败", "Priority": "P1", "Precondition": "清单第 2 行指向不存在的目录", "Steps": "跑备份后读 manifest.json 的 action 字段", "Expected": "该条目 action=missing-source,且整体退出码仍为 0", "Actual": "退出码=0;manifest action 分布=backed-up,missing-source", "Status": "PASS", "Severity": "" }, { "Id": "BB-05", "Module": "干跑", "Title": "文档承诺:-Only 只处理匹配的条目", "Priority": "P1", "Precondition": "清单 2 条:srcdocs(目录)、nonexistent(不存在)", "Steps": "Backup-Data.ps1 -DryRun -Only 'srcdocs'", "Expected": "退出码 0;输出里不出现未选中的 nonexistent 条目", "Actual": "退出码=0;输出提到 nonexistent=False", "Status": "PASS", "Severity": "" }, { "Id": "BB-06", "Module": "异常流", "Title": "边界值:清单文件不存在时的行为", "Priority": "P1", "Precondition": "传入一个不存在的 -BackupListPath", "Steps": "Backup-Data.ps1 -BackupListPath <不存在>", "Expected": "明确报错(非 0 退出码)或给出可读提示,**不得静默返回 0**", "Actual": "退出码=0;末行=[2026-09-28 12:34:54] [INFO] 模板 BackupList.txt 已创建,请编辑后重试。", "Status": "FAIL", "Severity": "一般" }, { "Id": "BB-07", "Module": "兼容", "Title": "文档承诺:旧名字 Backup.ps1 是转发垫片,退出码原样传递", "Priority": "P1", "Precondition": "实现已改名为 Backup-Data.ps1", "Steps": "Backup.ps1 -DryRun(旧名字)", "Expected": "打印改名提示;退出码与直接调用一致(0)", "Actual": "退出码=0;有改名提示=True", "Status": "PASS", "Severity": "" }, { "Id": "BB-08", "Module": "跨端一致性", "Title": "文档承诺:Windows PowerShell 5.1 与 7.x 行为一致", "Priority": "P0", "Precondition": "同一沙盒、同一清单", "Steps": "两个宿主各跑一次 -DryRun,比较退出码", "Expected": "两者退出码都是 0(GBK 控制台下的中文输出不崩)", "Actual": "7 退出码=0;5.1 退出码=0", "Status": "PASS", "Severity": "" }, { "Id": "BB-09", "Module": "边界值", "Title": "特殊字符:含 & 与 # 的路径(整行引号写法)", "Priority": "P2", "Precondition": "源目录名含 & 与 #;清单行整体加引号", "Steps": "备份该条目", "Expected": "退出码 0 且真的产出归档(# 不被当注释吃掉)", "Actual": "退出码=0;归档数=1", "Status": "PASS", "Severity": "" }, { "Id": "BB-10", "Module": "无头", "Title": "文档承诺:没有控制台且没给 -InputScript 时报错退出,绝不挂起", "Priority": "P0", "Precondition": "stdout/stderr 被重定向(等价于计划任务/管道环境)", "Steps": "不传参数直接运行 Manage-Backup.ps1,等待最多 60 秒", "Expected": "60 秒内退出,退出码 2,并提示\"没有可用的控制台\"", "Actual": "60 秒内退出=True;退出码=2;输出片段=û�п��õĿ���̨��Ҳû�и��� -InputScript���޷����뽻�����档\r\nҪ�ǽ���ִ�У���ָ�����������磺-Action Backup ", "Status": "PASS", "Severity": "" }, { "Id": "BB-11", "Module": "审计", "Title": "文档承诺:孤儿归档会被点名", "Priority": "P1", "Precondition": "Backups3\\ 里放一个清单中不存在的 GhostSoftware.7z", "Steps": "备份后看输出是否点名", "Expected": "输出里出现该孤儿归档名", "Actual": "退出码=0;点名=False", "Status": "FAIL", "Severity": "一般" } ] }