AnyUnit.TestingPlatform 1.2.2

dotnet add package AnyUnit.TestingPlatform --version 1.2.2
                    
NuGet\Install-Package AnyUnit.TestingPlatform -Version 1.2.2
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="AnyUnit.TestingPlatform" Version="1.2.2" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="AnyUnit.TestingPlatform" Version="1.2.2" />
                    
Directory.Packages.props
<PackageReference Include="AnyUnit.TestingPlatform" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add AnyUnit.TestingPlatform --version 1.2.2
                    
#r "nuget: AnyUnit.TestingPlatform, 1.2.2"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package AnyUnit.TestingPlatform@1.2.2
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=AnyUnit.TestingPlatform&version=1.2.2
                    
Install as a Cake Addin
#tool nuget:?package=AnyUnit.TestingPlatform&version=1.2.2
                    
Install as a Cake Tool

AnyUnit.TestingPlatform

Microsoft.Testing.Platform (MTP) adapter for AnyUnit - the same dotnet test/dotnet run-compatible entry point real NUnit/xUnit's own MTP mode gives you (EnableNUnitRunner/EnableMSTestRunner), for an AnyUnit test project - C# or F# alike.

Usage

<PropertyGroup>
  <OutputType>Exe</OutputType>
  <EnableAnyUnitRunner>true</EnableAnyUnitRunner>
</PropertyGroup>

<ItemGroup>
  <PackageReference Include="AnyUnit.TestingPlatform" Version="*" />
</ItemGroup>

That's it - a real entry point is generated for you, via Microsoft. Testing.Platform.MSBuild's own official generator, and the project becomes directly runnable: dotnet run, or dotnet test if it's included in your solution. This works the same way for an .fsproj as a .csproj - the generator genuinely emits real F# source there, not just C#, so there's no F#-specific setup needed.

OutputType is set by the project, not by the package, for the same reason MSTest's EnableMSTestRunner asks the same of you: the package does set it as a fallback, but from its .targets, which is after the SDK has already decided the output's extension - fine for a .NET 10 build (which is a .dll either way), but a net48 build would come out as Tests.dll instead of Tests.exe. Found by a real consumer adding a net48 target.

By default the generated entry point tests the project's own entry assembly - the normal case, when EnableAnyUnitRunner is set directly on the project that is the test assembly. A satellite runner project that only ProjectReferences the real test assembly instead lists it explicitly, by simple assembly name:

<ItemGroup>
  <AnyUnitTestAssembly Include="MyRealTestAssembly" />
</ItemGroup>

If you'd rather not have a dotnet test/MTP-integrated entry point at all, see AnyUnit.Runner.Bootstrap instead - a plain console Runner.Run(platform), its own simpler output format, no MTP package dependency.

AnyUnit's own results.json (--report-anyunit-json)

dotnet run -- --report-anyunit-json
dotnet run -- --report-anyunit-json results.json

Writes the same results.json the console runners produce with -o - the same schema, from the same serializer, so anything that reads one reads the other. That includes anyunit-report, which converts it to JUnit/TRX/NUnit/ xUnit/CTRF/HTML/Markdown, and merges several runs' files into one.

Unlike --report-trx, this needs no extra package - it's built into AnyUnit.TestingPlatform itself, since it's AnyUnit's own format rather than a general MTP one.

The path is optional. Given one, it's used as-is (relative to the current directory, like any other -o); given none, a timestamped file is written under --results-directory, the way --report-trx behaves. A discovery-only run (--list-tests) writes nothing at all: it produces no results, and an empty results file is something AnyUnit's own tooling treats as a failure rather than as "nothing ran".

Telling runs apart (--platform-suffix)

dotnet run -- --report-anyunit-json --platform-suffix nightly

The platform id an MTP run reports is the auto-detected one (net10-osx-arm64), the same as the console runners report. --platform-suffix appends a label to it (net10-osx-arm64-nightly) - the same thing anyunit-runner run -p does - for when two runs of the same assembly on the same OS/arch/framework are genuinely different things and should not merge into one column of a combined report. (Before 1.2.1 an MTP run always reported -mtp on the end; if you were relying on that, pass --platform-suffix mtp.)

browser-wasm, without a browser

EnableAnyUnitRunner works in a browser-wasm project too (an Sdk.BlazorWebAssembly project with a plain console Main - see WhoTestsTheTesters/Tests/BasicTests.Wasm.Mtp). dotnet.js boots such a build directly under node or bun, and Microsoft.Testing.Platform's pipeline runs unmodified on Mono-wasm there. One difference from a desktop run: a results file lands in Emscripten's in-memory filesystem, so the JS harness copies it out afterwards - that project's wwwroot/runtests.mjs is the whole recipe, a dozen lines. Known rough edges: --list-tests prints the summary rather than the names, and an error path that prints usage (an unknown option, say) crashes looking up the process's own path.

F# on wasm: one extra line in the harness. An .fsproj cannot host the entry point Microsoft.Testing.Platform.MSBuild generates on wasm: the F# template ends in Async.RunSynchronously, which on the single-threaded runtime blocks the only thread the first time MTP suspends (banner, then nothing, forever), and F# has no async Main the runtime could await instead. So for an F# project targeting browser-wasm the targets skip that entry point, keep the project a library, and the entry point comes from AnyUnit.TestingPlatform.WasmEntry

  • a tiny C# assembly shipped in this package - which the harness names as the main assembly:
const instance = await dotnet
    .withMainAssembly('AnyUnit.TestingPlatform.WasmEntry')
    .withApplicationArguments(...args)
    .create();

Nothing else changes: EnableAnyUnitRunner=true, the same --report-anyunit-json, the same copy-out of the results file. The line is harmless on a C# project too. WhoTestsTheTesters/Tests/Style/ FsUnitTests.Wasm.Mtp is the in-repo example and CI runs it.

Other MTP extensions (TRX, and anything else)

EnableAnyUnitRunner registers AnyUnit.TestingPlatform as a TestingPlatformBuilderHook - the same generic extensibility point every other MTP extension package uses - so any of them just work by adding their own PackageReference, with no AnyUnit-specific glue needed. For TRX output specifically:

<ItemGroup>
  <PackageReference Include="Microsoft.Testing.Extensions.TrxReport" Version="*" />
</ItemGroup>
dotnet run -- --report-trx

Same idea for Microsoft.Testing.Extensions.Retry, Microsoft.Testing.Extensions.CrashDump, or any future MTP extension - AnyUnit.TestingPlatform itself doesn't need to know about any of them individually.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.2.2 980 9/16/2026
1.2.1 82 9/16/2026
1.2.0 128 9/16/2026
1.2.0-alpha.0.6 43 9/14/2026
1.1.0 77 9/14/2026
1.0.0 77 9/12/2026