移动/游戏
用 GdUnit4 决策树为 Godot…
在 Godot 中需要决定用单元测试、场景集成测试还是 CI 门禁,并验证信号、物理、快照与网络时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用 GdUnit4 决策树为 Godot特定
解决思路
- 按需求查决策树选测试类型并强制使用对应脚本:纯逻辑/无场景树用 Unit(basic_unit_test.gd、mock_dependency_test.gd、test_data_factory.gd);实例化后的节点交互用 Scene integration(scene_integration_test.gd、integration_test_base.gd);信号契约用 Unit 或 scene(signal_emission_test.gd);多帧/物理步进用 Async scene(wait_for_frame_test.gd、physics_collision_test.gd);不稳定物理/时序竞争强制用帧步进门禁 wait_for_frame_test.gd,绝不用墙钟 sleep;CI/无显示强制用 headless_test_runner.gd;存档/UI 回归强制用 snapshot_tester.gd;无真实对端的 RPC 强制用 mock_network_provider.gd;CI 性能预算用 performance_benchmark_runner.gd;套件后孤儿节点用 memory_leak_detector.gd;边界输入空间用 parameter_fuzz_tester.gd。
- 不要把 assert 目录式教程或手动玩法清单加载进上下文——选一行、读脚本、实现即可。
- CI / --headless 时先读 headless_test_runner.gd,使用 OS.exit_code,GdUnit4 CLI 命令:godot --headless -s addons/gdUnit4/bin/GdUnitCmdTool.gd -a res://test。
- 涉及状态或视觉 golden 文件时先读 snapshot_tester.gd 再写 JSON/图片 golden;审批流程:首次运行保存参考;有意 UI 变更时删除或覆盖 res://tests/snapshots/<name>.png,重跑重新生成,提交新 golden;绝不手改 PNG 字节。
- 任何 RPC / MultiplayerSynchronizer 测试先读 mock_network_provider.gd,再搭真实对端。
- 用 basic_unit_test.gd 搭建纯逻辑的最小 GdUnit4(GdUnitTestSuite)结构。
- 用 signal_emission_test.gd 为解耦架构做信号发射监控。
- 用 mock_dependency_test.gd 通过 mock/double 隔离外部服务。
- 用 scene_integration_test.gd / integration_test_base.gd 搭建场景生命周期与节点交互 fixture。
- 用 headless_test_runner.gd 做 CI 无头编排与退出码处理。
- 用 snapshot_tester.gd 做字典/UI golden 快照比较。
- 用 mock_network_provider.gd 为 RPC 测试提供 loopback/离线多人对端。
- 用 performance_benchmark_runner.gd 结合微秒计时器与 Performance 监控做门禁。
- 用 memory_leak_detector.gd 在长套件中检测孤儿节点。
- 用 parameter_fuzz_tester.gd 做随机范围边界崩溃测试。
- 用 wait_for_frame_test.gd / physics_collision_test.gd 做帧/物理步进异步验证。
- 用 test_data_factory.gd 构建符合 schema 的 fixture。
- 测试中绝不测试私有实现细节——只断言公开行为。
- 测试间绝不共享可变状态——每个测试用全新 setup(before_test 或等价物)。
- 绝不使用墙钟 sleep / 盲目计时器——优先用 wait_for_frame 模式的帧步进器。
- 绝不跳过清理——每个测试后释放实例化的节点。
- 绝不在未设种子的情况下测试随机性。
- 绝不用 GdUnit 信号断言/监控辅助之外的方式断言信号(见 signal_emission_test.gd)。
- 绝不在同一套件中混用 GUT 与 GdUnit4 API。
- 绝不依赖仅编辑器可用的特性做 CI——只用无头兼容的测试。
- 绝不默认做全关卡集成测试——优先单元 + 小场景测试,只有决策树要求时才升级。
- 绝不在 fixture 中硬编码脆弱的绝对文件路径。
- 绝不测试第三方插件内部——只测你自己的集成。
- 快照门禁:序列化 → 与 golden 比较(snapshot_tester.gd);经批准的视觉变更后重新生成参考 PNG。
- CI 门禁:--headless + 失败时 OS.exit_code 非零(headless_test_runner.gd)。
- 网络门禁:在真实 ENet 之前先用 mock 对端(mock_network_provider.gd)。
- 性能门禁:在 benchmark runner 中使用 Performance 监控 / draw-call 上限。
- 按需查阅深度配方:快照/CI/fuzz/perf 见 references/expert-testing-patterns.md;发布冒烟清单见 references/manual-testing-checklist.md。
- 渐进式披露:仅在研究特定 API 时打开官方文档链接;路由到同类领域时再加载 Related Skills——不要预加载整个知识网络。
适用边界 · 注意事项
- 需要真实 ENet 对端或真实网络环境时,mock 网络方案不适用。
- 需要编辑器专属功能验证时,无头 CI 测试不适用。
- 需要测试第三方插件内部实现时,本技能不适用(只测自身集成)。