Test Patterns
rohitg00/skillkit
Applies proven testing patterns — Arrange-Act-Assert (AAA), Given-When-Then, Test Data Builders, Object Mother, parameterized tests, fixtures, spies, and test doubles — to help write maintainable…
Generates engine-specific test helper libraries with assertion utilities, factory functions and mocks, placed where the engine's test runner compiles them.
$ npx skills add Donchitos/Claude-Code-Game-Studios --skill test-helpers -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Donchitos/Claude-Code-Game-Studios test-helpers --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Donchitos/Claude-Code-Game-Studios.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/test-helpers .claude/skills/test-helpers && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "test-helpers" agent skill from https://github.com/Donchitos/Claude-Code-Game-Studios/tree/main/.claude/skills/test-helpers into .claude/skills/test-helpers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-helpers", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Donchitos/Claude-Code-Game-Studios/tree/main/.claude/skills/test-helpersType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Donchitos/Claude-Code-Game-Studios --skill test-helpers -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Donchitos/Claude-Code-Game-Studios test-helpers --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Donchitos/Claude-Code-Game-Studios.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/test-helpers .agents/skills/test-helpers && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "test-helpers" agent skill from https://github.com/Donchitos/Claude-Code-Game-Studios/tree/main/.claude/skills/test-helpers into .agents/skills/test-helpers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-helpers", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Donchitos/Claude-Code-Game-Studios --skill test-helpers -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Donchitos/Claude-Code-Game-Studios test-helpers --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Donchitos/Claude-Code-Game-Studios.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/test-helpers .cursor/skills/test-helpers && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "test-helpers" agent skill from https://github.com/Donchitos/Claude-Code-Game-Studios/tree/main/.claude/skills/test-helpers into .cursor/skills/test-helpers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-helpers", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Donchitos/Claude-Code-Game-Studios.git --path .claude/skills/test-helpers--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Donchitos/Claude-Code-Game-Studios --skill test-helpers -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Donchitos/Claude-Code-Game-Studios test-helpers --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Donchitos/Claude-Code-Game-Studios.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/test-helpers .gemini/skills/test-helpers && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "test-helpers" agent skill from https://github.com/Donchitos/Claude-Code-Game-Studios/tree/main/.claude/skills/test-helpers into .gemini/skills/test-helpers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-helpers", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Donchitos/Claude-Code-Game-Studios test-helpersInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Donchitos/Claude-Code-Game-Studios --skill test-helpers -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Donchitos/Claude-Code-Game-Studios.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/test-helpers .github/skills/test-helpers && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "test-helpers" agent skill from https://github.com/Donchitos/Claude-Code-Game-Studios/tree/main/.claude/skills/test-helpers into .github/skills/test-helpers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-helpers", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Donchitos/Claude-Code-Game-Studios --skill test-helpers -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Donchitos/Claude-Code-Game-Studios test-helpers --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Donchitos/Claude-Code-Game-Studios.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/test-helpers .opencode/skills/test-helpers && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "test-helpers" agent skill from https://github.com/Donchitos/Claude-Code-Game-Studios/tree/main/.claude/skills/test-helpers into .opencode/skills/test-helpers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-helpers", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
test-helpersGenerates engine-specific test helper libraries with assertion utilities, factory functions and mocks, placed where the engine's test runner compiles them.
The skill writes a helper library tailored to the project's actual engine, language and systems so test authors repeat less setup and teardown code. Output goes to the engine's helper root: `tests/helpers/` for Godot, `Assets/Tests/EditMode/Helpers/` for Unity, and a Tests/Helpers folder under the module's Private source folder for Unreal. For Unity it asks before creating a shared assembly if PlayMode tests need the same helpers.
Generated helpers must assert through the assertion API of the configured test framework, read from `testing.framework`, never through a bare `assert()`. A bare assert aborts the run on the first failure instead of recording one failed test, and it is stripped from release builds, so the checks silently stop. Run it after the test framework has been scaffolded, when test files repeat the same setup, or when starting tests for a new system.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit be8993b. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadGlobGrepWriteBash(bash "*/.claude/skills/test-helpers/../../hooks/yaml-helper.sh" resolve_config *)From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
bashFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Engine Test Helper Generator loads about 4.4k tokens when it runs. Until then it costs about 39 tokens; SKILL.md has 1,112 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Donchitos/Claude-Code-Game-Studios at commit be8993b, republished under its MIT licence (© Donchitos). 1,112 words, ~4,416 tokens.
.claude/skills/test-helpers/SKILL.md (or your agent's skills folder).!bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation
Automation mode: Resolve modes.automation (project.local.yaml →
project.yaml → default collaborative). Every AskUserQuestion call and
every file write follows .claude/docs/automation-modes.md
(collaborative asks always · guided major-only · autonomous logs and proceeds;
automation_always_ask categories always prompt).
Writing test cases is faster and more consistent when common setup, teardown,
and assertion patterns are abstracted into helpers. This skill generates a
tests/helpers/ library tailored to the project's actual engine, language,
and systems — so every developer writes less boilerplate and more assertions.
Output: engine-specific helper files in the engine's helper root —
the only place its test runner compiles them (.claude/docs/directory-structure.md):
| Engine | Helper root |
|---|---|
| Godot | tests/helpers/ |
| Unity | Assets/Tests/EditMode/Helpers/ — inside the EditModeTests assembly /test-setup creates. If PlayMode tests need the same helpers, ask before creating Assets/Tests/Helpers/TestHelpers.asmdef and referencing it from both test assemblies. |
| Unreal | Source/<Module>/Private/Tests/Helpers/ |
tests/helpers/ below means the helper root for the project's engine.
When to run:
/test-setup scaffolds the framework (first time)assert()Generated helpers must assert through the configured test framework's assertion
API, resolved from testing.framework — not through GDScript's built-in
assert().
Two things go wrong with a bare assert() in a helper, and both are silent:
assert() halts execution, so the first failure hides every result
after it.assert()
stops asserting entirely in exactly the build you most want checked, and does
so without any error — the tests still "pass".Look up the assertion form for the configured framework before generating
code. Do not copy the forms in this file or in other skills' examples as
authoritative — they are illustrative and have drifted (assert_eq,
assert_true and assert_that all appear across the repo). If you cannot
confirm the correct API for the project's framework, say so and generate no
helper rather than guessing.
Helpers must not extend the framework's test-suite base class. A file in
tests/helpers/ that extends the suite type is discovered by the runner as a
test suite containing zero tests. Helpers are plain classes; only real test files
extend the suite.
Modes:
/test-helpers [system-name] — generate helpers for a specific system
(e.g., /test-helpers combat)/test-helpers all — generate helpers for all systems with test files/test-helpers scaffold — generate only the base helper library (no
system-specific helpers); use this on first runscaffold if no helpers exist, else allRead from project.yaml first, falling back to .claude/docs/technical-preferences.md for any key that is absent or empty:
engine.name (else the Engine: value)engine.language (else the Language: value)testing.framework (else Framework: from the Testing section)If the engine is not configured in either source: "Engine not configured. Run /setup-engine first."
Scan the engine's test root for patterns already in use (Godot tests/, Unity
Assets/Tests/, Unreal Source/<Module>/Private/Tests/):
Glob pattern="tests/**/*_test.*" (Godot)
Glob pattern="Assets/Tests/**/*Tests.cs" (Unity)
Glob pattern="Source/*/Private/Tests/**/*.cpp" (Unreal)For a representative sample (up to 5 files), read the test files and extract:
before_each / setUp / fixtures are written)This ensures generated helpers match the project's existing style, not a generic template.
Also read:
design/gdd/systems-index.md — to know which systems existdocs/architecture/tr-registry.yaml — to map requirements to tested systems
FAIL_IF(...)in the example below is a PLACEHOLDER, not an API. It marks the one line you must resolve from the project's actual test framework before emitting any of this, per the rule in §2. Substitute the framework's real failure call — the form that registers a failure with the runner and lets the suite continue — and delete the marker comment.It is deliberately not spelled
assert_that,assert_eqorassert_true. All three appear somewhere in this repo, they disagree, and GdUnit4's API is not covered bydocs/engine-reference/— so writing any of them here would be asserting an API this repo cannot source, in the file whose whole job is to stop people doing that. If you cannot confirm the correct call for the configured framework, §2 already tells you the answer: generate no helper. An unresolvedFAIL_IFreaching disk is a bug; a missing helper is a task.Worked examples must obey §2 too — a bare
assert()here would be the exact form §2 forbids, sixty lines below §2 forbidding it. A rule stated in prose does not reach its own worked example unless someone makes it.
Base helper (tests/helpers/game_assertions.gd):
## Game-specific assertion utilities for [Project Name] tests.
## Domain-specific helpers built on the project's test framework.
##
## Usage (static — no instance needed):
## GameAssertions.assert_in_range(entity.health, 0, entity.max_health, "health")
class_name GameAssertions
extends RefCounted
## Assert a value is within the inclusive range [min_val, max_val].
## Use for any formula output that has defined bounds in a GDD.
static func assert_in_range(
value: float,
min_val: float,
max_val: float,
label: String = "value"
) -> void:
# FRAMEWORK ASSERT — resolve per the rule above; do not emit `assert()`.
FAIL_IF(
not (value >= min_val and value <= max_val),
"%s %.2f is outside expected range [%.2f, %.2f]" % [label, value, min_val, max_val]
)
## Assert a signal was emitted during a callable block.
## Usage: assert_signal_emitted(entity, "health_changed", func(): entity.take_damage(10))
static func assert_signal_emitted(
obj: Object,
signal_name: String,
action: Callable
) -> void:
# A lambda captures a local by value: `emitted = true` inside it would set
# the lambda's own copy. Mutate a Dictionary it shares instead. `...args`
# (4.5+) accepts a signal with any number of arguments.
var state := {"emitted": false}
obj.connect(signal_name, func(...args): state.emitted = true)
action.call()
# FRAMEWORK ASSERT — resolve per the rule above; do not emit `assert()`.
FAIL_IF(not state.emitted, "Expected signal '%s' to be emitted, but it was not." % signal_name)
## Assert that a callable does NOT emit a signal.
static func assert_signal_not_emitted(
obj: Object,
signal_name: String,
action: Callable
) -> void:
var state := {"emitted": false} # a Dictionary, as above
obj.connect(signal_name, func(...args): state.emitted = true)
action.call()
# FRAMEWORK ASSERT — resolve per the rule above; do not emit `assert()`.
FAIL_IF(state.emitted, "Expected signal '%s' NOT to be emitted, but it was." % signal_name)
## Assert a node exists at path within a parent.
static func assert_node_exists(parent: Node, path: NodePath) -> void:
# FRAMEWORK ASSERT — resolve per the rule above; do not emit `assert()`.
FAIL_IF(
not parent.has_node(path),
"Expected node at path '%s' to exist." % str(path)
)Factory helper (tests/helpers/game_factory.gd):
## Factory functions for creating test game objects.
## Returns minimal objects configured for unit testing (no scene tree required).
##
## Usage: var player = GameFactory.make_player(health: 100)
class_name GameFactory
extends RefCounted
## Create a minimal player-like object for testing.
## Override fields as needed.
static func make_player(health: int = 100) -> Node:
var player = Node.new()
player.set_meta("health", health)
player.set_meta("max_health", health)
return playerScene helper (tests/helpers/scene_runner_helper.gd):
## Utilities for scene-based integration tests. For input simulation and frame
## stepping, use gdUnit4's own `scene_runner()` from inside the suite.
class_name SceneRunnerHelper
extends RefCounted
## Load a scene under `host` — the calling test suite, which passes `self` —
## and wait one frame for _ready() to complete. A plain class, so the runner
## never discovers this file as a suite with zero tests.
static func load_scene_and_wait(host: Node, scene_path: String) -> Node:
var scene: Node = load(scene_path).instantiate()
host.add_child(scene)
await host.get_tree().process_frame
return sceneBase helper (Assets/Tests/EditMode/Helpers/GameAssertions.cs):
using NUnit.Framework;
using UnityEngine;
/// <summary>
/// Game-specific assertion utilities for [Project Name] tests.
/// Extends NUnit's Assert with domain-specific helpers.
/// </summary>
public static class GameAssertions
{
/// <summary>
/// Assert a value is within an inclusive range [min, max].
/// Use for any formula output defined in GDD Formulas sections.
/// </summary>
public static void AssertInRange(float value, float min, float max, string label = "value")
{
Assert.That(value, Is.InRange(min, max),
$"{label} ({value:F2}) is outside expected range [{min:F2}, {max:F2}]");
}
/// <summary>Assert a UnityEvent or C# event was raised during an action.</summary>
public static void AssertEventRaised(ref bool wasCalled, System.Action action, string eventName)
{
wasCalled = false;
action();
Assert.IsTrue(wasCalled, $"Expected event '{eventName}' to be raised, but it was not.");
}
/// <summary>Assert a component exists on a GameObject.</summary>
public static void AssertHasComponent<T>(GameObject obj) where T : Component
{
var component = obj.GetComponent<T>();
Assert.IsNotNull(component,
$"Expected GameObject '{obj.name}' to have component {typeof(T).Name}.");
}
}Factory helper (Assets/Tests/EditMode/Helpers/GameFactory.cs):
using UnityEngine;
/// <summary>
/// Factory methods for creating minimal test objects without loading scenes.
/// </summary>
public static class GameFactory
{
/// <summary>Create a minimal GameObject with a named component for testing.</summary>
public static GameObject MakeGameObject(string name = "TestObject")
{
var go = new GameObject(name);
return go;
}
/// <summary>
/// Create a ScriptableObject of type T for data-driven tests.
/// Dispose with Object.DestroyImmediate after test.
/// </summary>
public static T MakeScriptableObject<T>() where T : ScriptableObject
{
return ScriptableObject.CreateInstance<T>();
}
}Base helper (Source/<Module>/Private/Tests/Helpers/GameTestHelpers.h):
#pragma once
#include "CoreMinimal.h"
#include "Misc/AutomationTest.h"
/**
* Game-specific assertion macros and helpers for [Project Name] automation tests.
* Include in any test file that needs domain-specific assertions.
*
* Usage:
* GAME_TEST_ASSERT_IN_RANGE(TestName, DamageValue, 10.0f, 50.0f, TEXT("Damage"));
*/
// Assert a float value is within inclusive range [Min, Max]
#define GAME_TEST_ASSERT_IN_RANGE(TestName, Value, Min, Max, Label) \
TestTrue( \
FString::Printf(TEXT("%s (%.2f) in range [%.2f, %.2f]"), Label, Value, Min, Max), \
(Value) >= (Min) && (Value) <= (Max) \
)
// Assert a UObject pointer is valid (not null, not garbage collected)
#define GAME_TEST_ASSERT_VALID(TestName, Ptr, Label) \
TestTrue( \
FString::Printf(TEXT("%s is valid"), Label), \
IsValid(Ptr) \
)
// Assert an Actor is in the world (spawned successfully)
#define GAME_TEST_ASSERT_SPAWNED(TestName, ActorPtr, ClassName) \
TestNotNull( \
FString::Printf(TEXT("Spawned actor of class %s"), TEXT(#ClassName)), \
ActorPtr \
)
/**
* Helper to create a minimal test world.
* Remember to call World->DestroyWorld(false) in teardown.
*/
namespace GameTestHelpers
{
inline UWorld* CreateTestWorld(const FString& WorldName = TEXT("TestWorld"))
{
UWorld* World = UWorld::CreateWorld(EWorldType::Game, false);
FWorldContext& WorldContext = GEngine->CreateNewWorldContext(EWorldType::Game);
WorldContext.SetCurrentWorld(World);
return World;
}
}For [system-name] or all modes, generate a helper per system:
Read only the GDD sections this needs — Grep pattern="^## ([0-9]+\. )?(Formulas|Edge Cases|Detailed Rules|Detailed Design)" path="design/gdd/[system].md" output_mode="content" -A 30 (the optional number matches a reverse-documented GDD's ## 4. Formulas) — rather than a full read (every peer skill section-greps GDDs; in all mode a full read multiplies across each system's 400+-line GDD). Extract:
Generate tests/helpers/[system]_factory.[ext] with factory functions
specific to that system's objects.
Example pattern for a combat system (Godot/GDScript):
## Factory and assertion helpers for Combat system tests.
## Generated by /test-helpers combat on [date].
## Based on: design/gdd/combat.md
class_name CombatTestFactory
extends RefCounted
const DAMAGE_MIN := 0
const DAMAGE_MAX := 999 # From GDD: damage formula upper bound
## Create a minimal attacker object for damage formula tests.
static func make_attacker(attack: float = 10.0, crit_chance: float = 0.0) -> Node:
var attacker = Node.new()
attacker.set_meta("attack", attack)
attacker.set_meta("crit_chance", crit_chance)
return attacker
## Create a minimal target object for damage receive tests.
static func make_target(defense: float = 0.0, health: float = 100.0) -> Node:
var target = Node.new()
target.set_meta("defense", defense)
target.set_meta("health", health)
target.set_meta("max_health", health)
return target
## Assert damage output is within GDD-specified bounds.
static func assert_damage_in_bounds(damage: float) -> void:
GameAssertions.assert_in_range(damage, DAMAGE_MIN, DAMAGE_MAX, "damage")Present a summary of what will be created:
## Test Helpers to Create
Base helpers (engine: [engine], helper root: [helper root]):
- [helper root]/game_assertions.[ext]
- [helper root]/game_factory.[ext]
[engine-specific extras]
System helpers ([mode]):
- [helper root]/[system]_factory.[ext] ← from [system] GDDAsk: "May I write these helper files to [helper root]?"
Never overwrite existing files. If a file already exists, report:
"Skipping [path] — already exists. Remove the file manually if you want it
regenerated."
After writing: Verdict: COMPLETE — helper files created.
"Helper files created. To use them in a test:
class_name is auto-imported — no explicit import neededusing directive or reference the test assembly#include \"Tests/Helpers/GameTestHelpers.h\" (from inside the module)"tests//test-setup if the test framework has not been scaffolded yet./dev-story to implement stories — helpers reduce boilerplate in new test files./skill-test to validate other skills that may need helper coverage.© Donchitos, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/test-helpers of Donchitos/Claude-Code-Game-Studios.
Open the folder on GitHubat commit be8993b
Engine Test Helper Generator next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Engine Test Helper Generator this skillDonchitos/Claude-Code-Game-Studios | 26k | — | ~4.4k | Automated safety check: Pass | MIT | |
| Test Patternsrohitg00/skillkit | 1.5k | — | ~1.8k | Automated safety check: Pass | Apache-2.0 | |
| Godot Testing Patternsthedivergentai/GD-Agentic-Skills | 816 | — | ~2.9k | Automated safety check: Pass | LGPL-3.0 | |
| Frappe Testing UnitImpertio-Studio/Frappe_Claude_Skill_Package | 188 | — | ~3k | Automated safety check: Pass | MIT | |
| Pytest Patternscohen-liel/hivemind | 110 | — | ~806 | Automated safety check: Pass | Apache-2.0 | |
| Gm VerifyRandallLiuXin/GodotMaker | 550 | — | ~2.1k | Automated safety check: Pass | Custom licence |
rohitg00/skillkit
Applies proven testing patterns — Arrange-Act-Assert (AAA), Given-When-Then, Test Data Builders, Object Mother, parameterized tests, fixtures, spies, and test doubles — to help write maintainable…
thedivergentai/GD-Agentic-Skills
Expert testing decision trees for GdUnit4: unit vs scene vs CI gates, headless runners, snapshots, and mock networks.
Impertio-Studio/Frappe_Claude_Skill_Package
A skill your agent uses when writing unit tests, integration tests, creating test fixtures, or running tests with bench run-tests.
cohen-liel/hivemind
pytest best practices for writing comprehensive test suites.
RandallLiuXin/GodotMaker
Mechanical verification of the built game: headless build, unit tests, lint, static checks.
ChrisWiles/claude-code-showcase
Jest patterns for React Native style tests: TDD discipline, mock factory functions, module and GraphQL hook mocking, custom render helpers and anti-patterns to avoid.
Donchitos/Claude-Code-Game-Studios
Create an ADR documenting a technical decision: context, alternatives considered, consequences.
Donchitos/Claude-Code-Game-Studios
Implement a story: ADR guidelines, right programmer agent, code plus test.
Donchitos/Claude-Code-Game-Studios
Audits game assets against naming conventions, file size budgets and format standards, and finds orphaned assets and missing references.
Donchitos/Claude-Code-Game-Studios
Writes per-asset visual specs and AI image-generation prompts for a game's characters, enemies and screens, driven by the GDD, art bible and an entity inventory.
Donchitos/Claude-Code-Game-Studios
Checks game data and formulas for balance outliers, broken progression, degenerate strategies and economy problems, and answers 'could not run' when the data is missing.
Donchitos/Claude-Code-Game-Studios
Turns a description into a structured bug report, or scans code for likely bugs, then verifies and closes reports through four modes.
Works with
Categories
Generates engine-specific test helper libraries with assertion utilities, factory functions and mocks, placed where the engine's test runner compiles them. The skill writes a helper library tailored to the project's actual engine, language and systems so test authors repeat less setup and teardown code. Output goes to the engine's helper root: `tests/helpers/` for Godot, `Assets/Tests/EditMode/Helpers/` for Unity, and a Tests/Helpers folder under the module's Private source folder for Unreal.
Engine Test Helper Generator fits situations like: right after the test framework is scaffolded, to add shared helpers; several test files repeat the same setup and teardown code; starting tests for a new game system that needs factories and mocks.
Run `npx skills add Donchitos/Claude-Code-Game-Studios --skill test-helpers -a claude-code`. Or copy the skill folder (.claude/skills/test-helpers in Donchitos/Claude-Code-Game-Studios) into .claude/skills/test-helpers in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Donchitos/Claude-Code-Game-Studios --skill test-helpers -a codex`. Or copy the skill folder (.claude/skills/test-helpers in Donchitos/Claude-Code-Game-Studios) into .agents/skills/test-helpers in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Donchitos/Claude-Code-Game-Studios --skill test-helpers -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/test-helpers, .gemini/skills/test-helpers, .github/skills/test-helpers and .opencode/skills/test-helpers in your project.
Going by SKILL.md and its folder, Engine Test Helper Generator needs the command-line tools its instructions call (bash). Our summary lists: A scaffolded test framework configured as `testing.framework`. Its frontmatter pre-approves these tools: Read, Glob, Grep, Write, Bash(bash "*/.claude/skills/test-helpers/../../hooks/yaml-helper.sh" resolve_config *).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Engine Test Helper Generator is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.4k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Engine Test Helper Generator: Test Patterns (rohitg00/skillkit, 1.5k stars), Godot Testing Patterns (thedivergentai/GD-Agentic-Skills, 816 stars), Frappe Testing Unit (Impertio-Studio/Frappe_Claude_Skill_Package, 188 stars) and Pytest Patterns (cohen-liel/hivemind, 110 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Donchitos (a GitHub user) maintains it in Donchitos/Claude-Code-Game-Studios, which has 25,951 GitHub stars. The repository holds 73 skills in this directory. The repository was last updated on October 8, 2026.
Source: Donchitos/Claude-Code-Game-Studios on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.