godot-testing-patterns
Expert testing decision trees for GdUnit4: unit vs scene vs CI gates, headless runners, snapshots, and mock networks. Use when choosing test layers, wiring CI, or validating signals/physics without beginner assert catalogs. Keywords: GdUnit4, GdUnitTestSuite, headless CI, snapshot test, mock network
By thedivergentai · 420 installs
npx skills add thedivergentai/gd-agentic-skills --skill godot-testing-patterns
Source repository · Upstream listing
Decision Tree → Scripts
Need Choice Script (MANDATORY when chosen)
: : :
Pure logic / no tree Unit [basic unit test.gd](scripts/basic unit test.gd), [mock dependency test.gd](scripts/mock dependency test.gd), [test data factory.gd](scripts/test data factory.gd)
Node interaction after instantiate Scene integration [scene integration test.gd](scripts/scene integration test.gd), [integration test base.gd](scripts/integration test base.gd)
Signal contracts Unit or scene [signal emission test.gd](scripts/signal emission test.gd)
Multi frame / physics step Async scene [wait for frame test.gd](scripts/wait for frame test.gd), [physics collision test.gd](scripts/physics collision test.gd)
Flaky physics / timing races Frame step gate MANDATORY [wait for frame test.gd](scripts/wait for frame test.gd) — never wall clock sleep
CI / no display Headless gate MANDATORY [headless test runner.gd](scripts/headless test runner.gd)
Save/UI regression Snapshot MANDATORY [snapshot tester.gd](scripts/snapshot tester.gd)
RPC without live peers Mock network MANDATORY [mock network provider.gd](scripts/mock network provider.gd)
Perf budget in CI Benchmark gate [performance benchmark runner.gd](scripts/performance benchmark runner.gd)
Orphans after suite Leak detect [memory leak detector.gd](scripts/memory leak detector.gd)
Edge input space Fuzz [parameter fuzz tester.gd](scripts/parameter fuzz tester.gd)
Do NOT Load assert catalog tutorials or manual gameplay checklists into context — pick a row, read the script, implement.
MANDATORY Triggers
CI / headless : always read [headless test runner.gd](scripts/headless test runner.gd) first ( OS.exit code , GdUnit4 CLI: godot headless s addons/gdUnit4/bin/GdUnitCmdTool.gd a res://test ).
State or visual golden files : read [snapshot tester.gd](scripts/snapshot tester.gd) before writing JSON/image goldens. Approve workflow: first run saves reference; intentional UI change → delete or overwrite res://tests/snapshots/<name .png , re run to regenerate, commit new golden; never hand edit PNG bytes.
Any RPC / MultiplayerSynchronizer test : read [mock network provider.gd](scripts/mock network provider.gd) before standing up real peers.
Available Scripts
[basic unit test.gd](scripts/basic unit test.gd)
Minimal GdUnit4 ( GdUnitTestSuite ) structure for pure logic.
[signal emission test.gd](scripts/signal emission test.gd)
Signal emission monitoring for decoupled architectures.
[mock dependency test.gd](scripts/mock dependency test.gd)
Mocks/doubles to isolate external services.
[scene integration test.gd](scripts/scene integration test.gd) / [integration test base.gd](scripts/integration test base.gd)
Scene lifecycle + node interaction fixtures.
[headless test runner.gd](scripts/headless test runner.gd)
CI headless orchestration and exit codes.
[snapshot tester.gd](scripts/snapshot tester.gd)
Dictionary/UI golden snapshot comparison.
[mock network provider.gd](scripts/mock network provider.gd)
Loopback / offline multiplayer peer for RPC tests.
[performance benchmark runner.gd](scripts/performance benchmark runner.gd)
Microsecond timers + Performance monitor gates.
[memory leak detector.gd](scripts/memory leak detector.gd)
Orphan node detection across long suites.
[parameter fuzz tester.gd](scripts/parameter fuzz tester.gd)
Randomized ranges for edge crashes.
[wait for frame test.gd](scripts/wait for frame test.gd) / [physics collision test.gd](scripts/physics collision test.gd)
Frame/physics step async verification.
[test data factory.gd](scripts/test data factory.gd)
Schema compliant fixture builders.
NEVER Do in Testing (GdUnit4)
NEVER test private implementation details — Assert public behavior only.
NEVER share mutable state between tests — Fresh setup per test ( before test / equivalent).
NEVER use wall clock sleep / blind timers — Prefer frame steppers from wait for frame patterns.
NEVER skip cleanup — Free instantiated nodes after each test.
NEVER test randomness without seeding .
NEVER assert signals without the GdUnit signal assert/monitor helpers from [signal emission test.gd](scripts/signal emission test.gd).
NEVER mix GUT and GdUnit4 APIs in one suite.
NEVER rely on editor only features for CI — Headless compatible tests only.
NEVER default to full level integration tests — Prefer unit + small scene tests; escalate only when the decision tree says so.
NEVER hardcode brittle absolute file paths in fixtures.
NEVER test third party plugin internals — Test your integration only.
Expert Gates (short)
Snapshot : serialize → compare golden ([snapshot tester.gd](scripts/snapshot tester.gd)); regenerate reference PNG on approved visual changes.
CI : headless + OS.exit code non zero on failure ([headless test runner.gd](scripts/headless test runner.gd)).
Network : mock peer before real ENet ( mock network provider.gd ).
Perf : Performance monitors / draw call caps in benchmark runner.
Deep recipes (on demand)
LLM ignorance rule: if a general agent would not know it before reading, it lives here or in scripts/ — never delete, only move.
Topic Reference
Snapshot / CI / fuzz / perf [expert testing patterns.md](references/expert testing patterns.md)
Release smoke checklist [manual testing checklist.md](references/manual testing checklist.md)
Reference
Progressive disclosure: open Official Documentation links only when researching a specific API; load Related Skills when routing to a peer domain — do not preload the whole lattice.
Official Documentation
[Command line tutorial](https://docs.godotengine.org/en/stable/tutorials/editor/command line tutorial.html) — headless , s , and exit code patterns for CI test runners.
[Overview of debugging tools](https://docs.godotengine.org/en/stable/tutorials/scripting/debug/overview of debugging tools.html) — debugger, profiler, and remote inspect when a failing test needs engine side diagnosis.
[Custom performance monitors](https://docs.godotengine.org/en/stable/tutorials/scripting/debug/custom performance monitors.html) — Performance monitors and custom metrics for benchmark gates and orphan detection.
[Idle and physics processing](https://docs.godotengine.org/en/stable/tutorials/scripting/idle and physics processing.html) — frame/ physics process timing that wait frames / yield helpers must respect.
[Using SceneTree](https://docs.godotengine.org/en/stable/tutorials/scripting/scene tree.html) — tree lifecycle, quit() , and process modes used by headless orchestrators.
[Nodes and scene instances](https://docs.godotengine.org/en/stable/tutorials/scripting/nodes and scene instances.html) — instantiate/add child/free hygiene for scene integration tests.
[Instancing with signals](https://docs.godotengine.org/en/stable/tutorials/scripting/instancing with signals.html) — signal wiring patterns that signal emission tests verify.
[High level multiplayer](https://docs.godotengine.org/en/stable/tutorials/networking/high level multiplayer.html) — RPC/peer APIs mocked via OfflineMultiplayerPeer or latency simulators.
[Using InputEvent](https://docs.godotengine.org/en/stable/tutorials/inputs/inputevent.html) — synthetic InputEvent injection for fuzz and UI interaction tests.
[Random number generation](https://docs.godotengine.org/en/stable/tutorials/math/random number generation.html) — seeding for deterministic fuzz and Monte Carlo harnesses.
[Saving games](https://docs.godotengine.org/en/stable/tutorials/io/saving games.html) — serialize/deserialize patterns behind golden JSON and save/load integration tests.
[Physics introduction](https://docs.godotengine.org/en/stable/tutorials/physics/physics introduction.html) — layers/masks and step timing for collision integration tests.
Related Skills
Prerequisites
[godot project foundations](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot project foundations/SKILL.md) — project layout, scenes, and resources before standing up a res://test/ suite.
[godot gdscript mastery](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot gdscript mastery/SKILL.md) — typed GDScript, await , and assert idioms used in every unit/integration test.
[godot signal architecture](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot signal architecture/SKILL.md) — emit/connect contracts that watch signals / signal monitors assert against.
Complements
[godot debugging profiling](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot debugging profiling/SKILL.md) — profiler and ObjectDB tools when a red test needs runtime evidence, not another assert.
[godot scene management](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot scene management/SKILL.md) — scene packing/load patterns mirrored in scene integration fixtures.
[godot input handling](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot input handling/SKILL.md) — action maps and event parsing exercised by fuzz and UI press tests.
[godot 2d physics](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot 2d physics/SKILL.md) — layer matrices and body APIs that physics collision tests must keep green.
[godot resource data patterns](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot resource data patterns/SKILL.md) — Resource schemas that test data factories and snapshot dictionaries serialize.
[godot save load systems](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot save load systems/SKILL.md) — persistence pipelines covered by save/load integration and golden state tests.
Downstream / consumers
[godot monte carlo balancer](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot monte carlo balancer/SKILL.md) — seeded headless gameplay sims that reuse these harnesses for Phase 7 golden cells.
[godot performance optimization](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot performance optimization/SKILL.md) — budgets that CI performance gates ( Performance monitors, draw call caps) enforce.
[godot multiplayer networking](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot multiplayer networking/SKILL.md) — RPC/replication logic validated through mock peers and lag injection.
[godot export builds](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot export builds/SKILL.md) — headless export/CI pipelines that invoke the same headless test entrypoints.
Master
[godot master](https://github.com/thedivergentai/gd agentic skills/blob/main/skills/godot master/SKILL.md) — library router and mirrored module entry for cross skill discovery.