.NET Test
| This documentation was generated with the assistance of AI. Please report any inaccuracies. |
Run a .NET project or solution’s test suite through the .NET CLI (dotnet test), scoped to whatever the caller
asked for — everything, a single class, a single method, a wildcard/namespace pattern, or a trait/category
expression. This is the .NET/C# equivalent of iru-java-test. It is a read-only reporting skill: it runs tests and
summarizes the outcome, it does not fix failures unless asked to as an explicit follow-up.
Purpose
iru-dotnet-test turns a loosely-specified request ("run the FooTests", "just the fast ones", "everything") into the
correct dotnet test --filter invocation and a concise pass/fail summary. It exists so that running and
narrowing down tests doesn’t require hand-composing filter-expression syntax each time, and so that a calling
skill (or a human) gets back a short report instead of a full raw test-run log.
It is Windows-desktop aware. A new Step 0 parses the arguments, detects the host (Windows or not), classifies every
.csproj (portable, net-windows*, WinUI, UI-test projects) and detects the test runner (VSTest or
Microsoft.Testing.Platform, where dotnet test takes --project/--solution). On a Windows-desktop repository it
adds TestCategory!=UI to every ordinary run so FlaUI UI tests never run by default, and appends
-p:EnableWindowsTargeting=true on a non-Windows host. Off Windows it never runs the whole solution — a
net*-windows* test project aborts the run even though the portable projects passed ("Microsoft.WindowsDesktop.App
not found", exit 1 under VSTest, exit 150 under MTP) — but runs each portable test project separately and lists every
Windows test project (or one referencing a WinUI project) as unverified (needs Windows). Multiple solution files or
test projects with no solution make it ask which to target. A "Known quirks" section records what was verified on
macOS with the .NET 10 SDK.
The new ui selector (also accepted with a lock: held line when the caller already owns the lock) runs
--filter "TestCategory=UI" on the UI-test project only on a Windows host with an interactive desktop session:
it takes the repository-wide .integration-test.lock (atomic mkdir, owner file, stale after 60 minutes, released on
every exit path), builds the app the tests launch, runs them, and otherwise reports unverified. Skipped or not-run UI
tests are never reported as passed.
A ui run follows the catalog’s UI contract (see Building user interfaces).
Beyond FlaUI desktop tests it also runs a .NET command-line tool’s Terminal.Gui view tests ([TestCategory("UI")] in a
portable test project, rendered through the ANSI driver), which run on any host with no lock and no app build. It sets
UI_SCREENSHOTS_DIR (default <repo root>/.ui-screenshots), clears it only on a full UI run, validates every capture
name against the <kind>/<Id>/<state>--<direction>--<theme>[--<variant>…] layout (.png, or .txt for terminal
captures), and reports screenshot counts per kind, malformed names, accessibility violations (Axe.Windows for desktop,
the asserted tui-* checks for terminal UIs; count + rule ids) and the .ui-quality.yml level applied (enforce|report|off|none).
Plugin
Shipped by the iru-dotnet plugin of the ai-catalog marketplace (install with /plugin install iru-dotnet@ai-catalog; see Plugins).
Inputs
| Argument | Required | Description | Default |
|---|---|---|---|
|
No |
Names what to run: a test class, a class+method, several classes, a wildcard/namespace pattern, a trait/category
expression, or a specific project/solution path. Mapped to the correct |
None — omitting it runs the full suite ( |
|
No |
Run the UI tests ( |
Not applicable. |
|
No |
A |
Lock is taken and released by this skill. |
The selector maps to dotnet test parameters as follows:
| What the caller wants | Parameter | Example |
|---|---|---|
Everything |
(none) |
|
A specific project or solution |
positional path |
|
One test class |
|
|
One method in a class |
|
|
Several classes/methods |
|
|
Classes matching a name pattern |
|
|
All classes in a namespace |
|
|
Excluding some classes/methods |
|
|
Tests tagged with a category/trait |
|
|
Excluding a category/trait |
|
|
Trait/category boolean expression |
|
|
Windows desktop: ordinary run |
the selector’s filter AND |
|
Windows desktop: UI tests ( |
|
|
Terminal UI tests ( |
|
|
Which trait/category property name applies depends on the test framework in use (MSTest: TestCategory/
Priority; NUnit: Category; xUnit: whatever key was passed to [Trait("Key","Value")]) — checked against the
test project’s <PackageReference> entries if unsure. A selector matching nothing reports "No test matches the
given testcase filter" and exits successfully having run zero tests, rather than failing the build the way Maven
Surefire does — called out explicitly in the report rather than treated as a pass.
Outputs
-
A plain-text summary in the conversation — never a written file.
-
Total tests run, passed, failed, and skipped, per test project.
-
If everything passed: a brief confirmation, without pasting the full log.
-
If there are failures: the failing test names and the relevant assertion/exception output (falling back to the
.trxlog underTestResults/if console output was truncated) — without unrelated passing-test noise. -
For a Windows-desktop repository: which test projects ran, which were unverified (needs Windows) and why, whether the default UI exclusion applied, and — for
ui— how the lock behaved. -
For
uiruns (desktop and terminal): the screenshot directory and whether it was cleared (full run) or kept (scoped run); screenshot count per kind and per<kind>/<Id>; malformed capture names; the.ui-quality.ymlaccessibility level applied (or "missing — defaults"); accessibility violations as count + rule ids per context; and "captures unverified (needs Windows)" whenever the desktop stage could not run. -
No source or test code is ever modified.
Execution flow
Dependencies
Invokes
None — iru-dotnet-test is a leaf skill; it only runs dotnet test and reports on its output, it does not call any
other skill in this catalog.
Invoked by
-
.NET Code One Task Group — Step 3, once per task group’s bucket, via the
iru-gate-runneragent, to run the scoped tests for every type the bucket affected (falling back todotnet test --filter "FullyQualifiedName~<TestClass>"directly if this skill is unavailable), plus a full-suite run (this skill with no selector, so UI tests are excluded and non-runnable projects skipped). -
Windows Code One Task Group — the scoped and full runs for Windows desktop app buckets, plus the
uiselector on Windows (withlock: heldwhen it already owns the lock), viairu-gate-runner. -
.NET Generate All Tests — Step 7, once, to confirm the full suite still passes after every class’s tests have been written or extended; and Step 7b, with the
uiselector, to run the newly generated UI tests; also delegated throughiru-gate-runner.
Related agents
-
iru-gate-runner—iru-dotnet-code-one-task-group(see .NET Code One Task Group) always invokes this skill from inside airu-gate-runnersub-agent it spawns, not inline.
Source
SKILL.md on GitHub — the file this page was generated from.