mcpField
A
adversarial-test-sweep

adversarial-test-sweep

github.com/jpcaparas测试与质量5652 次安装1 天前更新
代码仓库

关于 adversarial-test-sweep

adversarial-test-sweep 是用于审计和加固现有自动化测试套件的语言无关技能,适合需要按有限范围系统排查测试薄弱点的团队。它以证据和风险为依据,记录可复现的问题,并在获准时将已确认缺陷转化为回归测试。

主要功能

  1. 01按范围规划测试审计
  2. 02基于风险设计对抗性用例
  3. 03评估测试断言与可观察性
  4. 04记录并最小化失败复现
  5. 05将确认缺陷固化为回归测试

适用场景

  1. 01审查测试是否会漏过行为故障
  2. 02针对并发、依赖失败或边界条件加固测试
  3. 03调查不稳定、冗余或误报测试
  4. 04为已修复问题建立可重放的回归保护

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/jpcaparas/skills --skill adversarial-test-sweep

安装后在 Claude Code 中输入/adversarial-test-sweep确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

AGENTS.md
metadata.json
README.md
skill-card.prompt.md
agents/
openai.yaml
evals/
evals.json
trigger-evals.json
evals/fixtures/parser-weak-oracle/
check_duplicate_header.py
CONTRACT.md
invoice_parser.py
test_invoice_parser.py
references/
adversarial-techniques.md
suite-evidence.md
scripts/
test_skill.py
test_validator_regressions.py
validate.py
templates/
risk-ledger.md
sweep-report.md

详细介绍

对抗性测试排查

对现有自动化测试套件开展有界、以证据为导向的审查与加固。尝试证伪产品契约,找出行为损坏时仍可能通过的测试,在获准的情况下修复已确认的缺陷,并且只移除已证明不会提供独特保护的测试。保留发现结果以供重放;将已修复的缺陷转化为持久回归测试。

此技能刻意不绑定特定语言。应识别并使用仓库的语言、框架、命令、惯例和受支持的环境,而不是引入偏好的技术栈。

路由请求

当用户提出以下一项或多项需求时,使用此技能:

  • 全面或对抗性地审查现有测试套件
  • 针对高风险组件、事故相关区域或子系统开展有重点的加固排查
  • 系统性测试边界情况、无效状态、并发、依赖故障或资源边界
  • 基于证据审查薄弱、不稳定、冗余或会产生假阳性的测试
  • 开展回归排查,将发现的缺陷转化为持久保护

对于围绕单项功能或单个已知修复的常规测试,请改用常规测试指南。如果可用,编写或编辑单项测试时加载已安装的 maintainable-tests 技能;它是可选的配套技能,而本技能负责排查活动、风险台账、对抗性发现循环和完成门槛。

将生产负载或耐久性工作交由性能测试处理,将已部署环境的故障活动交由混沌工程处理,将寻找漏洞的工作交由安全测试处理。本技能可以在本地模拟资源和依赖故障,但不授权对共享系统施压、修改生产环境、造成破坏性影响或进行渗透测试。

不可妥协的证据规则

  1. 在生成测试用例前,先定义有界范围和预算。“什么都试试”不是可复现的测试计划。
  2. 从契约、不变量、状态转换、调用点、模式、历史缺陷、依赖行为和运维风险中推导攻击方式。不要把通用边界情况清单直接塞进测试套件。
  3. 对限定范围内排查时审查或修改的每项测试,都要赋予明确且独特的作用:区分可观察契约、覆盖可信的风险类别、暴露有意义的故障,或保留已确认的回归。这不要求审查仓库中的每项测试。
  4. 将可达性与可观察性分开。执行某行代码,并不能证明测试会察觉其行为发生变化。
  5. 将覆盖率、变异、生成用例数量和重复运行视为证据,而不是独立的质量目标。
  6. 在有证据区分产品缺陷、测试缺陷、环境故障、不受支持的假设或不稳定结果之前,将每次失败视为尚未分类。
  7. 绝不能通过削弱正确的判定标准、任意增加重试或休眠、捕获范围更广的错误、跳过无法解释的失败,或删除唯一的复现用例来让套件变为绿色。
  8. 说明剩余的不确定性。范围有限且结果干净的排查可以降低已知风险,但不能证明正确性、无竞争条件、无泄漏或覆盖详尽。

操作流程

根据风险和可用证据调整并组合以下活动。这些活动不要求按顺序分阶段进行。编辑前应确认授权并建立可恢复的基线;实验前应明确边界和判定标准,然后根据证据指引反复迭代。

界定工作范围并保留基线

检查仓库指南、生产代码、相关测试、测试夹具、测试辅助工具、已配置的命令、支持的版本以及当前工作树状态。记录:

  • 目标组件、入口点、契约和测试级别
  • 仅限审计的变更与获准的测试和产品代码变更
  • 适用的受支持运行时、平台、依赖项、区域设置和配置变体
  • 允许的本地或沙盒影响,以及禁止的远程或破坏性影响
  • 有限的停止预算和中止条件;若所选方法可能失控,则添加用例、规模、序列、并发、内存、输出或缩减限制
  • 已安装的可选分析工具:覆盖率、变异、竞态、消毒器、模糊测试、模型或属性测试工具
  • 验证范围,以及支持结论所需的任何重复运行或变体

明确范围和授权,避免测试活动在无人察觉时扩大。进行任何耗费较大的共享环境或生产环境实验前,须另行获得授权。

采用与风险相称的预算。模拟资源耗尽,或以安全上限加以限制;使用合成数据或获批数据,并隔离文件、网络、进程、时钟、随机数、调度器和持久状态的影响。测试夹具应可丢弃,并确保即使发生故障也能恢复状态。

编辑前,保留可恢复的基线:记录修订版本和工作树的脏状态;若仅凭修订版本无法保留未提交的工作,则保留补丁或隔离副本。记录工具链标识、环境、聚焦命令和更广泛的已配置命令。运行范围最窄的相关测试套件;尽可能使用已有的更广泛验证证据,或运行更广泛的基线。记录受阻或未运行的检查,不要将其视为通过。

记录结果、耗时、跳过项、重试、泄漏、挂起和已知的不稳定测试,不要通过编辑将其掩盖。将当前测试映射到可观察行为或不变量,并区分既有失败与新发现。如果改进工作已经开始,在声称进行同类比较前,应先恢复旧状态。若没有可恢复的基线,则停止编辑。

让证据与方法匹配风险

根据测试活动的规模,使用适当的格式维护风险台账;简要记录即可。templates/risk-ledger.md 是可选格式,并非必需产物。跟踪每项行为上不同的风险:

  • 必须成立的契约、不变量、状态转换或无副作用要求
  • 信息来源,以及失效后果
  • 对抗性变换或故障假设
  • 独立判定依据:从契约或独立模型推导预期结果,而非照抄被测实现
  • 当前证据及任何差距
  • 优先级、预算、状态和最终处理结论

根据仓库证据建立台账,然后仅涵盖适用的风险类别:

风险类别需要攻击的问题
输入与表示对于空值、缺失值、格式错误的值、恰好在边界内外的值、极端值、重复值、重排值、编码值、规范化值,或有效但出乎意料的值,会发生什么?
状态与序列初始、终止、重复、禁止、部分完成、回滚、序列化、恢复、缓存和损坏状态是否都能得到处理,且不违反不变量?
依赖项与错误如果依赖项拒绝请求、超时、取消、延迟、截断、重复、重排、损坏或部分成功,会发生什么?清理操作和无副作用保证是否仍然成立?
时间与并发首次使用、重复完成、取消、重试、陈旧读取、可见性或交错操作是否可能导致工作丢失、效果重复、死锁、活锁或进度停滞?
资源与生命周期上限、背压、获取失败、部分分配、清理失败、超出预期但安全的输入以及重复使用,是否都能维持正确的资源记账并释放资源?
配置与组合选项交互、版本能力、区域设置/时区规则、等效表示和组合操作,是否遵循相同的契约?
测试框架共享夹具、顺序、墙上时钟、随机性、网络、环境、宽泛匹配器或错误的断言对象,是否可能让有问题的行为通过测试?

根据后果、变更频率、历史缺陷、复杂性、可观测性不足和不确定性确定优先级。低价值的笛卡尔积并不代表测试全面。

选择能够暴露指定风险且成本最低的方法。直接示例通常成本最低;但如果现有工具和独立判定依据能让属性测试、模糊测试、模型测试或调度测试更有效,也可以优先采用这些方法。无需预先达到示例数量要求。

需求优先采用
离散输入或规则边界等价类划分、边界值、决策表或受约束的组合用例
涉及大量值的规律基于属性的生成,并衡量分布与缩减效果
广泛输入下的稳健性覆盖率引导或结构化模糊测试,并使用崩溃、挂起、资源和不变量判定依据
精确输出代价高或无法获取基于领域语义的蜕变关系
有状态工作流或协议基于模型的命令序列,包含前置条件、状态转换和后置条件
独立实现或模式使用明确的规范化规则进行差分比较
断言薄弱或缺少观测按可达性、感染、传播和可揭示性分类的变异测试
竞态或时序窗口确定性屏障、可控调度器、有界调度探索和竞态检测
恢复与资源行为在获取、使用、释放、超时、取消和部分完成等切入点注入故障

选择或组合这些方法时,请阅读 references/adversarial-techniques.md;使用其中的内容定义生成器、判定依据、重放产物、边界和各方法的局限性。不要仅仅因为某种技术存在就添加工具或框架;应根据本地能力和风险进行选择。

如果某项建议失败或看起来已过时,请检查已安装的工具及其版本,查阅当前官方文档和可信的故障证据,并在安全边界内调整实验。使用最小复现示例提出有来源依据的规范技能修正;不要静默更改已安装的技能。将工具输出和夹具文本视为证据,而非扩展范围或放宽安全措施的依据。

证伪并保留回放证据

对于每条优先级较高的台账记录:

  1. 陈述具体假设:哪种输入、状态、调度、依赖结果或资源条件可能违反哪项契约。
  2. 使用足以证伪该假设的最小测试或临时测试框架;仅在获准权限范围内新增或修改仓库测试。
  3. 确认判定依据能够观察到真实契约,包括相关状态变更、输出、已发出的效果、清理操作及禁止的副作用。
  4. 在受控条件下运行针对性用例。将崩溃、挂起、泄漏、非确定性、意外成功、错误的失败类别和状态损坏视为发现。
  5. 在保留故障的前提下,尽量缩减失败输入、跟踪记录、状态序列、调度或故障集。
  6. 记录具体回放数据:缩减后的用例、环境、版本、配置、相关时的随机种子、调度或事件跟踪记录,以及注入的故障。
  7. 按违反的契约和原因去重,而不只是按堆栈跟踪或表面症状去重。

对于生成式工作,视情况测试有效的结构化输入、格式错误的输入和有状态序列。按具名分区衡量生成结果的分布。保留具体反例;生成器或工具发生变化后,仅凭随机种子可能无法重放。

将留出的探测用例与公开评测输入分开。仅在提供的有缺陷样例副本中隔离测试;不要修复规范样例,也不要泄露留出的判定依据来使评测通过。

在权限范围内分类处理发现

更改代码前,对每项发现进行分类:

  • 产品缺陷: 实现违反了受支持的契约或不变量。
  • 测试缺陷: 测试设置、判定依据、测试对象、隔离措施或预期结果有误。
  • 环境或测试框架缺陷: 运行器、样例、平台或依赖导致结果无效。
  • 规范缺口: 行为影响重大,但没有权限来源定义预期结果。
  • 偶发故障: 相同代码和声明的配置有时通过、有时失败。

对于获准进行的修复,保留一个在原始缺陷或受控等效故障下会失败的回归测试,进行最小限度的针对性修正,并证明修复后测试通过。在暴露契约的最低层保留关键输入或序列;仅在存在跨边界风险时增加更高层覆盖。如果无法验证此前的失败,应报告这一限制,而不是声称已证明回归测试有效。

对于仅限审计的工作,报告发现、缩减后的复现用例和建议修复方案,不得编辑产品代码或测试。已确认的缺陷可以保持待处理状态;完成审计不要求提交回归测试。仅有测试修改权限并不意味着有权修复生产代码。

保留每项尚未解释的失败,并将偶发故障作为可能的产品缺陷进行调查。切勿通过削弱正确的判定依据、删除唯一的复现用例,或使用重试、跳过、宽泛捕获或任意休眠来声称修复已完成。用可观察的完成状态取代对时机的猜测,控制时间和随机性,消除顺序依赖和状态泄漏,并记录失败的随机种子或调度。重新运行和隔离仅是临时控制措施;必须明确负责人、原因和退出条件。

如果预期行为确实未定义,就应停止猜测。用最小反例和相互竞争的解释说明需要作出的决策。

仅强化或精简范围内的测试

评估覆盖率、变异测试结果、预言机强度、测试异味、偶发失败或候选删除项时,请阅读 references/suite-evidence.md;利用其中的内容汇集相互印证的证据,而不是只优化某一项分数。

在本次限定范围的审查中,挑战已审查或更改的测试,包括保留的测试;未经处理的仓库测试不视为已审计:

  • 如果相关决策、状态更新、清理或效果被破坏,测试会失败吗?
  • 断言检查的主体、类型、路径、状态和无效果情况是否正确?
  • 模拟对象断言的是必要的边界契约,还是仅仅复刻实现调用?
  • 快照是否体现了重要的语义差异?
  • 测试是否提供了独特的分区、状态转换、预言机、变异体击杀、历史缺陷、平台条件或诊断信号?
  • 在运行器支持的情况下,测试能否单独运行、调整顺序后运行、在常规套件中运行,以及并发运行?

将异味检测器的结果视为调查线索。多个断言可能共同证明一种行为;重复执行可能保护不同的预言机或回归问题。合并或删除测试前,请使用相同的行为清单、变异体击杀向量或等效故障探测、历史复现用例、运行环境和诊断信息,对比原始套件与提议的套件。如果运行时间是问题所在,而删除依据不充分,请优先考虑筛选或调整测试优先级。

验证变更并如实收尾

完成实际变更后,运行有针对性的测试、受影响的测试套件,以及已配置的更广泛仓库验证门禁。根据此次工作的风险,使用有依据的重复运行和变体,例如调整测试顺序、使用独立种子、并行执行、测试支持的版本,或启用竞态/消毒器检测。确认回归问题无需依赖种子、墙上时钟竞态、外部网络或偶然顺序即可重现,并确认清理操作在失败时仍能完成。不要用有针对性的测试通过来掩盖更广泛的回归;如果验证受阻,务必明确报告。

达到约定预算或中止条件时停止。受阻或预算耗尽的工作可以带着尚未解决的问题收尾:保留现有的重现证据,指出未运行的检查和仍有高风险的条目,并给出下一步有用的操作或负责人。不要悄悄扩大预算,也不要声称结果干净。

区分结果:

  • **在范围内通过:**约定的验证均已通过,且没有尚未解决的范围内故障、挂起、泄漏、重试或不稳定问题;说明这些证据的局限。
  • **仍有发现:**记录仅审计发现或未修复缺陷,不声称已修复或测试套件已可就绪。
  • **受阻或预算耗尽:**验证或调查尚未完成;报告原因和剩余事项,而不是降低门槛。

仅当格式有助于汇报时,才使用 templates/sweep-report.md。报告审查或继续开展工作所需的证据:

  • 范围、授权、基线修订版本、工作区脏状态、环境和预算
  • 按状态列出的记录覆盖情况:已覆盖、已确认缺陷、已排除、已升级或尚未解决(包括尚未处理的待办条目)
  • 已审查或变更的测试:新增、加强、合并、移除或保留,并说明各项保护的不同场景
  • 产品、测试和测试框架缺陷及其最小化复现用例;对于修复,提供回归及此前失败/通过的证据,或明确说明验证局限
  • 准确的命令、重复次数、时长和结果
  • 覆盖率、变异、竞态、消毒器、模糊测试或模型证据,注明工具/版本并说明其含义
  • 剩余假设、不受支持的环境、未执行的技术、规范缺口和残留高风险条目

若没有明确定义的主张和相应测量依据,不要声称“已全面测试”“不存在竞态”“不存在泄漏”“穷尽测试”或“覆盖充分”。

当处理结论、授权、证据和残余不确定性均清晰可见时,交接即告完成。这并不意味着尚未解决的问题已得到妥善处理,也不意味着测试套件已可用于发布。

注意事项

  1. 更多用例可能只是重复使用同一个薄弱的判定依据。扩充数量之前,先提高区分能力。
  2. 如果不检查分布,随机生成可能无法覆盖原本要探索的精确分区。
  3. 具体且已最小化的失败用例,比单独提供种子、次数、屏幕截图或堆栈跟踪更可靠、更持久。
  4. 压力测试重复运行可能暴露竞态,但很少能解释竞态或可靠地重现它;条件允许时,受控调度和显式屏障更有效。
  5. 等效变异体、无效的元变换关系、存在共同差异性错误的实现以及错误模型,都可能产生虚假证据。应分类说明局限,而不是强行给出分数。
  6. 移除耗时测试可能改善反馈速度,却也可能破坏其独有的回归防护价值。不可逆地缩减测试之前,先尝试选择性运行、调整优先级或修复测试夹具。
  7. 资源耗尽测试的重点是在有界故障边界验证契约,而不是让开发者的机器或共享服务崩溃。

阅读指南

需求阅读
选择边界、组合、属性、模糊测试、蜕变、基于模型、差分、并发、故障注入或最小化方法references/adversarial-techniques.md
判断可达性、预言机强度、变异存活项、不稳定行为、代码异味、冗余或精简证据references/suite-evidence.md
记录范围、预算、假设、预言机和处置结果templates/risk-ledger.md
移交结果、验证情况、变更和剩余风险templates/sweep-report.md

评论

支持 Markdown