MCPInstall

gds-test-framework

Initialize game test framework for Unity, Unreal, or Godot. Use when the user says "test framework" or "set up testing"

Installs
43
Last 24h
—
Trending rank
—
Security
Not audited

Install

Works with every agent the skills CLI supports.

npx skills add https://github.com/bmad-code-org/bmad-module-game-dev-studio --skill gds-test-framework
  1. 01

    Install

    Run the command in your project. The CLI asks which agents to install for.

  2. 02

    Describe the task

    Ask your agent for something this skill covers. It loads gds-test-framework automatically when relevant.

  3. 03

    Review the result

    The agent follows the SKILL.md steps, scripts and references bundled with the skill.

SKILL.md

The instructions your agent reads when the skill is triggered.

Game Test Framework Setup

Workflow ID: gds-test-framework Version: 1.0 (BMad v6)

Conventions

  • Bare paths (e.g. template.md) resolve from the skill root.
  • {skill-root} resolves to this skill's installed directory (where customize.toml lives).
  • {project-root} is the nearest folder containing _bmad/, starting at the project working directory and moving up through its parents.
  • {skill-name} resolves to the skill directory's basename.

On Activation

Step 1: Resolve the Workflow Block

Run: uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --project-root {project-root} --key workflow

If the script fails, resolve the workflow block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:

  1. {skill-root}/customize.toml — defaults
  2. {project-root}/_bmad/custom/{skill-name}.toml — team overrides
  3. {project-root}/_bmad/custom/{skill-name}.user.toml — personal overrides

Any missing file is skipped. Scalars override, tables deep-merge, arrays of tables keyed by code or id replace matching entries and append new entries, and all other arrays append.

Step 2: Execute Prepend Steps

Execute each entry in {workflow.activation_steps_prepend} in order before proceeding.

Step 3: Load Persistent Facts

Treat every entry in {workflow.persistent_facts} as foundational context you carry for the rest of the workflow run. Entries prefixed file: are paths or globs under {project-root} — load the referenced contents as facts. All other entries are facts verbatim.

Step 4: Load Config

Load config from {project-root}/_bmad/gds/config.yaml and resolve:

  • user_name
  • communication_language

Step 5: Greet the User

Greet {user_name}, speaking in {communication_language}.

Step 6: Execute Append Steps

Execute each entry in {workflow.activation_steps_append} in order.

Activation is complete. If activation_steps_prepend or activation_steps_append were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.

Goal

Initialize a production-ready game test framework for Unity, Unreal Engine, or Godot projects. This workflow scaffolds the complete testing infrastructure including unit tests, integration tests, and play mode tests appropriate for the detected game engine.

Role

You are a Game QA Architect specializing in test infrastructure. You detect the game engine in use, scaffold the appropriate test framework, generate working example tests, and produce documentation — leaving the team with a fully operational testing setup from day one.


WORKFLOW ARCHITECTURE

This workflow detects the game engine and creates all necessary test infrastructure files directly in the game project.

Primary Output: {test_dir}/README.md

Supporting Components:

  • Validation: {installed_path}/checklist.md

Knowledge Base References:

  • knowledge/unity-testing.md
  • knowledge/unreal-testing.md
  • knowledge/godot-testing.md

Load and resolve configuration from {module_config}:

output_folder: {from config}
user_name: {from config}
communication_language: {from config}
document_output_language: {from config}
game_dev_experience: {from config}
date: {system-generated}

Resolve workflow variables:

test_dir: "{project-root}/tests"    # Root test directory
game_engine: "auto"                  # auto | unity | unreal | godot
test_framework: "auto"               # auto | gut (godot) | unity-test-framework | unreal-automation

EXECUTION

Preflight Requirements

Critical: Verify these requirements before proceeding. If any fail, HALT and notify the user.

  • Game project exists with identifiable engine
  • No test framework already configured (check for existing test directories)
  • Project structure is accessible

Step 1: Detect Game Engine

Actions

  1. Identify Engine Type

    Look for engine-specific files:

    • Unity: Assets/, ProjectSettings/ProjectSettings.asset, *.unity scene files
    • Unreal: *.uproject, Source/, Config/DefaultEngine.ini
    • Godot: project.godot, *.tscn, *.gd files
  2. Verify Engine Version

    • Unity: Check ProjectSettings/ProjectVersion.txt
    • Unreal: Check *.uproject file for EngineAssociation
    • Godot: Check project.godot for config_version
  3. Check for Existing Test Framework

    • Unity: Check for Tests/ folder, *.Tests.asmdef
    • Unreal: Check for Tests/ in Source, *Tests.Build.cs
    • Godot: Check for tests/ folder, GUT plugin in addons/gut/

Halt Condition: If existing framework detected, offer upgrade path or HALT.


Step 2: Scaffold Framework

Unity Test Framework

Knowledge Base Reference: knowledge/unity-testing.md

  1. Create Directory Structure

    Assets/
    ├── Tests/
    │   ├── EditMode/
    │   │   ├── EditModeTests.asmdef
    │   │   └── ExampleEditModeTest.cs
    │   └── PlayMode/
    │       ├── PlayModeTests.asmdef
    │       └── ExamplePlayModeTest.cs
    
  2. Generate Assembly Definitions

    EditModeTests.asmdef:

    {
      "name": "EditModeTests",
      "references": ["<GameAssembly>"],
      "includePlatforms": ["Editor"],
      "defineConstraints": ["UNITY_INCLUDE_TESTS"],
      "optionalUnityReferences": ["TestAssemblies"]
    }
    

    PlayModeTests.asmdef:

    {
      "name": "PlayModeTests",
      "references": ["<GameAssembly>"],
      "includePlatforms": [],
      "defineConstraints": ["UNITY_INCLUDE_TESTS"],
      "optionalUnityReferences": ["TestAssemblies"]
    }
    
  3. Generate Sample Tests

    Edit Mode test example:

    using NUnit.Framework;
    
    [TestFixture]
    public class DamageCalculatorTests
    {
        [Test]
        public void Calculate_BaseDamage_ReturnsCorrectValue()
        {
            // Arrange
            var calculator = new DamageCalculator();
    
            // Act
            float result = calculator.Calculate(100f, 1f);
    
            // Assert
            Assert.AreEqual(100f, result);
        }
    }
    

    Play Mode test example:

    using System.Collections;
    using NUnit.Framework;
    using UnityEngine;
    using UnityEngine.TestTools;
    
    public class PlayerMovementTests
    {
        [UnityTest]
        public IEnumerator Player_WhenInputApplied_Moves()
        {
            // Arrange
            var playerGO = new GameObject("Player");
            var controller = playerGO.AddComponent<PlayerController>();
    
            // Act
            controller.SetMoveInput(Vector2.right);
            yield return new WaitForSeconds(0.5f);
    
            // Assert
            Assert.Greater(playerGO.transform.position.x, 0f);
    
            // Cleanup
            Object.Destroy(playerGO);
        }
    }
    

Unreal Engine Automation

Knowledge Base Reference: knowledge/unreal-testing.md

  1. Create Directory Structure

    Source/
    ├── <ProjectName>/
    │   └── ...
    └── <ProjectName>Tests/
        ├── <ProjectName>Tests.Build.cs
        └── Private/
            ├── DamageCalculationTests.cpp
            └── PlayerCombatTests.cpp
    
  2. Generate Module Build File

    <ProjectName>Tests.Build.cs:

    using UnrealBuildTool;
    
    public class <ProjectName>Tests : ModuleRules
    {
        public <ProjectName>Tests(ReadOnlyTargetRules Target) : base(Target)
        {
            PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
    
            PublicDependencyModuleNames.AddRange(new string[] {
                "Core",
                "CoreUObject",
                "Engine",
                "<ProjectName>"
            });
    
            PrivateDependencyModuleNames.AddRange(new string[] {
                "AutomationController"
            });
        }
    }
    
  3. Generate Sample Tests

    #include "Misc/AutomationTest.h"
    
    IMPLEMENT_SIMPLE_AUTOMATION_TEST(
        FDamageCalculationTest,
        "<ProjectName>.Combat.DamageCalculation",
        EAutomationTestFlags::ApplicationContextMask |
        EAutomationTestFlags::ProductFilter
    )
    
    bool FDamageCalculationTest::RunTest(const FString& Parameters)
    {
        // Arrange
        float BaseDamage = 100.f;
        float CritMultiplier = 2.f;
    
        // Act
        float Result = UDamageCalculator::Calculate(BaseDamage, CritMultiplier);
    
        // Assert
        TestEqual("Critical hit doubles damage", Result, 200.f);
    
        return true;
    }
    

Godot GUT Framework

Knowledge Base Reference: knowledge/godot-testing.md

  1. Create Directory Structure

    project/
    ├── addons/
    │   └── gut/ (plugin files)
    ├── tests/
    │   ├── unit/
    │   │   └── test_damage_calculator.gd
    │   └── integration/
    │       └── test_player_combat.gd
    └── gut_config.json
    
  2. Generate GUT Configuration

    gut_config.json:

    {
      "dirs": ["res://tests/"],
      "include_subdirs": true,
      "prefix": "test_",
      "suffix": ".gd",
      "should_exit": true,
      "should_exit_on_success": true,
      "log_level": 1,
      "junit_xml_file": "results.xml"
    }
    
  3. Generate Sample Tests

    tests/unit/test_damage_calculator.gd:

    extends GutTest
    
    var calculator: DamageCalculator
    
    func before_each():
        calculator = DamageCalculator.new()
    
    func after_each():
        calculator.free()
    
    func test_calculate_base_damage():
        var result = calculator.calculate(100.0, 1.0)
        assert_eq(result, 100.0, "Base damage should equal input")
    
    func test_calculate_critical_hit():
        var result = calculator.calculate(100.0, 2.0)
        assert_eq(result, 200.0, "Critical hit should double damage")
    

Step 3: Generate Documentation

Create tests/README.md with:

  • Test framework overview for the detected engine
  • Directory structure explanation
  • Running tests locally
  • CI integration commands
  • Best practices for game testing
  • Links to knowledge base fragments

Step 4: Deliverables

Primary Artifacts Created

  1. Directory Structure — Engine-appropriate test folders
  2. Configuration Files — Framework-specific config (asmdef, Build.cs, gut_config.json)
  3. Sample Tests — Working examples for unit and integration tests
  4. Documentation — tests/README.md

Output Summary

After completing this workflow, provide a summary:

## Game Test Framework Scaffold Complete

**Engine Detected**: {Unity | Unreal | Godot}
**Framework**: {Unity Test Framework | Unreal Automation | GUT}

**Artifacts Created**:

- Test directory structure
- Framework configuration
- Sample unit tests
- Sample integration/play mode tests
- Documentation

**Next Steps**:

1. Review sample tests and adapt to your game
2. Run initial tests to verify setup
3. Use `test-design` workflow to plan comprehensive test coverage
4. Use `automate` workflow to generate additional tests

**Knowledge Base References Applied**:

- {engine}-testing.md
- qa-automation.md
- test-priorities.md

Validation

Refer to checklist.md for comprehensive validation criteria.

On Complete

Run: uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --project-root {project-root} --key workflow.on_complete

If the resolved workflow.on_complete is non-empty, follow it as the final terminal instruction before exiting.

FAQ

What does the gds-test-framework skill do?

Initialize game test framework for Unity, Unreal, or Godot. Use when the user says "test framework" or "set up testing"

How do I install gds-test-framework?

Run npx skills add https://github.com/bmad-code-org/bmad-module-game-dev-studio --skill gds-test-framework in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/gds-test-framework/ (personal) or .claude/skills/gds-test-framework/ (project).

Which AI agents can use gds-test-framework?

Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.

Is gds-test-framework safe to install?

No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.

Who maintains gds-test-framework?

It is published by bmad-code-org in bmad-code-org/bmad-module-game-dev-studio. It has 43 recorded installs.

More from bmad-code-org/bmad-module-game-dev-studio

View all →

gds-gdd

bmad-code-org/bmad-module-game-dev-studio

Open the skill to read its SKILL.md instructions.

Media & Creative54 installs

gds-brainstorm-game

bmad-code-org/bmad-module-game-dev-studio

Open the skill to read its SKILL.md instructions.

Media & Creative51 installs

gds-create-narrative

bmad-code-org/bmad-module-game-dev-studio

Open the skill to read its SKILL.md instructions.

Media & Creative50 installs

gds-agent-game-designer

bmad-code-org/bmad-module-game-dev-studio

Open the skill to read its SKILL.md instructions.

Media & Creative49 installs

gds-create-game-brief

bmad-code-org/bmad-module-game-dev-studio

Open the skill to read its SKILL.md instructions.

Media & Creative48 installs

gds-ux

bmad-code-org/bmad-module-game-dev-studio

Open the skill to read its SKILL.md instructions.

Popular testing & qa skills

View category →

tdd

mattpocock/skills

Test-driven development. Use when the user wants to build features or fix bugs test-first, mentions "red-green-refactor", or wants integration tests.

Testing & QA1.2M installs

grilling

mattpocock/skills

Grill the user relentlessly about a plan, decision, or idea. Use when the user wants to stress-test their thinking, or uses any 'grill' trigger phrases.

Testing & QA996.2K installs

migrate-to-shoehorn

mattpocock/skills

Migrate test files from as type assertions to @total-typescript/shoehorn. Use when user mentions shoehorn, wants to replace as in tests, or needs partial test data.

Testing & QA484.1K installs

run-train

lllllllama/rigorpilot-skills

Rigor Train skill for deep learning research repositories. Use when a documented or selected training command should be run conservatively for startup verification, short-run verification, full kickoff, or resume, with command, config, seed, log, checkpoint, status, and metric evidence written to standardized trainoutputs/. Do not use for environment setup, exploratory sweeps, speculative idea implementation, or end-to-end orchestration.

Testing & QA337.8K installs

test-driven-development

obra/superpowers

Use when implementing any feature or bugfix, before writing implementation code

Testing & QA261.8K installs

Use when implementation is complete, all tests pass, and you need to decide how to integrate the work

Testing & QA216.8K installs