关于 ln-635-test-isolation-auditor
用于审查自动化测试是否隔离、确定且可信的 Worker 技能。它检查依赖控制和测试行为,报告问题及合规分数,但不修改测试。
主要功能
- 01检查 API、数据库、文件系统和网络隔离
- 02审查时间与随机性控制
- 03检测不稳定及顺序依赖测试
- 04标记共享状态和依赖控制问题
- 05计算合规分数
适用场景
- 01评估自动化测试结果的可信度
- 02发现依赖真实外部服务的测试
- 03定位测试不稳定的原因
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ levnikolaevich/ claude-code-skills --skill ln-635-test-isolation-auditor安装后在 Claude Code 中输入/ln-635-test-isolation-auditor确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/audit_scoring.mdaudit_summary_contract.mdaudit_worker_core_contract.mdrisk_based_testing_guide.mdrisk_based_testing_methodology.mdtwo_layer_detection.mdreferences/templates/audit_worker_report_template.md详细介绍
路径: 文件路径(
references/、../ln-*)均相对于此技能目录。
可信度审计员(L3 Worker)
类型: L3 Worker
专门审计自动化测试结果是否具有确定性、隔离性和可信度的工作器。
目的与范围
- 审计测试可信度(类别 5:中优先级)
- 检查确定性、隔离性和依赖控制
- 检测不稳定测试、对时间/随机性/顺序的依赖、共享状态以及真实外部依赖
- 发出
REWRITE_FOR_DETERMINISM或DELETE_IF_LOW_VALUE - 计算合规评分(X/10)
输入
必须读取: 加载 references/audit_worker_core_contract.md。
接收包含以下内容的 contextStore:tech_stack、testFilesMetadata、codebase_root、output_dir。
工作流
检测策略:使用两层检测(候选项扫描,然后进行上下文验证);仅在验证方法不明确时加载 references/two_layer_detection.md。
- 解析上下文: 从 contextStore 提取技术栈、可信度检查清单、测试文件列表和 output_dir
- 检查隔离性(第 1 层): 检查 6 个类别的隔离情况(API、DB、FS、时间、随机性、网络)
2b) 上下文分析(第 2 层——必须执行): 对每个隔离违规项,判断:
- 这是否是一个集成测试?(有意使用真实依赖)-> 不要标记。仅标记单元测试中的隔离问题
- 是否通过测试配置设置了内存数据库(grep 中不可见)?-> 跳过
- 这是否是为其他测试设置模拟对象的测试辅助工具?-> 跳过
- 检查确定性: 检查不稳定测试、依赖时间的断言、依赖顺序的测试以及共享可变状态
- 评估可信度处理方式: 默认使用
REWRITE_FOR_DETERMINISM;只有在明显的本地证据表明测试既不可信又价值低时,才使用DELETE_IF_LOW_VALUE - 收集发现: 记录每个违规项的严重程度、位置(文件:行号)、工作量估算(S/M/L)、处理方式和建议
- 计算评分: 按严重程度统计违规项,计算合规评分(X/10)
- 撰写报告: 根据
references/templates/audit_worker_report_template.md在内存中构建完整的 Markdown 报告,并通过一次 Write 调用写入{output_dir}/ln-635--global.md - 返回摘要: 向协调器返回最简摘要(见输出格式)
审计规则:测试隔离性
1. 外部 API
良好: 使用模拟(jest.mock、sinon、nock) 不良: 向外部 API 发起真实 HTTP 调用
检测:
- 搜索没有模拟的
axios.get、fetch(、http.request - 检查测试是否进行了实际网络调用
严重程度: 高
建议: 确保外部 API 调用受到控制(使用模拟、存根或测试服务器)。工具的选择取决于项目技术栈。例外: 集成测试预期使用真实依赖——不要标记
工作量: M
2. 数据库
良好: 使用内存数据库(sqlite :memory:)或模拟 不良: 使用真实数据库(PostgreSQL、MySQL)
检测:
- 检查数据库连接字符串(localhost:5432、真实数据库 URL)
- 搜索没有
:memory:的beforeAll(async () => { await db.connect() })
严重程度: 中
建议: 确保数据库状态受到控制,并在各次测试运行之间相互隔离。例外: 通过配置使用内存数据库的集成测试 -> 跳过
工作量: M-L
3. 文件系统
良好: 使用模拟(mock-fs、vol) 不良: 读取/写入真实文件
检测:
- 搜索没有模拟的
fs.readFile、fs.writeFile - 检查测试是否创建/删除真实文件
严重程度: 中
建议: 确保文件系统操作相互隔离(使用模拟、临时目录或清理)。工具的选择取决于项目技术栈
工作量: S-M
4. 时间/日期
**良好:**使用模拟时间(jest.useFakeTimers、sinon.useFakeTimers)
**不佳:**未使用模拟时间的 new Date()、Date.now()
检测:
- 在未使用
useFakeTimers的测试文件中搜索new Date()
严重性: 中
**建议:**确保依赖时间的逻辑使用受控时钟(模拟计时器、注入时钟或时间提供器)。工具选择取决于项目技术栈
工作量: S
5. 随机数
**良好:**使用带种子的随机数(Math.seedrandom、固定种子)
**不佳:**未设置种子的 Math.random()
检测:
- 搜索未设置种子的
Math.random()
严重性: 低
**建议:**使用带种子的随机数,确保测试具有确定性
工作量: S
6. 网络
**良好:**使用模拟(Express 使用 supertest,不占用真实端口)
**不佳:**发起真实网络请求(localhost:3000、绑定端口)
检测:
- 在测试中搜索
app.listen(3000) - 检查是否发起了真实 HTTP 请求
严重性: 中
**建议:**使用 supertest(不占用真实端口)
工作量: M
审计规则:确定性
1. 不稳定测试
**说明:**结果随机通过或失败的测试
检测:
- 多次运行测试,检查结果是否不一致
- 搜索未正确等待的
setTimeout、setInterval - 检查竞态条件(异步操作未等待)
严重性: 高
**建议:**修复竞态条件,正确使用 async/await
工作量: M-L
2. 依赖时间的断言
**说明:**对当前时间进行断言(expect(timestamp).toBeCloseTo(Date.now()))
检测:
- 在断言中搜索
Date.now()、new Date()
严重性: 中
**建议:**模拟时间
工作量: S
3. 依赖顺序的测试
**说明:**以不同顺序运行时会失败的测试
检测:
- 以随机顺序运行测试,检查是否失败
- 搜索测试之间共享的可变状态
严重性: 中
**建议:**隔离测试,并在 beforeEach 中重置状态
工作量: M
4. 共享的可变状态
**说明:**在多个测试中被修改的全局变量
检测:
- 搜索模块级别的
let globalVar - 检查测试之间是否共享状态
严重性: 中
**建议:**使用 beforeEach 重置状态
工作量: S-M
审计规则:可信度拖累因素
1. 过长且共享设置的测试(>100 行)
**说明:**超过 100 行、测试场景过多的测试
检测:
- 统计每个测试的行数
- 如果超过 100 行 -> 巨型测试
严重性: 中
**建议:**拆分为聚焦的测试(每个测试一个场景)
工作量: S-M
2. 慢速测试(>5 秒)
**说明:**运行时间超过 5 秒的测试
检测:
- 测量测试耗时
- 如果超过 5 秒 -> 慢速测试
严重性: 中
**建议:**根据项目技术栈,使用测试替身或内存服务控制外部依赖;只有在确认隔离后才并行运行
工作量: M
3. 连体双胞胎(未控制依赖的单元测试)
**说明:**标记为“Unit”但未模拟依赖的测试
检测:
- 检查测试名称是否包含“Unit”
- 验证是否模拟了所有依赖
- 如果没有模拟 -> 实际上是集成测试
严重性: 低
**建议:**模拟依赖,或将其重命名为集成测试
工作量: S
4. 默认值盲区(仅使用默认配置的测试)
**说明:**仅使用默认配置值的测试。使用 references/risk_based_testing_guide.md 中的非默认配置规则;只有在需要示例时才加载 references/risk_based_testing_methodology.md。
检测:
- 在测试设置中搜索常见默认值:
:8080、:3000、30000、limit: 20、offset: 0 - 检查测试配置值是否与框架/库的默认值一致
- 在源代码中查找
|| DEFAULT模式,并检查是否存在匹配的测试值
严重性: 高
工作量: S
评分算法
**必须阅读:**加载 references/audit_scoring.md。
严重性映射:
- 不稳定测试、未受控的外部 API、默认值盲区 -> HIGH
- 真实数据库、文件系统、时间/日期、网络、过度庞大的共享设置、慢速测试 -> MEDIUM
- 未设种子的随机性、依赖顺序、孪生依赖 -> LOW
输出格式
**必须阅读:**加载 references/templates/audit_worker_report_template.md。
按照 references/audit_summary_contract.md 编写 JSON 摘要。在托管模式下,调用方会同时传入 runId 和 summaryArtifactPath;在独立模式下,Worker 会按照共享契约生成自己的、限定于本次运行的工件路径。
将报告写入 {output_dir}/ln-635--global.md,并设置 category: "Test Trustworthiness",检查项包括:api_isolation、db_isolation、fs_isolation、time_isolation、random_isolation、network_isolation、flaky_tests、order_dependency、shared_state、default_value_blindness。
按照 references/audit_summary_contract.md 返回摘要。
当 summaryArtifactPath 不存在时,将独立运行时摘要写入 .hex-skills/runtime-artifacts/runs/{run_id}/evaluation-worker/{worker}--{identifier}.json,并可选择在结构化输出中回显相同摘要。
Report written: .hex-skills/runtime-artifacts/runs/{run_id}/audit-report/ln-635--global.md
Score: X.X/10 | Issues: N (C:N H:N M:N L:N)
**注意:**检查结果会合并为一个数组。使用 principle 字段前缀(Isolation / Determinism / Dependency Control)识别问题类别。每条检查结果都包含 action: "REWRITE_FOR_DETERMINISM" 或 action: "DELETE_IF_LOW_VALUE"。
关键规则
应用已加载的 references/audit_worker_core_contract.md。
- **不要自动修复:**仅报告问题
- **合理评估工作量:**S = <1h,M = 1-4h,L = >4h
- **扁平化检查结果:**将隔离性、确定性和依赖控制方面的检查结果合并到同一个 findings 数组中,使用
principle前缀进行区分 - **结合上下文判断:**使用真实 Express 应用的 Supertest 可接受用于集成测试
- **独特关注点:**仅审计测试结果是否可信。不要评估产品行为、E2E 流程价值、投资组合价值、缺失的覆盖率、预期结果的可靠性、人工证据或结构。
- **必须指定操作:**每条检查结果都使用
REWRITE_FOR_DETERMINISM,除非有证据表明该测试价值过低,应使用DELETE_IF_LOW_VALUE。
**监控(2.1.98+):**对于预计每次运行耗时超过 30s 的重复测试,使用 Monitor。备用方案:Bash(run_in_background=true)。
完成定义
应用已加载的 references/audit_worker_core_contract.md。
- contextStore 解析成功(包括 output_dir)
- 已完成全部 3 个审计组:
- 隔离性(6 个类别:API、DB、FS、时间、随机性、网络)
- 确定性(4 项检查:不稳定测试、依赖时间、依赖顺序、共享状态)
- 依赖控制(过度庞大的共享设置、慢速测试、耦合依赖、默认值盲区)
- 已收集检查结果,并包含严重性、位置、工作量、操作和建议
- 已使用惩罚算法计算分数
- 已将报告写入
{output_dir}/ln-635--global.md(通过一次原子 Write 调用) - 已按照契约写入摘要
**版本:**3.0.0 **最后更新:**2025-12-23