停止发布“僵尸测试”:推出 Project Vandal v0.2.0
Source: Dev.to

你将学到
- Zombie 测试问题 – 为什么通过的测试可能比失败的更危险
- 运行时 UI 变异 – Vandal 如何破坏实时 DOM 而不是重建源代码
- Shadow DOM 支持 – 渗透隐藏于标准选择器之外的现代 Web 组件
- Kill Ratio 指标 – 量化测试套件的实际韧性
- 快速集成 – 零改写测试的即插即用 Playwright 包装器
僵尸测试问题
你是否曾经看到一个 100 % 通过的测试套件并想过:“这真的在测试什么吗,还是仅仅因为 happy path 没有改变而通过?”
在测试自动化中,我们经常遭遇 test rot——即使应用逻辑已损坏,测试仍保持通过。这些就是 Zombie Tests。
隐藏的危险
Zombie Tests 给你一种虚假的安全感。它们是即使拥有庞大的自动化套件,仍然有 bug 滑入生产环境的原因。
什么是 Project Vandal?
Vandal 是一个用于前端的确定性混沌工程工具。与传统的变异测试通过修改源代码(慢且需要大量重建)不同,Vandal 在测试执行期间破坏浏览器中的 实时 DOM。
那一刻
传统工具会把 React/Vue 源码中的 if 语句改成 else。Vandal 改变 浏览器的现实。它会剥离点击监听器、移动 UI 元素,并在测试运行时破坏表单状态。
Vandal v0.2.0: 有哪些新功能?
我们在 v0.2.0 版本中加入了面向企业级、高并发应用的功能。
-
持久混乱(导航生存) ⚓
UI 变更在页面重新加载和跳转时仍然保持,使用add_init_script与深层MutationObserver的组合实现。 -
递归 Shadow DOM 支持 🕵️♂️
Vandal 现在能够递归穿透 Shadow DOM 边界,针对隐藏在多个 shadow root 中的元素进行操作。 -
自动恢复(实时修复) 🩹
缓存元素的原始状态,并通过await v.revert_mutation()实时恢复。
“破坏”手册
- 隐蔽禁用 – 设置
pointer-events: none。按钮外观完好,但对用户交互而言是“失效”的。 - UI 位移 – 将元素平移 100 像素。依赖硬编码坐标的测试将会失败。
- 加载缓慢 – 通过临时隐藏元素模拟 5 秒的 UI 卡顿。检查你的测试是否正确等待。
- 数据破坏 – 用垃圾数据替换关键标签和输入值,以验证数据验证逻辑。
安装
pip install project-vandal
基本用法
将 Vandal 集成到您现有的 Playwright 测试中,作为异步上下文管理器使用:
from vandal import Vandal
async def test_critical_path(page):
async with Vandal(page) as v:
# 1. Apply a persistent mutation
await v.apply_mutation("stealth_disable", "#checkout-btn")
# 2. Navigate – the mutation survives!
await page.goto("https://myapp.com/cart")
# 3. This SHOULD fail if your test is resilient
try:
await page.click("#checkout-btn", timeout=2000)
print("🧟 MUTANT SURVIVED: Test is a Zombie!")
except:
print("💀 MUTANT KILLED: Test is Robust.")
# Generate a beautiful HTML report
v.save_report("ci_resilience_report.html")
报告:从控制台到 HTML
Vandal v0.2.0 现在导出结构化的 JSON 和精美的 HTML 报告。 不再需要在控制台日志中挖掘——可视化记分卡已准备好用于您的 CI/CD 仪表板。
高影响力使用案例
- CI/CD 门控 – 当超过 10 % 的 UI 变体存活时,使构建失败。
- Shadow DOM 验证 – 自信地测试难以捕捉的 Web 组件。
- 断言基准测试 – 量化自动化套件的“Kill Ratio”。
加入破坏运动
停止统计代码覆盖行数。开始衡量 断言有效性。Project Vandal 让“绿色勾选”再次有意义。
开源
Project Vandal 是一个开源项目。立即在 PyPI 上查看并开始验证您的测试套件的韧性。