mcpField
L
ln-635-test-isolation-auditor

ln-635-test-isolation-auditor

github.com/levnikolaevich测试与质量584376 次安装2 天前更新
代码仓库

关于 ln-635-test-isolation-auditor

用于审查自动化测试是否隔离、确定且可信的 Worker 技能。它检查依赖控制和测试行为,报告问题及合规分数,但不修改测试。

主要功能

  1. 01检查 API、数据库、文件系统和网络隔离
  2. 02审查时间与随机性控制
  3. 03检测不稳定及顺序依赖测试
  4. 04标记共享状态和依赖控制问题
  5. 05计算合规分数

适用场景

  1. 01评估自动化测试结果的可信度
  2. 02发现依赖真实外部服务的测试
  3. 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.md
audit_summary_contract.md
audit_worker_core_contract.md
risk_based_testing_guide.md
risk_based_testing_methodology.md
two_layer_detection.md
references/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。

  1. 解析上下文: 从 contextStore 提取技术栈、可信度检查清单、测试文件列表和 output_dir
  2. 检查隔离性(第 1 层): 检查 6 个类别的隔离情况(API、DB、FS、时间、随机性、网络) 2b) 上下文分析(第 2 层——必须执行): 对每个隔离违规项,判断:
    • 这是否是一个集成测试?(有意使用真实依赖)-> 不要标记。仅标记单元测试中的隔离问题
    • 是否通过测试配置设置了内存数据库(grep 中不可见)?-> 跳过
    • 这是否是为其他测试设置模拟对象的测试辅助工具?-> 跳过
  3. 检查确定性: 检查不稳定测试、依赖时间的断言、依赖顺序的测试以及共享可变状态
  4. 评估可信度处理方式: 默认使用 REWRITE_FOR_DETERMINISM;只有在明显的本地证据表明测试既不可信又价值低时,才使用 DELETE_IF_LOW_VALUE
  5. 收集发现: 记录每个违规项的严重程度、位置(文件:行号)、工作量估算(S/M/L)、处理方式和建议
  6. 计算评分: 按严重程度统计违规项,计算合规评分(X/10)
  7. 撰写报告: 根据 references/templates/audit_worker_report_template.md 在内存中构建完整的 Markdown 报告,并通过一次 Write 调用写入 {output_dir}/ln-635--global.md
  8. 返回摘要: 向协调器返回最简摘要(见输出格式)

审计规则:测试隔离性

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

评论

支持 Markdown