Tomzkl/test-shield

GitHub: Tomzkl/test-shield

Test Shield 通过追踪 git 变更的完整调用链并生成针对性回归测试,帮助 Python 开发者在部署前发现被忽略的间接影响。

Stars: 1 | Forks: 0

# 测试 Shield 🛡️ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![Tests](https://img.shields.io/badge/tests-28%2F28%20passed-brightgreen)](https://github.com/dominicharmon-commits/test-shield/tree/master/tests) [![Claude Code](https://img.shields.io/badge/Claude%20Code-skill-8A2BE2)](https://claude.com/claude-code) [![Stars](https://img.shields.io/github/stars/dominicharmon-commits/test-shield?style=social)](https://github.com/dominicharmon-commits/test-shield) 一个 [Claude Code](https://claude.com/claude-code) 技能,它能找出受你代码变更影响的每一个调用点,并生成有针对性的回归测试 —— 在你**破坏**生产环境**之前**。

Test Shield Demo

## 问题所在 你修复了 `discount.py` 中的一个 bug。你运行了测试。全部通过。你部署了。 三个小时后:购物车总额出错了。退款金额不匹配。订单变成了免费的。 **你只改了一处。却破坏了另外三处。而你的测试没有发现它。** 现有的测试覆盖率工具只能告诉你*哪些代码行执行了*。它们无法告诉你*你的更改悄悄破坏了哪些调用方*。 ## Test Shield 的作用 ``` /test-shield │ ▼ ① Reads your git diff — knows exactly what you changed │ ▼ ② Traces every caller — finds every downstream function affected │ ▼ ③ Shows you what it found — no black box ✅ Expected: the function you meant to change ⚠️ Unexpected: callers you didn't realize used it │ ▼ ④ Waits for your judgment — keep behavior or update? │ ▼ ⑤ Generates pytest regression tests — real assertions, real edge cases │ ▼ ⑥ Runs them — all green → ship. any red → stop and review. ``` ## 快速开始 ### 前置条件 - 已安装 Claude Code - Python 3.10+ - 一个由 git 追踪的 Python 项目 - pytest(可选 —— Test Shield 会提示并协助安装) ### 安装说明 ``` # Clone 到你的 Claude Code skills directory git clone https://github.com/dominicharmon-commits/test-shield.git ~/.claude/skills/test-shield # 或通过 Claude Code marketplace(即将推出) # claude plugin marketplace add dominicharmon-commits/test-shield ``` ### 无需 Claude Code 试用(30 秒) ``` # Clone 并在任何 Python 项目上运行 analyzer git clone https://github.com/dominicharmon-commits/test-shield.git cd your-python-project python ../test-shield/scripts/analyze.py . ``` 你将清楚地看到你的更改影响了哪些函数 —— 无需 Claude Code。 ### 用法(配合 Claude Code) ``` cd your-python-project # 进行一些修改... # vim src/discount.py # 运行 Test Shield /test-shield ``` ## 示例 ``` $ /test-shield ## 受影响路径分析 ✅ 直接改动:discount.py — apply_coupon() (L38-52) ⚠️ 间接影响: 高风险 — CartService.calculate_total() — cart.py:104 调用 apply_coupon() — 购物车总价受影响 现有测试:❌ 无 高风险 — RefundService.compute_refund() — refund.py:67 调用 apply_coupon() — 退款金额受影响 现有测试:❌ 无 --- 对 CartService.calculate_total():行为应保持不变 or 也要改 or 跳过? > A(保持不变) 对 RefundService.compute_refund():行为应保持不变 or 也要改 or 跳过? > A(保持不变) --- 生成 6 个回归测试... ✅ 6/6 通过 你可以安全合入。这是证据。 ``` ## 为什么选择 Test Shield 而非其他替代方案 | | workersio/skills | Vibe Test | Test Shield | |---|---|---|---| | 测试生成 | ✅ | ✅ | ✅ | | 调用链追踪 | ❌ | ❌ | **✅ 发现你不知道的问题** | | 预期与意外 | ❌ | ❌ | **✅ 向你展示令人惊讶的结果** | | 人工确认 | ❌ | ❌ | **✅ 在编写测试前由你判断** | | 单一命令 | ❌ (5 个命令) | ❌ (4 个命令) | **✅ /test-shield** | | Python 深度 | 通用 | 通用 | **✅ Python 优先,深度支持** | | 中文支持 | ❌ | ❌ | **✅ 中文优先** | ## 已知局限性 **Test Shield 对自己能做什么和不能做什么非常诚实。** 如果以下任何内容是你无法接受的,你在安装前就会知道,而不是在安装后。 ### 追踪盲区(每次运行都会报告这些) | 模式 | 为何不可见 | 示例 | |---------|--------------|---------| | `getattr(obj, "method")` | 方法名直到运行时才知道 | 插件系统、动态分发 | | `importlib.import_module()` | 导入目标是字符串变量 | 功能开关、基于环境的导入 | | 装饰器注入 | `@route()` 可能以 AST 无法追踪的方式包装函数 | Flask/FastAPI 路由装饰器 | | Monkey-patching | 函数在运行时被外部代码替换 | 测试 mock、热重载系统 | | `__import__()` | 同 importlib —— 动态导入 | 遗留代码、元编程 | **Test Shield 对此的应对措施:** 每次运行结束时都会生成一份“诚实声明”,标记检测到的动态模式,并明确标出不确定的调用链。拒绝虚假的自信。 ### 适用范围限制 - **v1 版本仅支持 Python。** TypeScript/Jest 支持已在路线图中(v1.2)。如果你的技术栈是 Node/Go/Rust,Test Shield 暂时帮不上忙。 - **仅支持 pytest。** 部分支持 unittest(可以找到 `test_*.py` 文件中的测试),但生成的测试使用 pytest 语法。 - **仅进行静态分析。** Test Shield 不会执行你的代码。无法追踪动态调用图(目标依赖于输入数据的情况)。 ### 设计选择(非 Bug) - **不会自动修复失败的测试。** 那是你决定的事。Test Shield 会向你展示哪里坏了并建议原因 —— 由你决定如何修改。 - **不会自动提交。** 生成的测试在发布前需要由你审查。 - **生成的测试用于回归保护,而非单元测试。** 它们验证的是“它的行为是否依然保持一致?”,而不是“这个业务逻辑正确吗?” ### 性能表现 | 项目大小 | analyze.py 运行时间 | 备注 | |-------------|-------------------|-------| | < 50 个 .py 文件 | < 1 秒 | 瞬间完成 | | 50-200 个 .py 文件 | 1-3 秒 | 测试缓存生效 | | 200-1000 个 .py 文件 | 3-10 秒 | 依然可以接受 | | 1000+ 个 .py 文件 | 10-30 秒 | 建议仅在变更的模块上运行 | ## 路线图 | 版本 | 内容 | |---------|------| | v1.0 | Python + pytest,AST 追踪,/test-shield 命令,测试缓存 | | v1.1 | 覆盖率验证(生成后运行 pytest-cov) | | v1.2 | TypeScript / Jest 支持 | | v2.0 | CI/CD 集成,git hook 自动触发 | ## 常见问题 常见问题的快速解答。更多内容请见 **[docs/faq.md](docs/faq.md)**。 | 问题 | 回答 | |---------|--------| | 为什么只支持 Python? | v1 专注 Python 做到极致。TypeScript 在 v1.2。 | | 和 pytest-cov 有什么区别? | pytest-cov 告诉你哪些行没跑到。Test Shield 告诉你改了代码后哪些调用方会悄悄坏掉。互补关系。 | | 能在 CI 里用吗? | 暂时不行(v2.0 目标)。目前是本地手动触发 `/test-shield`。 | | analyze.py 有依赖吗? | 零依赖。纯 Python stdlib。Python 3.10+。 | | 能追踪装饰器吗? | 基础装饰器(`@staticmethod`等)可以。动态装饰器注入的函数追踪不到——会在诚实声明里标注。 | ## 许可证 MIT © 2026
标签:AI辅助编程, Python, SOC Prime, 云安全监控, 安全规则引擎, 开发工具, 无后门, 网络安全研究, 自动化payload嵌入, 逆向工具, 静态分析