Skip to main content

English | 中文

godot-e2e

CI PyPI Python Godot License

Out-of-process E2E testing tool for Godot


Quick Start

1. Install the addon

Copy addons/godot_e2e/ into your Godot project's addons/ directory, then enable the GodotE2E plugin in Project > Project Settings > Plugins. This automatically registers the AutomationServer autoload.

The server is completely dormant unless the game is launched with the --e2e flag, so it has no effect in production builds.

2. Install the Python package

pip install godot-e2e

Or install from source:

pip install -e .

3. Write a test

from godot_e2e import GodotE2E

def test_player_moves(game):
    initial_x = game.get_property("/root/Main/Player", "position:x")
    game.press_action("move_right")
    game.wait_physics_frames(10)
    new_x = game.get_property("/root/Main/Player", "position:x")
    assert new_x > initial_x

Run:

godot-e2e tests/ -v

Compatibility

godot-e2e Godot Python
1.2.x 4.5+ 3.9+
1.0–1.1.x 4.x 3.9+

Older versions remain published on PyPI and the Godot Asset Library, but only the latest row receives bug fixes. Bumping the minimum supported Godot version is treated as a MINOR bump (see docs/versioning.md).


Features

  • Out-of-process — game runs in a separate process; crashes are isolated and timeouts are safe
  • No engine modifications — works with standard Godot 4.5+ binaries
  • Synchronous Python API — no async/await required in test code
  • Input simulation — keyboard, mouse clicks, named actions
  • Node operations — get/set properties, call methods, group lookup, node existence checks
  • Frame synchronization — wait for process frames, physics frames, or game time
  • Scene management — change scene, reload scene
  • Screenshot capture — manual or automatic on test failure (pytest integration)
  • pytest fixtures — built-in fixtures with configurable test isolation strategies

How It Works

Two processes communicate over a local TCP connection:

  1. Python (pytest) — sends JSON-encoded commands and waits for responses
  2. Godot (AutomationServer) — an Autoload that listens on a TCP port, executes commands on the main thread, and sends back results

The AutomationServer only opens its socket when the game is started with --e2e (and optionally --e2e-port=<port>). When --e2e-port=0 is used with --e2e-port-file=<path>, the server picks a random available port and writes it to the given file — this enables running multiple instances in parallel. In normal play or exported builds without the --e2e flag, the autoload does nothing.

pytest ──── TCP (localhost) ──── AutomationServer (Godot Autoload)
  sends: {"cmd": "get_property", "path": "/root/Main/Player", "prop": "position:x"}
  gets:  {"ok": true, "value": 400.0}

pytest Fixtures

Three isolation strategies are available depending on your needs.

Strategy 1: reload_scene (default, fast)

Reloads the current scene between each test. Cheap and usually sufficient.

# conftest.py
import pytest
from godot_e2e import GodotE2E

GODOT_PROJECT = "/path/to/your/project"

@pytest.fixture(scope="module")
def _game_process():
    with GodotE2E.launch(GODOT_PROJECT) as game:
        game.wait_for_node("/root/Main", timeout=10.0)
        yield game

@pytest.fixture(scope="function")
def game(_game_process):
    _game_process.reload_scene()
    _game_process.wait_for_node("/root/Main", timeout=5.0)
    yield _game_process

Strategy 2: game_fresh (strongest isolation)

Launches a brand new Godot process for each test. Slowest but fully isolated.

@pytest.fixture(scope="function")
def game_fresh():
    with GodotE2E.launch(GODOT_PROJECT) as game:
        game.wait_for_node("/root/Main", timeout=10.0)
        yield game

Strategy 3: Shared session (fastest)

One process for the entire test session. Use when tests are carefully ordered and do not share mutable state.

@pytest.fixture(scope="session")
def game_session():
    with GodotE2E.launch(GODOT_PROJECT) as game:
        game.wait_for_node("/root/Main", timeout=10.0)
        yield game

CI Configuration

Linux (GitHub Actions, headless via Xvfb)

- name: Install Godot
  run: |
    wget -q https://github.com/godotengine/godot-builds/releases/download/4.5-stable/Godot_v4.5-stable_linux.x86_64.zip
    unzip -q Godot_v4.5-stable_linux.x86_64.zip
    sudo mv Godot_v4.5-stable_linux.x86_64 /usr/local/bin/godot

- name: Run E2E tests
  run: |
    pip install -e .
    xvfb-run --auto-servernum godot-e2e tests/e2e/ -v

Windows (GitHub Actions)

- name: Install Godot
  run: |
    Invoke-WebRequest -Uri "https://github.com/godotengine/godot-builds/releases/download/4.5-stable/Godot_v4.5-stable_win64.exe.zip" -OutFile godot.zip
    Expand-Archive godot.zip -DestinationPath C:\godot
  shell: pwsh

- name: Run E2E tests
  run: |
    pip install -e .
    godot-e2e tests/e2e/ -v
  env:
    GODOT_PATH: C:\godot\Godot_v4.5-stable_win64.exe

macOS (GitHub Actions)

- name: Install Godot
  run: |
    wget -q https://github.com/godotengine/godot-builds/releases/download/4.5-stable/Godot_v4.5-stable_macos.universal.zip
    unzip -q Godot_v4.5-stable_macos.universal.zip
    sudo mv "Godot.app" /Applications/Godot.app

- name: Run E2E tests
  run: |
    pip install -e .
    godot-e2e tests/e2e/ -v
  env:
    GODOT_PATH: /Applications/Godot.app/Contents/MacOS/Godot

Set GODOT_PATH to override the default Godot executable path, or use godot-e2e --godot-path /path/to/godot tests/. The default search order is: GODOT_PATH environment variable, then godot, godot4, Godot_v4 on PATH.


API Reference

Launch / Lifecycle

Method Description
GodotE2E.launch(project_path, **kwargs) Context manager. Launches Godot and returns a connected GodotE2E instance. Pass port=0 (default) to auto-allocate a free port.
GodotE2E.connect(host, port, token) Connect to an already-running Godot instance with the --e2e flag.
game.close() Terminate the Godot process and close the connection.

Node Operations

Method Description
game.node_exists(path) Returns True if the node at path exists in the scene tree.
game.wait_for_node(path, timeout=5.0) Blocks until the node exists or timeout is reached.
game.get_property(path, prop) Get a property value. Supports dotted paths like "position:x".
game.set_property(path, prop, value) Set a property value on a node.
game.call_method(path, method, *args) Call a method on a node and return the result.
game.find_by_group(group) Return a list of node paths for all nodes in the given group.

Input Simulation

Method Description
game.press_action(action) Press and immediately release a named input action.
game.input_action(action, pressed) Set a named input action pressed state.
game.key_press(scancode) Press and release a key by scancode.
game.mouse_click(x, y, button=1) Click a mouse button at the given screen coordinates.

Frame Synchronization

Method Description
game.wait_frames(n) Wait for n process (_process) frames to complete.
game.wait_physics_frames(n) Wait for n physics (_physics_process) frames to complete.
game.wait_seconds(t) Wait for t in-game seconds (affected by Engine.time_scale).

Scene Management

Method Description
game.change_scene(scene_path) Change to a scene by res:// path.
game.reload_scene() Reload the current scene.

Diagnostics

Method Description
game.screenshot(path=None) Capture a screenshot. Returns PNG bytes; saves to path if given.

Examples

Example Description
minimal Simplest setup — node checks, property reading, method calls (3 tests)
platformer Player movement, scoring, groups, scene reload (5 tests)
ui_testing Button clicks, label verification, scene navigation (5 tests)

Run any example:

cd examples/minimal
godot-e2e tests/e2e/ -v

License

Apache 2.0. See LICENSE.

Metadata

Release files for godot-e2e 1.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for godot-e2e 1.3.0
File Size Uploaded
godot_e2e-1.3.0.tar.gz 56.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for godot-e2e 1.3.0
File Interpreter ABI Platform
godot_e2e-1.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 96.7 kB

Release files / godot_e2e-1.3.0.tar.gz

Download URL godot_e2e-1.3.0.tar.gz
Size 56.1 kB
Tags Source
SHA-256 checksum
How to use checksums
07b0b853ad65c529224f724f5d557ed353382a7c71b0f9f1cd544befd57e9a0c
BLAKE2b-256 checksum
How to use checksums
72016fc11072d74870ab3187bd3c53505957e3e9582b92e0ba48cf31e69128b5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 9, 2026.

Transparency log

Release files / godot_e2e-1.3.0-py3-none-any.whl

Download URL godot_e2e-1.3.0-py3-none-any.whl
Size 40.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4c6a7a5a72f3d3c67191f4a97ddb7fb5cd5226782d4893bcbc08415118f62687
BLAKE2b-256 checksum
How to use checksums
b93d43eda8c197572ad7f37a764600d44d98be80cb33694a52113a0a1d7ec2f1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 9, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.3.0 This release

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page