Repository navigation
Releases: MSeys/ProtoTest
Release list
ProtoTest 1.1.9
[1.1.9] - 2026-10-10
ProtoTest 1.1.9 records a cancelled MSTest test as cancelled, as the other runners do, and checks every runner's outcomes against a real run of that runner.
Fixes
- MSTest: Record a test whose body was cancelled as cancelled, not failed: the adapter now classifies the exception the test method threw instead of MSTest's wrapper around it. MSTest
ProtoTest 1.1.8
[1.1.8] - 2026-10-10
ProtoTest 1.1.8 makes a cleanup failure fail the test even when its body was skipped or its outcome was unknown. The runner and trace agree, and cleanup still attempts every registered resource.
Fixes
- Core: Fail cleanup after a runtime skip or an unknown body outcome. The message names the original body state and the cleanup error;
CleanupFailures = Reportkeeps the original outcome. Lifecycle - Runners: Preserve the skipped or unknown body explanation in xUnit v3 cleanup failures. Document the TUnit body-scope boundary for native hooks and the final runner verdict. TUnit
ProtoTest 1.1.7
[1.1.7] - 2026-10-09
ProtoTest 1.1.7 fails a test whose cleanup fails, reports a missing xUnit collection fixture as a failed test instead of a green run, and makes releasing a test's resources and clients exact: a failed release is no longer hidden, disposal waits for a release in flight, and a client is disposed once.
Breaking changes
Core
- a test whose body passed but whose cleanup failed (a teardown hook, a resource release, a client's disposal) is reported as failed, with a message that says the body passed and names the first cleanup failure. A test whose body failed keeps that failure first, with the cleanup failures after it. Every cleanup step is still attempted and recorded as a Teardown finding.
ProtoTest:CleanupFailuresset toReport(orbuilder.ConfigureCleanup(...)) keeps the previous behaviour: findings only, the test passes and its trace reads Partial. Lifecycle
Fixes
Runners and analyzers
- xUnit v2: a missing collection fixture fails each ProtoTest test with a message that names
ProtoTestAssembly, and the rest of the run reports, where the runner crashed before anddotnet testcould end green with the test missing. xUnit v2
Core
- stopping the host while it starts waits for the start, then stops it and runs the after-run hooks once; a start that was stopped from outside throws instead of reporting success, and stopping the host from inside its own start throws instead of hanging. Lifecycle
ReleaseResourceAsyncthrows the release's own exception when the release fails, after recording it, where it returnedtruebefore; the test's cleanup outcome includes it. Execution context- disposing a test context waits for a release that is still running before it closes the test's services, and a second dispose waits for the first. A release callback that disposes its own context, or releases its own resource, throws instead of hanging. Execution context
- one client instance registered under several names or types is disposed once and traced as one client; registering the same instance under the same name again does nothing, and registering it with another ownership (
ContextandCaller) throws. Clients
ProtoTest 1.1.6
[1.1.6] - 2026-10-04
ProtoTest 1.1.6 opens a pull request's trace artifact in the viewer as downloaded, and names every coverage category on the pull request comment's summary card.
Features
Agent workflows
- the pull request comment points to ProtoTrace beside the trace link, and the viewer opens the downloaded trace artifact as it is, without unpacking it, for a private repository too: the file is read in the browser.
PROTOTEST_FEEDBACK_VIEWER_URLnames another viewer oroffleaves the pointer out. ProtoTrace
Fixes
Agent workflows
- the summary card names each coverage row by its category, as the report does, so OpenAPI properties, GraphQL schema fields and arguments and a suite's own categories no longer read as "Other coverage". The card URL carries the category name and the counts, never a target, endpoint or test. Continuous integration
ProtoTest 1.1.5
[1.1.5] - 2026-10-03
ProtoTest 1.1.5 reads an API description or a GraphQL schema from the application it tests, in process too, and keeps nested coverage units apart when it compares two runs.
Features
Core
IProtoRunHook.AfterInfrastructureAsyncruns once every infrastructure piece started and before the first test. ItsProtoRunSetupContextnow carries the run'sServicesandApplicationClientAsync(name): a client for an application at its configured or published address, or on its in-process server, released when the phase ends. A collector that is a run hook takes part. Hooks
OpenAPI
- a specification source that is a path the application serves (
/openapi/v1.json), with noBaseUrlto resolve it against, loads from the application before the first test, so an in-process application documents its own coverage without a committed copy. OpenAPI
GraphQL
WithSchemaCoverage("/graphql?sdl")loads the schema the application serves before the first test, in process too. Schema coverage
ASP.NET Core
- the in-process server serves the run before its first test: a per-run server starts then and the tests reuse it, a per-test lifetime starts a server only for that read. Hooks
Fixes
Agent workflows
- run verification names a nested coverage unit by its path under its parents (
GET /orders › 200 › $.id), so a response or a property that regressed under one endpoint is no longer hidden by the same name under another. The pull request comment,get_coverageandget_suite_mapprint the same path, and a coverage suggestion carries it asPath. Verification
ProtoTest 1.1.4
[1.1.4] - 2026-10-03
ProtoTest 1.1.4 makes what a coding agent reads from the MCP server about a quarter smaller, and fixes the viewer's capability list.
Fixes
Agent workflows
- the MCP tools return paths relative to the folder they read, leave quotes and symbols unescaped, drop attributes that repeat an operation's source location, and
get_failureno longer repeats the selected failure infailedOperations: on a template project's failure the four tools an agent calls first return 28% less text. Setup
Viewer
- a capability composed for several hosts, such as a test clock per application, reads once with a count, and its instances show in the chip's title. ProtoTrace
- a run's resources read per kind (applications, databases, messaging, fakes, workers, readiness, setup) as short names, and a fake recorded as a server and as a WireMock resource shows once. ProtoTrace
ProtoTest 1.1.3
[1.1.3] - 2026-10-03
ProtoTest 1.1.3 fixes the summary card of the pull request comment in GitHub's dark mode.
Fixes
Agent workflows
- the dark summary card keeps every coverage row: the card's address no longer carries a comma, which GitHub reads as the end of the dark image's address and so dropped every row after the first. CI
ProtoTest 1.1.2
[1.1.2] - 2026-10-03
ProtoTest 1.1.2 rewrites the pull request comment around what a reviewer reads first: what the change broke,
where, and the coverage it moved, with a summary card on top and the full record folded underneath.
Features
Agent workflows
- The pull request comment leads with what changed: a summary card, one headline, a table of the failing tests with the first mismatch and a linked source line, a caution when failures share a cause, a coverage table against the base branch, and the full record per test folded under Failure details. A skipped test is no longer listed. CI
ProtoFeedbackComment.Body(digest, target)renders the comment the post sends;ProtoFeedbackTarget.SummaryCardUrlandSourceBaseUrladd the card and the source links. The CLI sets both, andPROTOTEST_FEEDBACK_CARD_URL=offleaves the card out. CLI
ProtoTest 1.1.1
[1.1.1] - 2026-10-02
ProtoTest 1.1.1 fixes ProtoTest.OpenApi, which in 1.1.0 replaced the OpenAPI library of the application a
suite hosts in-process. Its one breaking change is the exception to the additive 1.x surface: a constructor
that exposed Microsoft.OpenApi's own type, the dependency that caused the failure.
Fixes
OpenAPI
- an application that documents itself with Swashbuckle, NSwag or
Microsoft.AspNetCore.OpenApikeeps running next to OpenAPI coverage: the package reads the document itself instead of depending onMicrosoft.OpenApi. OpenAPI
Breaking changes
OpenAPI
OpenApiCoverageCollector(string, OpenApiDocument)is removed with theMicrosoft.OpenApidependency.- Pass the document's file path, URL or text instead:
new OpenApiCoverageCollector(target, source)(OpenAPI).
- Pass the document's file path, URL or text instead:
ProtoTest 1.1.0
[1.1.0] - 2026-10-02
ProtoTest 1.1 adds the agent evidence layer (the MCP server, diagnosis, verification, feedback and the
CLI, with compare, prove and review judging what a coding agent changed), the devices family (WebSocket, MQTT, TCP and serial), the topology integrations (Aspire, WireMock,
Testcontainers), the extended runner surface, and a rewritten documentation site with the Learn track.
It ships 46 packages: 19 new, listed first below, and ProtoTest.OpenTelemetry removed. The breaking changes are listed at the end.
See Migrating from 1.0 for the renames
and the deprecated surface; the docs cover the rest.
Features
New packages
ProtoTest.Analyzers: compile-time rules for what the framework cannot catch at run time.ProtoTest.Aspire: runs an Aspire AppHost with the suite and publishes its resources as targets.ProtoTest.Cli: theprototestcommand that summarizes, indexes, compares, proves, reviews and verifies traces.ProtoTest.Devices: typed devices, one per test, with every exchange in the trace.ProtoTest.Devices.WebSocketandProtoTest.Devices.WebSocket.AspNetCore: devices over WebSocket, or in-process without a socket.ProtoTest.Devices.MqttandProtoTest.Devices.Mqtt.Testcontainers: devices over MQTT, with a Mosquitto broker for the run.ProtoTest.Devices.TcpandProtoTest.Devices.Serial: devices over TCP and serial lines, with stream framing.ProtoTest.Diagnosis: names a failure's cause from the recorded evidence.ProtoTest.Feedback: posts a run's digest to a pull request, check annotations or a webhook.ProtoTest.Hosting: hosts background workers in the test process.ProtoTest.Mcp: an MCP server that lets a coding agent read runs, with the tools and prompts that judge its fixes and tests.ProtoTest.Messaging.MassTransit: uses the application's MassTransit test harness as the broker.ProtoTest.Traces: reads.prototracearchives for the CLI, MCP and tools.ProtoTest.Verification: compares a run with a baseline, by report and by trace.ProtoTest.Web.Pages: the page model and coverage, shared by the web backends and ASP.NET Core.ProtoTest.WireMock: WireMock.Net fakes owned by a test or the run.
Core
- readiness probes replace setup sleeps (
AddReadinessProbe,ProtoReadiness.Tcp/.Http). Infrastructure - one readiness policy (
ProtoTest:Readiness) tunes host probes and containers. Infrastructure - a per-test clock replaces sleeping (
ConfigureClock,Proto.Context.Clock,Advance/SetUtcNow). Time - targets resolve through ordered provider chains; losers record named skip reasons. Environment resolution
- applications, workers and containers declare one chain (
UseConfigured,UseInProcess). Environment resolution [RequiresTestClock]skips tests that need the test clock without a provider that bridges it. Skip conditionsIProtoTargetProvider.ConfigureServicesandResolveAfterare public. Environment resolution- infrastructure with every declared key configured is skipped, unless
AddInfrastructureAlways. Infrastructure- The old
AddInfrastructure(piece, keys)skip rule is deprecated; the provider chain replaces it. Migrating from 1.0
- The old
IProtoConfiguredInfrastructurehands infrastructure the run's settings as it starts. InfrastructureAddRunSetup(name, delegate)adds a run-scoped step after the pieces registered before it. Infrastructure- composite attributes expand recursively where attributes resolve, with cycles throwing the chain. Attributes
ProtoCapabilityDescriptor.Instancenames the instance a capability describes. Skip conditionsAddCapabilityWhenProvided/AddCapabilityUnlessConfiguredgate capabilities on keys. Skip conditions- one application-address precedence: a published address wins over configuration. Environment resolution
Proto.Context.UniqueName("tenant")derives a persistent-store-safe name from the test id. Execution contextProto.Context.Sql()is the primary accessor;Messaging(name)accepts a name. Execution context- typed skip gates (
[RequiresWorker<T>],[RequiresServer],[RequiresApplication]). Skip conditions AddCapabilityReasonstates a skip reason once for the suite, a kind or a name. Skip conditionsProtoHost.HasApplication(name)andHasCapability(kind, name, instance)answer the typed skip gates. Skip conditionsProtoResourceState.Releasingreports a resource while its release callback runs. LifecycleStartTestAsyncaccepts a cancellation token onProtoExecutionContext. Execution contextProtoTest.Jsonhosts the shared JSON read, failure diagnostics and observation capture. ExtendingIProtoConfigurableOptions.FallbackConfigurationSectionNamekeeps an old section working. ConfigurationProtoOptionsRegistration.ConfigureKeyedregisters keyed per-client options. Configuration- the extension points a third-party integration needs are public. Extending
- a bare client name resolves across applications; an ambiguous name names both candidates. Clients
- clients use protocol-scoped names and one registration path per integration. Clients
- one
Shouldassertion surface across protocols; request, message and reply assertions return their subject and chain, while Web element assertions are async. Assertions - shape matching lives under
Should.MatchShape; old spellings stay as shims. Shape matching - exhaustive shape mode (
exact: true) works on every shape surface through one matcher walk. Shape matching - OpenAPI and GraphQL collectors record the specification identity (
spec.source,spec.hash). Coverage ProtoProtocol.CoverageCategoryis optional and falls back to the protocol name. CoverageConfigureTracingcaptures CI facts withRunMetadataandRunMetadataEnvironmentVariables. ProtoTraceProtoApplication.ResolveSettingpublishes the settings-over-configuration precedence. Environment resolutionProtoAttributeOrdernames the setup order bands (Application,SessionDeclaration,Default). Hooks- suites name their own sensitive values (
ConfigureRedaction,ProtoTest:Redaction); state and findings redact them like the defaults. ProtoTrace
Hosting
AddWorkerHost<TProgram>()runs a background worker or generic host in-process with the suite. Hosting
ASP.NET Core
ProtoTestHost.For<TProgram>(builder)composes an in-process application in one line. ASP.NET CoreAddAspNetCoreServersteps aside whenBaseUrlis configured. ASP.NET CoreAddLoopbackApplicationhosts a hand-builtWebApplicationon loopback. ASP.NET Core- per-test service substitution (
Override,[ReplaceService]) builds a dedicated server. ASP.NET Core [SignedInAs]signs a test in;AddTestUserAuthentication()reads it app-side. AuthenticationProtoTestContextPropagationapplies the trace context and test id to raw requests. ASP.NET Core
REST and HTTP
- read one value by JSON path (
ReadAsJson<T>("$.id")), with the protocol's failure evidence. Responses ReadRequired<T>returnsTand fails naming the subject or path when the body is empty or null. [Responses...