Skip to main content

RevitDevTool.PyTest

PyPI version Python License: MIT

pytest plugin for testing CAD/BIM API code inside live host applications via the RevitDevTool Named Pipe bridge.

Write tests locally with pytest; execution happens inside the host process. Currently supported: Revit and AutoCAD family only. Navisworks, Rhino, Tekla, and other hosts are in progress.

Installation

pip install revitdevtool_pytest
# or
uv add revitdevtool_pytest
Requirement Version
Python >= 3.10
pytest >= 9.0
pywin32 >= 311
OS Windows (Named Pipes)
Host RevitDevTool add-in loaded

Supported hosts

Supported today

host_name Application Pipe prefix
revit Autodesk Revit Revit
autocad AutoCAD AutoCad
civil3d Civil 3D Civil3D
plant3d Plant 3D Plant3D
acadarch AutoCAD Architecture AcadArch
acadmech AutoCAD Mechanical AcadMech
acadmep AutoCAD MEP AcadMep
acadelec AutoCAD Electrical AcadElec
acadmap3d AutoCAD Map 3D AcadMap3D

In progress

host_name Application Status
navisworks Navisworks Not validated
rhino Rhino Not validated
tekla Tekla Structures Not validated

The plugin registry may list additional names for future work. Treat them as experimental until documented here as Supported today.

Pipe names (pytest only)

The plugin connects to the pytest/control pipe:

DevTools_{Host}_{Version}_{PID}

Examples: DevTools_Revit_2025_12345, DevTools_AutoCad_2026_7890

MCP clients use a separate pipe: DevToolsMcp_{Host}_{Version}_{PID}. Do not point pytest at an MCP pipe.

Quick start (consumer project)

uv init my-host-tests && cd my-host-tests
uv add revitdevtool_pytest pytest

pyproject.toml:

[tool.pytest.ini_options]
host_name = "revit"
host_version = "2025"
force_launch = false
per_test_timeout = "60"
launch_timeout = "180"

tests/conftest.py:

import pytest

@pytest.fixture(scope="session")
def revit_uiapp():
    return __revit__

@pytest.fixture(scope="session")
def revit_doc(revit_uiapp):
    return revit_uiapp.ActiveUIDocument.Document

tests/test_smoke.py:

def test_active_view(revit_doc):
    assert revit_doc.ActiveView is not None
uv run pytest -v

Configuration

Option Default Description
host_name "revit" Target host — use Supported today names only.
host_version Version string ("2025", "8.0", …). Required for launch.
force_launch false Force a new host instance (skip reuse). Requires host_version.
per_test_timeout "60" Per-test budget (seconds). The tests/run pipe wait is this × collected tests.
launch_timeout "180" Wait for host pipe after launch (seconds).
host_pipe Explicit pipe name (skip discovery).

CLI flags override INI: --host, --host-version, --force-launch, --per-test-timeout, --launch-timeout, --host-pipe.

Connection behavior

  1. force_launch = false (default): scan for DevTools_* pipes matching host_name / host_version, reuse a free instance (suite leasing), or reconnect to a leased PID.
  2. No matching instance: auto-launch host when host_version is set (unless --host-pipe pins an existing pipe).
  3. force_launch = true: always spawn a new process and wait for its pipe.

Print output

Captured print() from in-host tests is shown for passing tests (same as -rP). No extra flags needed.

Writing tests

  • Put host API imports inside functions — collection runs on your machine, execution in the host.
  • Use fixtures for __revit__, documents, and rollback helpers.
  • Declare suite dependencies with PEP 723 in CPython conftest.py (or test_*.py); RevitDevTool installs them before tests/run. IronPython test_*_ipy.py does not use PEP 723 — ipytests/run never installs packages.
# /// script
# dependencies = ["numpy>=2.0", "polars>=1.0"]
# ///

Revit rollback fixture

@pytest.fixture
def revit_auto_rollback(revit_transaction_service):
    revit_transaction_service.StartChanges()
    try:
        yield revit_transaction_service
    finally:
        revit_transaction_service.RevertChanges()

How it works

  1. Local pytest collects tests.
  2. Plugin connects to DevTools_{Host}_{Version}_{PID}.
  3. Node IDs sent via JSON-RPC method tests/run (BridgeMessage length-prefixed frames).
  4. Host runs PytestRunner.py embedded in RevitDevTool (PytestExecutionService on main thread).
  5. Results and optional progress notifications return to the client.
  6. Plugin maps CaseResult → standard pytest reports.

Developing this repository

Clone and run integration tests against a live host:

cd RevitDevTool.PyTest
uv run pytest -v                          # Revit suite (default)
uv run pytest tests/Revit/test_smoke.py -v
uv run pytest --host civil3d --host-version 2026  # after switching testpaths/host in pyproject.toml

Layout

Path Purpose
src/revitdevtool_pytest/ Plugin source (published wheel)
tests/Revit/ Revit integration tests + schedule/ helpers
tests/Civil3d/ Civil 3D / AutoCAD API tests

Revit suite settings in pyproject.toml: testpaths = ["tests/Revit"], pythonpath = ["tests/Revit"] for local schedule imports.

Optional env: REVIT_TEST_MODEL_PATH — path to .rvt for revit_doc fixture (default F:\Project1.rvt).

IDE integration

VS Code / Cursorpython.testing.pytestEnabled: true. Plugin detects vscode_pytest / TEST_RUN_PIPE and disables CLI streaming to avoid duplicate tree entries.

PyCharm — enable pytest as test runner.

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

revitdevtool_pytest-0.4.0.tar.gz (73.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

revitdevtool_pytest-0.4.0-py3-none-any.whl (30.6 kB view details)

Uploaded Python 3

File details

Details for the file revitdevtool_pytest-0.4.0.tar.gz.

File metadata

  • Download URL: revitdevtool_pytest-0.4.0.tar.gz
  • Upload date:
  • Size: 73.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for revitdevtool_pytest-0.4.0.tar.gz
Algorithm Hash digest
SHA256 88ccaa1a7b2f4cb4590793928ab9f9ed6397600b051768fb85c360fd73d8098a
MD5 3c28686784b318a0045e5220bfb70814
BLAKE2b-256 85b5662e3ff53322f5c9363438f050016ad804fae146027f212b43e5428a468b

See more details on using hashes here.

Provenance

The following attestation bundles were made for revitdevtool_pytest-0.4.0.tar.gz:

Publisher: publish.yml on trgiangv/RevitDevTool.PyTest

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file revitdevtool_pytest-0.4.0-py3-none-any.whl.

File metadata

File hashes

Hashes for revitdevtool_pytest-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 dcc5c682b17b8935eaefd3221c5077eb39159736c2d29fff1625e341c6f6556f
MD5 8e1856195501a8bcae9215ae7acc0717
BLAKE2b-256 4c8d88f32b479d88adf51ea9e139eb064c1785c4224cf437372dd17705a35936

See more details on using hashes here.

Provenance

The following attestation bundles were made for revitdevtool_pytest-0.4.0-py3-none-any.whl:

Publisher: publish.yml on trgiangv/RevitDevTool.PyTest

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.4.0 This release

2 files

0.3.0

2 files

0.2.0

2 files

0.1.0

2 files

0.0.3

2 files

0.0.2

2 files

0.0.1

2 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