AbrarRagib/exploratory-testing-bot

GitHub: AbrarRagib/exploratory-testing-bot

一个离线运行的探索式测试 Bot,通过自动生成多样化输入并校验不变量,无需手写测试用例即可发现函数中的崩溃和逻辑缺陷。

Stars: 0 | Forks: 0

# 06 · 探索式测试 Bot 脚本化测试只能检查你*想到的*用例。而探索式测试能发现你没想到的用例。这个 Bot 会生成一组多样化的输入——有效的、边界的、无效的、对抗性的——将它们提供给目标函数,并检查 **oracle**(必须始终保持成立的不变量)。每次崩溃或被破坏的不变量都会变成一份包含精确复现步骤的 bug 报告。 它附带了一个故意包含 bug 的示例应用 (`sut.py`),以便你观察它的工作过程: ``` python main.py ``` ``` **Inputs tried:** 180 **Bugs found:** 3 ## Bug 1: Total 为负数 — 应收取的 price 绝不应低于零。 - Reproduce: calculate_total(price=10.0, coupon_percent=0, quantity=-1) - Returned: -10.0 ## Bug 3: 未处理的 TypeError: 无法将 sequence 与非 int 相乘... - Reproduce: calculate_total(price='free', coupon_percent=0, quantity=1) ``` 这个 Bot 从未被告知存在这些 bug。它仅凭不变量就发现了它们。 ## 为什么这很重要(QA 的经验) - **Oracle 胜过预期值表。** 你无法为成千上万的输入手动编写正确的输出——但你*可以*声明必须始终成立的属性(“费用永远不为负”、“折扣永远不会抬高价格”)。这就是**基于属性的测试** (property-based testing),它正是你如何捕获那些你未曾想象的 bug 的方式。 - **对抗性输入是 bug 的藏身之处。** 超过 100% 的折扣、负数的数量、错误的类型——这些枯燥的极端情况。Bot 会特意生成这些输入。 - **bug 报告只有在能复现时才有用。** 每个发现都会打印出一个可以直接复制粘贴的复现调用。无法复现,就无法修复。 ## 工作原理 ``` valid param space ──► augment with adversarial values (model/mock) │ cartesian product of all values │ run each ──► crash? ──► Finding(kind="crash") └─► oracle fails? ──► Finding(kind="invariant") │ dedupe ──► session report (md / json) ``` `sut.py` 是一个包含三个植入 bug 的被测系统示例。`agent.py` 是可复用的 Bot——只需将其指向*任何*具有参数空间和 oracle 列表的函数即可。 ## 测试它 ``` pytest ``` 确认该 Bot 能同时发现不变量破坏和崩溃,报告包含复现步骤,并且对于一个无 bug 的干净函数不会产生任何误报。 ## 扩展它 - 修复 `sut.py` 中的三个 bug(限制折扣范围、拒绝负数数量、验证类型),然后观察报告变为通过。 - 添加随机/模糊测试生成(使用 `random` 或 `hypothesis` 库),而不是使用固定的笛卡尔积。 - 将其指向你自己的函数:传入它的参数空间以及你自己的不变量。 这是 [SQA AI Agents](../README.md) 学习合集的一部分。
标签:Python, 安全规则引擎, 属性测试, 探索性测试, 无后门, 逆向工具