Excalibur.Testing.Conformance
10.0.0-alpha.9
dotnet add package Excalibur.Testing.Conformance --version 10.0.0-alpha.9
NuGet\Install-Package Excalibur.Testing.Conformance -Version 10.0.0-alpha.9
<PackageReference Include="Excalibur.Testing.Conformance" Version="10.0.0-alpha.9" />
<PackageVersion Include="Excalibur.Testing.Conformance" Version="10.0.0-alpha.9" />
<PackageReference Include="Excalibur.Testing.Conformance" />
paket add Excalibur.Testing.Conformance --version 10.0.0-alpha.9
#r "nuget: Excalibur.Testing.Conformance, 10.0.0-alpha.9"
#:package Excalibur.Testing.Conformance@10.0.0-alpha.9
#addin nuget:?package=Excalibur.Testing.Conformance&version=10.0.0-alpha.9&prerelease
#tool nuget:?package=Excalibur.Testing.Conformance&version=10.0.0-alpha.9&prerelease
Excalibur.Testing.Conformance
Conformance test kits for Excalibur infrastructure implementations. Provides reusable abstract test suites that verify provider implementations conform to the expected contracts for IEventStore, ISnapshotStore, IOutboxStore, ISagaStore, and other infrastructure interfaces.
Installation
dotnet add package Excalibur.Testing.Conformance
Purpose
When implementing a custom provider (e.g., a new database backend for event sourcing), use these conformance test kits to verify your implementation meets all contract requirements. Each test kit provides a comprehensive set of tests covering happy paths, edge cases, and error handling.
Available Test Kits
42 kits ship in this package. The most commonly implemented:
| Test Kit | Interface Under Test |
|---|---|
EventStoreConformanceTestKit |
IEventStore |
SnapshotStoreConformanceTestKit |
ISnapshotStore |
OutboxStoreConformanceTestKit |
IOutboxStore |
InboxStoreConformanceTestKit |
IInboxStore |
SagaStoreConformanceTestKit |
ISagaStore |
DeadLetterStoreConformanceTestKit |
IDeadLetterStore |
LeaderElectionConformanceTestKit |
ILeaderElection |
EncryptionProviderConformanceTestKit |
IEncryptionProvider |
AuditStoreConformanceTestKit |
IAuditStore |
TransportConformanceTestKit<TSender, TReceiver> |
transport sender/receiver pairs |
DbConformanceTestKit |
IDb |
PersistenceProviderConformanceTestKit |
persistence providers |
Also included, covering scheduling, CDC, claim-check, caching, deduplication, retry, workflow, key management, and compliance surfaces:
CacheTagTrackerConformanceTestKit, CdcProviderConformanceTestKit,
ClaimCheckProviderConformanceTestKit, ComplianceAlertHandlerConformanceTestKit,
ComplianceMetricsConformanceTestKit, ControlValidationServiceConformanceTestKit,
ControlValidatorConformanceTestKit, CronJobStoreConformanceTestKit,
DataInventoryStoreConformanceTestKit, DeduplicatorConformanceTestKit,
EncryptionMigrationServiceConformanceTestKit, EncryptionProviderRegistryConformanceTestKit,
EncryptionTelemetryConformanceTestKit, ErasureStoreConformanceTestKit,
FipsDetectorConformanceTestKit, KeyCacheConformanceTestKit,
KeyEscrowServiceConformanceTestKit, KeyManagementProviderConformanceTestKit,
KeyRotationAlertHandlerConformanceTestKit, KeyRotationSchedulerConformanceTestKit,
LegalHoldStoreConformanceTestKit, MasterKeyBackupServiceConformanceTestKit,
MinimalWiringConformanceTestKit<TBuilderExtension>, RetryPolicyConformanceTestKit,
ScheduleStoreConformanceTestKit, SchedulerConformanceTestKit,
Soc2ReportGeneratorConformanceTestKit, Soc2ReportStoreConformanceTestKit,
StreamingHandlerConformanceTestKit, WorkflowConformanceTestKit.
Quick Start
Derive from the kit for the interface you implement and register your provider using its own public registration extension. The kit resolves the service under test from a real container built from those registrations, so every assertion runs against the object a consumer actually gets.
public class MyCustomEventStoreConformanceTests : EventStoreConformanceTestKit
{
private readonly MyProviderFixture _fixture;
// The only member you must implement. Call your shipped registration extension and nothing else.
protected override void ConfigureProvider(IServiceCollection services) =>
services.AddExcalibur(x => x.AddEventSourcing(es => es.UseMyProvider(_fixture.ConnectionString)));
// Optional: override to reset state between test runs.
protected override async Task CleanupAsync() => await _fixture.CleanupAsync();
}
The kit never accepts an already-constructed store. Registering the store by hand inside
ConfigureProvider defeats the point: it would certify an instance the test author assembled rather than
the one your registration produces.
What a green run covered
Some arms exercise an optional capability of the contract — an outbox or dead-letter store's administrative facet, for example. An arm whose capability is unavailable used to return early, which every test runner reports exactly as it reports an arm that ran and passed.
ConformanceArmLedger now records both: Executed lists the arms that ran their bodies, Skipped lists
those that did not with the capability and reason, and Describe() formats both. It is process-wide and
additive, so call Reset() before a run you intend to read.
ConformanceArmLedger.Reset();
// ... run your derived kit ...
Console.WriteLine(ConformanceArmLedger.Describe());
A run that was green before may now report skips. That is not a regression: the coverage is unchanged and
the reporting no longer overstates it. The ledger records; you decide what an unverified arm means. Override
ConformanceTestKit.OnArmSkipped to surface skips in your runner (Assert.Skip on xUnit v3, Assert.Ignore
on NUnit) or to throw, which certifies that every capability your component provides was reached.
If your store is decorated: the outbox kit discovers capabilities through GetService(Type), which a
decorator forwards. IDeadLetterStore exposes no such method, so its kit resolves the admin facet from the
store's own type — sound for a store handed to the kit directly, unsound for a wrapped one. Override
DeadLetterStoreConformanceTestKit.ResolveAdminFacet to return the facet the wrapper holds; otherwise those
arms report as skips.
Which testing kit do I reach for?
This package answers one question: "Does my custom provider implementation obey the framework
contract?" — use a conformance kit when you write a new backend for an infrastructure interface
(a new IEventStore, IOutboxStore, ISagaStore, ILeaderElection, and so on) and want to prove
it satisfies every contract requirement.
It is not a resilience/fault-injection kit. To prove your handlers and sagas stay idempotent and eventually consistent under adverse transport conditions — duplicate delivery, message reordering, broker disconnects, consumer crash-and-restart, slow consumers — use the chaos / fault-injection test kit instead. The two kits share the same underlying test infrastructure and container fixtures, so there is no duplicated surface: conformance verifies a provider matches a contract; chaos verifies business logic survives faults.
Documentation
Detailed guides live in the Excalibur repository. Each kit's XML documentation describes the members it requires and the contract each arm asserts.
License
This package is part of the Excalibur framework. The full licence text ships inside the package and is shown on the package listing's License tab.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. 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. |
-
net10.0
- Ben.Demystifier (>= 0.4.1)
- CloudNative.CloudEvents (>= 2.8.0)
- CloudNative.CloudEvents.SystemTextJson (>= 2.8.0)
- Cronos (>= 0.12.0)
- Dapper (>= 2.1.72)
- Excalibur.Compliance (>= 10.0.0-alpha.9)
- Excalibur.Compliance.Abstractions (>= 10.0.0-alpha.9)
- Excalibur.Dispatch (>= 10.0.0-alpha.9)
- Excalibur.Dispatch.Abstractions (>= 10.0.0-alpha.9)
- Excalibur.Dispatch.Caching (>= 10.0.0-alpha.9)
- Excalibur.Dispatch.LeaderElection.Abstractions (>= 10.0.0-alpha.9)
- Excalibur.Dispatch.Patterns (>= 10.0.0-alpha.9)
- Excalibur.Dispatch.Transport.Abstractions (>= 10.0.0-alpha.9)
- Excalibur.Domain (>= 10.0.0-alpha.9)
- Excalibur.EventSourcing (>= 10.0.0-alpha.9)
- Excalibur.EventSourcing.Abstractions (>= 10.0.0-alpha.9)
- Excalibur.Jobs.Abstractions (>= 10.0.0-alpha.9)
- Excalibur.Saga (>= 10.0.0-alpha.9)
- Excalibur.Testing (>= 10.0.0-alpha.9)
- Excalibur.Workflows (>= 10.0.0-alpha.9)
- Excalibur.Workflows.Abstractions (>= 10.0.0-alpha.9)
- FluentValidation (>= 12.1.1)
- FluentValidation.DependencyInjectionExtensions (>= 12.1.1)
- IdentityModel (>= 7.0.0)
- JsonNet.ContractResolvers (>= 2.0.0)
- Medo.Uuid7 (>= 3.2.0)
- MemoryPack (>= 1.21.4)
- Microsoft.ApplicationInsights (>= 3.1.0)
- Microsoft.Extensions.Caching.Abstractions (>= 10.0.10)
- Microsoft.Extensions.Caching.Hybrid (>= 10.5.0)
- Microsoft.Extensions.Caching.Memory (>= 10.0.10)
- Microsoft.Extensions.Caching.StackExchangeRedis (>= 10.0.10)
- Microsoft.Extensions.Configuration (>= 10.0.10)
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.10)
- Microsoft.Extensions.Configuration.Binder (>= 10.0.10)
- Microsoft.Extensions.Configuration.CommandLine (>= 10.0.10)
- Microsoft.Extensions.Configuration.EnvironmentVariables (>= 10.0.10)
- Microsoft.Extensions.Configuration.Json (>= 10.0.10)
- Microsoft.Extensions.DependencyInjection (>= 10.0.10)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10)
- Microsoft.Extensions.Diagnostics.HealthChecks (>= 10.0.10)
- Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions (>= 10.0.10)
- Microsoft.Extensions.Hosting (>= 10.0.10)
- Microsoft.Extensions.Hosting.Abstractions (>= 10.0.10)
- Microsoft.Extensions.Http (>= 10.0.10)
- Microsoft.Extensions.Logging (>= 10.0.10)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.10)
- Microsoft.Extensions.Logging.Console (>= 10.0.10)
- Microsoft.Extensions.ObjectPool (>= 10.0.10)
- Microsoft.Extensions.Options (>= 10.0.10)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.10)
- Microsoft.Extensions.Options.DataAnnotations (>= 10.0.10)
- Microsoft.IdentityModel.Tokens (>= 8.17.0)
- NCrontab (>= 3.4.0)
- OpenTelemetry (>= 1.15.3)
- OpenTelemetry.Api (>= 1.15.3)
- OpenTelemetry.Extensions.Hosting (>= 1.15.3)
- Polly (>= 8.6.6)
- StackExchange.Redis (>= 2.12.14)
- System.IdentityModel.Tokens.Jwt (>= 8.17.0)
- System.IO.Hashing (>= 10.0.7)
- System.Threading.RateLimiting (>= 10.0.7)
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 |
|---|---|---|
| 10.0.0-alpha.9 | 48 | 8/31/2026 |
| 10.0.0-alpha.8 | 62 | 8/14/2026 |
| 10.0.0-alpha.7 | 56 | 8/13/2026 |
| 10.0.0-alpha.6 | 59 | 8/11/2026 |
| 10.0.0-alpha.5 | 55 | 8/10/2026 |
| 3.0.0-alpha.216 | 92 | 6/30/2026 |
| 3.0.0-alpha.215 | 78 | 6/23/2026 |
| 3.0.0-alpha.214 | 75 | 6/23/2026 |
| 3.0.0-alpha.208 | 80 | 6/11/2026 |
| 3.0.0-alpha.207 | 70 | 6/11/2026 |
| 3.0.0-alpha.205 | 69 | 6/10/2026 |
| 3.0.0-alpha.204 | 79 | 6/8/2026 |
| 3.0.0-alpha.203 | 63 | 6/8/2026 |
| 3.0.0-alpha.202 | 69 | 6/8/2026 |
| 3.0.0-alpha.201 | 70 | 6/8/2026 |
| 3.0.0-alpha.199 | 64 | 6/8/2026 |
| 3.0.0-alpha.198 | 79 | 5/28/2026 |
| 3.0.0-alpha.197 | 76 | 5/28/2026 |
| 3.0.0-alpha.194 | 71 | 5/20/2026 |
| 3.0.0-alpha.193 | 81 | 5/13/2026 |
Release notes and versioning policy: https://docs.excalibur-dispatch.dev/docs/migration/version-upgrades