RevitDevTool.PyTest
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
force_launch = false(default): scan forDevTools_*pipes matchinghost_name/host_version, reuse a free instance (suite leasing), or reconnect to a leased PID.- No matching instance: auto-launch host when
host_versionis set (unless--host-pipepins an existing pipe). 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(ortest_*.py); RevitDevTool installs them beforetests/run. IronPythontest_*_ipy.pydoes not use PEP 723 —ipytests/runnever 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
- Local pytest collects tests.
- Plugin connects to
DevTools_{Host}_{Version}_{PID}. - Node IDs sent via JSON-RPC method
tests/run(BridgeMessagelength-prefixed frames). - Host runs
PytestRunner.pyembedded in RevitDevTool (PytestExecutionServiceon main thread). - Results and optional progress notifications return to the client.
- 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 / Cursor — python.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
Metadata
Release files for revitdevtool-pytest 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| revitdevtool_pytest-0.4.0.tar.gz | 73.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| revitdevtool_pytest-0.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 103.7 kB
Release files / revitdevtool_pytest-0.4.0.tar.gz
| Download URL | revitdevtool_pytest-0.4.0.tar.gz |
|---|---|
| Size | 73.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
88ccaa1a7b2f4cb4590793928ab9f9ed6397600b051768fb85c360fd73d8098a
|
|
BLAKE2b-256 checksum How to use checksums |
85b5662e3ff53322f5c9363438f050016ad804fae146027f212b43e5428a468b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 4, 2026.
Transparency logRelease files / revitdevtool_pytest-0.4.0-py3-none-any.whl
| Download URL | revitdevtool_pytest-0.4.0-py3-none-any.whl |
|---|---|
| Size | 30.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
dcc5c682b17b8935eaefd3221c5077eb39159736c2d29fff1625e341c6f6556f
|
|
BLAKE2b-256 checksum How to use checksums |
4c8d88f32b479d88adf51ea9e139eb064c1785c4224cf437372dd17705a35936
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 4, 2026.
Transparency log