Skip to content

Releases: MSeys/ProtoTest

ProtoTest 1.1.9

Choose a tag to compare

@github-actions github-actions released this 10 Oct 11:14

[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

Choose a tag to compare

@github-actions github-actions released this 10 Oct 09:59

[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 = Report keeps 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

Choose a tag to compare

@github-actions github-actions released this 09 Oct 22:01

[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:CleanupFailures set to Report (or builder.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 and dotnet test could 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
  • ReleaseResourceAsync throws the release's own exception when the release fails, after recording it, where it returned true before; 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 (Context and Caller) throws. Clients

ProtoTest 1.1.6

Choose a tag to compare

@github-actions github-actions released this 04 Oct 04:36

[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_URL names another viewer or off leaves 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

Choose a tag to compare

@github-actions github-actions released this 03 Oct 21:35

[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.AfterInfrastructureAsync runs once every infrastructure piece started and before the first test. Its ProtoRunSetupContext now carries the run's Services and ApplicationClientAsync(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 no BaseUrl to 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_coverage and get_suite_map print the same path, and a coverage suggestion carries it as Path. Verification

ProtoTest 1.1.4

Choose a tag to compare

@github-actions github-actions released this 03 Oct 16:22

[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_failure no longer repeats the selected failure in failedOperations: 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

Choose a tag to compare

@github-actions github-actions released this 03 Oct 15:07

[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

Choose a tag to compare

@github-actions github-actions released this 03 Oct 12:27

[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.SummaryCardUrl and SourceBaseUrl add the card and the source links. The CLI sets both, and PROTOTEST_FEEDBACK_CARD_URL=off leaves the card out. CLI

ProtoTest 1.1.1

Choose a tag to compare

@github-actions github-actions released this 02 Oct 19:45

[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.OpenApi keeps running next to OpenAPI coverage: the package reads the document itself instead of depending on Microsoft.OpenApi. OpenAPI

Breaking changes

OpenAPI

  • OpenApiCoverageCollector(string, OpenApiDocument) is removed with the Microsoft.OpenApi dependency.
    • Pass the document's file path, URL or text instead: new OpenApiCoverageCollector(target, source) (OpenAPI).

ProtoTest 1.1.0

Choose a tag to compare

@github-actions github-actions released this 02 Oct 17:24

[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: the prototest command that summarizes, indexes, compares, proves, reviews and verifies traces.
  • ProtoTest.Devices: typed devices, one per test, with every exchange in the trace.
  • ProtoTest.Devices.WebSocket and ProtoTest.Devices.WebSocket.AspNetCore: devices over WebSocket, or in-process without a socket.
  • ProtoTest.Devices.Mqtt and ProtoTest.Devices.Mqtt.Testcontainers: devices over MQTT, with a Mosquitto broker for the run.
  • ProtoTest.Devices.Tcp and ProtoTest.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 .prototrace archives 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 conditions
  • IProtoTargetProvider.ConfigureServices and ResolveAfter are 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
  • IProtoConfiguredInfrastructure hands infrastructure the run's settings as it starts. Infrastructure
  • AddRunSetup(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.Instance names the instance a capability describes. Skip conditions
  • AddCapabilityWhenProvided/AddCapabilityUnlessConfigured gate 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 context
  • Proto.Context.Sql() is the primary accessor; Messaging(name) accepts a name. Execution context
  • typed skip gates ([RequiresWorker<T>], [RequiresServer], [RequiresApplication]). Skip conditions
  • AddCapabilityReason states a skip reason once for the suite, a kind or a name. Skip conditions
  • ProtoHost.HasApplication(name) and HasCapability(kind, name, instance) answer the typed skip gates. Skip conditions
  • ProtoResourceState.Releasing reports a resource while its release callback runs. Lifecycle
  • StartTestAsync accepts a cancellation token on ProtoExecutionContext. Execution context
  • ProtoTest.Json hosts the shared JSON read, failure diagnostics and observation capture. Extending
  • IProtoConfigurableOptions.FallbackConfigurationSectionName keeps an old section working. Configuration
  • ProtoOptionsRegistration.ConfigureKeyed registers 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 Should assertion 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.CoverageCategory is optional and falls back to the protocol name. Coverage
  • ConfigureTracing captures CI facts with RunMetadata and RunMetadataEnvironmentVariables. ProtoTrace
  • ProtoApplication.ResolveSetting publishes the settings-over-configuration precedence. Environment resolution
  • ProtoAttributeOrder names 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 Core
  • AddAspNetCoreServer steps aside when BaseUrl is configured. ASP.NET Core
  • AddLoopbackApplication hosts a hand-built WebApplication on 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. Authentication
  • ProtoTestContextPropagation applies 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> returns T and fails naming the subject or path when the body is empty or null. [Responses...
Read more