Skip to main content

nvda-addon-testkit

End-to-end testing for NVDA add-ons, against a real NVDA, in CI.

Your add-on's logic can be unit-tested with stubs. What cannot be stubbed is whether it installs, registers, and behaves inside NVDA itself. This kit provisions a disposable portable NVDA, installs your add-on into it, and lets pytest drive it.

def test_my_addon_announces_itself(nvda, addon_under_test):
    before = nvda.speech.index()
    nvda.keys.press("NVDA+shift+m")
    assert "my add-on is ready" in nvda.speech.wait_for("ready", timeout=10, since=before).text
    nvda.log.assert_no_errors()

Install

pip install nvda-addon-testkit

Configure

[tool.nvda-testkit]
addon-bundle = "dist/my-addon-*.nvda-addon"
nvda-channel = "stable"

Run in GitHub Actions

jobs:
  e2e:
    runs-on: windows-2025
    steps:
      - uses: actions/checkout@v5
      - uses: zirekhq/nvda-addon-testkit@v1
        with:
          nvda-channel: stable
      - run: pytest tests_e2e/ -v

What you get

Fixture What it gives you
nvda a connected client, reset between tests
addon_bundle the path to your built .nvda-addon
addon_under_test that bundle, installed and enabled, NVDA restarted
Namespace Use it for
nvda.speech what NVDA asked to say, and waiting for it
nvda.braille the raw text sent to the braille display
nvda.keys sending gestures through NVDA's own input pipeline
nvda.config reading and writing NVDA's configuration
nvda.log structured log records, and assert_no_errors()
nvda.addons two-phase install, remove, and state

Requirements

Windows to run the tests. NVDA is downloaded automatically — you do not need one installed, and nothing touches an NVDA you already have.

Tests run serially: only one NVDA can own a desktop session, so pytest-xdist with more than one worker is refused rather than silently producing nonsense.

Developing the kit itself

The host side is fully testable on Linux against a scriptable double:

pip install -e ".[dev]"
python tools/build_spy.py
pytest                       # host and spy unit tests, any platform
pytest tests_e2e/ -v         # real NVDA, Windows only
nvda-testkit doctor          # check this machine

Licence

GPL-2.0-or-later.

Metadata

Release files for nvda-addon-testkit 0.1.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 nvda-addon-testkit 0.1.0
File Size Uploaded
nvda_addon_testkit-0.1.0.tar.gz 81.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for nvda-addon-testkit 0.1.0
File Interpreter ABI Platform
nvda_addon_testkit-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 117.9 kB

Release files / nvda_addon_testkit-0.1.0.tar.gz

Download URL nvda_addon_testkit-0.1.0.tar.gz
Size 81.4 kB
Tags Source
SHA-256 checksum
How to use checksums
e1fa7129fa73a83fd069bb4b6baa1315a4ea754a54656428c2c8e952f819eb9c
BLAKE2b-256 checksum
How to use checksums
ac27da7c3527745b6451f9586c3a293fb92b243108885425b45ee31c63dfbed9
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 Aug 9, 2026.

Transparency log

Release files / nvda_addon_testkit-0.1.0-py3-none-any.whl

Download URL nvda_addon_testkit-0.1.0-py3-none-any.whl
Size 36.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cfb8c885f0c6c776fe70fae81ccd4111f6dfcded78506d45434dedc640eda997
BLAKE2b-256 checksum
How to use checksums
b754645454dd409f81441d29508f5d2e5159bab1a89fd23e862c33694acd7c02
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 Aug 9, 2026.

Transparency log

Release history Release notifications | RSS feed

1.1.0

2 release files

1.0.0

2 release files

0.1.3

2 release files

0.1.1

2 release files

This release

0.1.0 This release

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