Version 2.4.0 adds Mac UI testing helpers and an NUnit 5 sample to the existing adapter package. See the validation record.
Version 2.0.0 upgrades test tooling to released NUnit 5.0.0. See the migration guide and the separate unchanged upstream diagnostic suite.
For the complete local-to-processor development cycle, see the continuous integration guide, including private settings, gated actual-driver deployment, evidence and optional test-instance removal.
These tools run desktop, processor, live-device and Android UI tests, and report their results through the Windows runner, CLI, Visual Studio Test Explorer or VS Code's Testing view on Windows. Both editors use the same released test adapters. Driver submission is a separate, optional workflow documented in CrestronHomeDevTools; it is not required for testing or GitHub/NuGet publication.
For VS Code on Windows, see building net472 projects and running NUnit/processor workflows, including the tested C# Dev Kit settings and reusable build/test tasks. The same released adapters are used in both editors.
The tools include a Visual Studio Test Explorer workflow adapter, available as the stable CrestronHomeNUnit.TestAdapter NuGet package. Add it to a separate .NET 10 workflow test project to run the same gated development cycle from Visual Studio.
Version 1.2.1 also supports private initial-driver configuration and health checks using newly assigned instance IDs. The tooling coordinates desktop tests, updated Home test tiles and DevTools/build operations through a shared processor reservation. Upgrade the participating tools and test packages together, using DevTools 1.1.0 or later; see hardware CI setup and coordination. Build deployment settings and retained package inspection are documented in DevTools.
The workflow reconciles a standard project's Debug build counter with the processor catalogue before building, including packages previously deployed manually. It preserves the three release components and verifies a fresh package version before deployment. See version identity and custom manifest layouts.
Version 1.7.0 adds opt-in Android UI tests after the installed-driver checks, using your own ADB installation and emulator. The Crestron Home NUnit UI automation library is included in the test adapter package. It runs on Windows using .NET 10 and controls the Android app through ADB. It also supports a pinned Release package without rebuilding it, and reconciles Debug versions for renamed driver manifests. See the UI testing guide for verified coverage and worker-session limitations.
Room UI fixtures can inspect named room tiles, nested extension pages and complete selection lists through the adapter's room-navigation APIs, with observed Home restoration after assertions. Selection inspection does not change a chosen value; fixtures provide reviewed navigation/cancel controls and expected state for their identified device. Room-tile scrolling and compact room headings require adapter 1.8.1 or later; see the guide for search limits.
Adapter 1.9.0 and later also supports repeated controls in labelled rows. This lets a fixture identify one repeated control through its adjacent label, while retaining page checks and refusal of ambiguous targets. Use adapter 1.9.0 or later for these selectors.
Adapter 1.11.0 adds guarded extension-page scrolling and bounded saved-endpoint inspection on smaller screens. Fixtures retain responsibility for verifying each viewport, complete control coverage and restoration.
Version 1.11.1 verifies the complete retained Android test program, including dependencies and runtime settings, against reference hashes captured before execution. Changed files prevent a passing stage; independent worker authentication remains a separate responsibility.
Version 1.12.0 adds explicit Android case selection and an installed-driver test phase. Run selected C# NUnit fixtures against an existing driver without redeploying it, retaining separate test, restoration, cleanup and candidate-verification results. Use version 1.12.1 or later: its DevTools 1.13.1 dependency fixes payload lookup for the full catalogue IDs returned by processors. Hardware validation of the corrected workflow passed selected read-only fixtures, before/after candidate checks, temporary-child cleanup and reservation release.
Successful CI workflows can also remove their own stored test packages with removeTestPackageAfterSuccessfulRun, preserving pre-existing/manual packages and reporting catalogue entries that remain cached until a planned reboot. Deployment retains the original package filename. See cleanup and interrupted runs.
Optional installed-driver controls capture physical state through a read-only probe, verify command completion and independently observe restoration. Artifact reuse can retain verified build bytes across runs while rerunning every required test stage. Both features are opt-in. Guarded code rollback additionally requires a known previous package and a driver-specific configuration verifier; it preserves current settings and tokens.
To run hardware checks from GitHub Actions on your own Windows computer and processor, follow GitHub hardware CI setup. It includes private configuration, a relocatable plan wrapper, and an automatic GitHub App reporting template for a private orchestration repository. One App can serve all of your projects.
Run NUnit tests on a Crestron Home processor, using a Windows runner, automation CLI or a standalone test tile in Crestron Home. This checks your code in the processor's Mono-based environment, where SDK, filesystem and networking behavior can differ from Windows.
Download the latest release | Changelog | Full user and developer guide | Create your own test package
Copyright (c) 2026 Neil Colvin. Project-owned code is MIT licensed. NUnit and other dependencies retain their own licenses and notices.
- What you install
- Quick start
- Using the Windows runner
- Standalone Home tiles
- Your own processor tests
- Command-line automation
- Build and release
- Documentation and known limitations
- Android UI testing
- Set up an Android emulator and the Crestron Home app
- Testing an existing Release candidate without rebuilding it
- Licenses and acknowledgments
| Component | Purpose |
|---|---|
| Windows runner | Finds packages, authenticates, selects and runs tests, transfers inputs and displays results. The Windows x64 ZIP includes .NET 10; no separate runtime installation is needed. |
| Automation CLI | Self-contained Windows x64 console for unattended test runs and the complete gated development workflow. Uses CrestronHomeDevTools 1.4.0 from NuGet. |
| Test Explorer adapter | NuGet package for a separate .NET 10 workflow project. Runs the complete workflow and reports individual test outcomes in Visual Studio or VSTest. |
| NUnit Test Host | An optional processor package containing selected NUnit framework self-tests and 34 language/runtime compatibility tests. Appears under Utility in Configure/Setup. |
| Your processor test package | Contains your NUnit tests, their dependencies, a test host and its own Home tile. |
Each processor test package is self-contained. You do not need to install NUnit Test Host before installing another test package. Multiple packages can coexist on a processor, each advertising an automatically assigned TCP port.
For automation, download CrestronHomeNUnit.Cli-win-x64.zip, extract it completely and run CrestronHomeNUnit.Cli.exe --help. See the CLI guide and CI workflow guide.
- Download CrestronHomeNUnit.Runner-win-x64.zip and, to try the supplied suites, CrestronHomeNUnit.Driver.pkg from Releases. The automatic source-code archives are not installable packages.
- Upload the
.pkgto/user/ThirdPartyDrivers/Importusing your processor's SFTP credentials. Import and add NUnit Test Host through Crestron Home Configure/Setup, under Utility. - Extract the complete Windows ZIP and launch
CrestronHomeNUnit.Runner.exe. - Select Find packages, choose the installed package, and connect with that processor's existing SFTP username and password. Known credentials allow automatic connection when selecting a package.
- Choose a suite. Start with C# 13 Compatibility, then try the framework self-tests. Use Run all, or Discover, select a fixture/test and choose Run selection.
You need a Windows x64 computer supported by .NET 10, a compatible Crestron Home Entity V2 processor, and network access between them. Processor packages target net472 and use Driver SDK 27.0.24. Neither Visual Studio nor the SDK is needed to run the downloaded Windows application.
- Discover populates the test tree. Run all does not require discovery first; Run selection requires a selected fixture or test.
- Select a different package while idle to switch connections. The runner refreshes a discovered package's current address and port before connecting. Find packages also updates changed endpoints.
- After a dropped connection, the runner makes up to three rediscovery/reconnect attempts. Previous results remain visible, and interrupted tests are never rerun automatically. If the package is still restarting, use Connect once its Home tile is ready.
- Test inputs... selects configuration files shared by all suites in the same processor package. Switching suites keeps the selection; other packages and processors have separate inputs. Existing suite selections migrate when they agree; if they conflict, choose the intended files once for the package. The runner transfers their current contents when discovering or running tests. Private device settings are not part of a published package.
- Live/manual suites run only when explicitly selected in the runner. Their fixtures may operate physical equipment; review their requirements and choose the intended devices.
- Use at next restart remembers the package, suite and test selection. Restart restoration rediscovers the package's current endpoint and never starts tests automatically.
- Window position, size and maximized state save immediately, independently of that checkbox. Minimization is ignored; restoration handles missing monitors and smaller screens.
- Live output, detailed results and Open results folder provide diagnostics. Completed results are retained when a connection is interrupted. Cancellation is cooperative.
Settings live under %LOCALAPPDATA%/CrestronHomeNUnit; saved credentials use Windows DPAPI. Deployment settings and any legacy files in a checkout belong in .git/info/exclude, rather than a published .gitignore. See the guide for privacy and local configuration.
Ordinary suites can run from the installed package's Home tile without the Windows runner. The supplied host exposes its framework and compatibility suites. Generated packages normally expose unit tests, discovery and host/connection status; they can customize their tile for additional ordinary suites.
The tile is not an automatically generated picker for every fixture. Detailed selection, private input transfer and explicit live/manual execution use the Windows runner. Each test package owns its own UI; a driver-under-test's UI resources remain separate from the test-host tile.
Keep tests in their ordinary NUnit test project so Visual Studio's NUnit adapter and the processor can use the same test sources. Add a net472-only processor package project using New-ProcessorTestProject.ps1 and the shared package SDK.
For Crestron-specific drivers, that project can stay in the driver's solution. For independent libraries, keep Crestron packaging in a separate repository, preserving the library repository's platform independence. Test .pkg files are release assets; this project does not publish test packages to NuGet.
See the package creation guide and repository layout and ownership.
A standalone .NET 10 CLI shares the Windows runner's TCP and authentication code. It supports package discovery, suite selection, private input transfer, NUnit XML results and CI exit codes. See Command-line processor tests.
The CLI also runs the gated development workflow: local tests, processor package installation, processor/live tests, actual-driver update and checks, then test-instance cleanup. Representative Entity V2 and V1 runs have been validated on hardware, including the explicitly authorized V1 reboot. The Visual Studio adapter uses the same backend.
For source and package CI checks without duplicated test totals, see discovery-based coverage validation.
From version 1.10.0, an optional androidTests.managedChildren list creates test-owned children of the actual driver. Fixtures receive their actual IDs through session.Context.RequireManagedDevice(alias). The workflow removes those children only after verified restoration and retains uncertain runs for reconciliation. Existing manual installations remain outside this cleanup scope. See the plan example and lifecycle.
Updating to v1.0.1: close the runner and extract the complete new Windows ZIP. Saved preferences and credentials remain in the user profile. The reconnection fix works with existing processor packages. Package authors should update their shared SDK checkout or pin, rebuild and redeploy to receive the fixes for dependency resource helpers and anonymous JSON payload types.
Open CrestronHomeNUnit.sln in Visual Studio with .NET 10 SDK support and .NET Framework 4.7.2 targeting tools. Install the Crestron Driver SDK and ILRepack 2.0.45 as described in the build guide.
Build CrestronHomeNUnit.Runner for Windows, or CrestronHomeNUnit.Driver for the supplied processor package. The runner targets net10.0-windows; processor packages remain net472. Configure private deployment settings locally. Automatic deployment is limited to configured Debug builds inside Visual Studio.
PublishRunner.ps1 creates a self-contained Windows x64 ZIP. Licensed local builds can set RunnerIconPath in the excluded CrestronHomeNUnit.Runner.Local.targets. The public source has an MIT icon fallback; official releases use the privately supplied GlyphLab icon.
For a GitHub release, prepare RELEASE-NOTES.md for the new version, then run the Release workflow on main with a new three-part version. CI sets the version, adds the dated changelog entry from those release notes, builds and validates the packages, pushes the release commit and annotated tag, then publishes the runner, CLI, processor package, adapter, documentation and checksums. The adapter alone is also published to NuGet using the release environment and package-scoped Trusted Publishing policy; repository variable NUGET_USER identifies its owner. Release version changes occur in CI; local Release builds preserve the manifest version. Release CI does not deploy to processors.
- Complete user and developer guide: discovery, authentication, inputs, package structure, compatibility, results, troubleshooting and release details.
- Processor package guide and TCP protocol.
- Validation history, changelog and release notes.
The host uses official NUnit 5.0.0 NuGet binaries, with documented packaging adaptations. It uses the NUnit framework API; NUnitLite and a maintained framework fork are not dependencies.
The included NUnit tests are a selected subset. The adapted NUnit 5 framework suite has passed repeated Windows runs and completed repeated processor runs without failures. The earlier stream-comparison and disposed-handle fixes now come from upstream NUnit. Platform-specific skips and timing warnings can occur. Fatal host-process failures cannot preserve a TCP connection. See the full guide's validation and limitations.
Project-owned material: Copyright (c) 2026 Neil Colvin, MIT License.
The NUnit framework and imported self-tests are Copyright (c) Charlie Poole, Rob Prouse and Contributors, under NUnit's MIT license. Imported source retains its upstream notices; adaptations are recorded in the provenance document. The licensed GlyphLab application icon and all other dependencies are covered by Third-party notices and the full texts under licenses.
Crestron notice: Crestron and Crestron Home are trademarks or registered trademarks of Crestron Electronics, Inc. This project is not affiliated with, endorsed by, or sponsored by Crestron Electronics, Inc. It is an independent, unofficial development and testing tool. Use of the NUnit name identifies the test framework and included upstream tests; this is not an official NUnit distribution or an NUnit-endorsed Crestron product.
The Crestron SDK is obtained separately under Crestron's terms. Its proprietary components are platform/build dependencies and are not relicensed under MIT.