![]() |
VOOZH | about |
dotnet add package Rig.TUnit.Messaging.Kafka --version 0.1.0-beta.2
NuGet\Install-Package Rig.TUnit.Messaging.Kafka -Version 0.1.0-beta.2
<PackageReference Include="Rig.TUnit.Messaging.Kafka" Version="0.1.0-beta.2" />
<PackageVersion Include="Rig.TUnit.Messaging.Kafka" Version="0.1.0-beta.2" />Directory.Packages.props
<PackageReference Include="Rig.TUnit.Messaging.Kafka" />Project file
paket add Rig.TUnit.Messaging.Kafka --version 0.1.0-beta.2
#r "nuget: Rig.TUnit.Messaging.Kafka, 0.1.0-beta.2"
#:package Rig.TUnit.Messaging.Kafka@0.1.0-beta.2
#addin nuget:?package=Rig.TUnit.Messaging.Kafka&version=0.1.0-beta.2&prereleaseInstall as a Cake Addin
#tool nuget:?package=Rig.TUnit.Messaging.Kafka&version=0.1.0-beta.2&prereleaseInstall as a Cake Tool
Testcontainers-backed Apache Kafka fixture with
KafkaListener/KafkaEventSender, multi-partitionConfluent.Kafkaadmin-driven topology, and partition-orderedOrderingAssert.
The Rig.TUnit Kafka provider. KafkaFixture spins
confluentinc/cp-kafka in single-broker KRaft mode (no separate
Zookeeper since Kafka 3.3). Ships:
KafkaEventSender — sender with a SendContext overload mapping
PartitionKey (or SessionKey as a fallback) to the Kafka
Message.Key. The legacy correlationId → Message.Key conflation
was decoupled in Feature 007 T020.KafkaListener — wraps a Confluent.Kafka consumer; Subscribe
for group-managed assignment or Assign(int partition) to pin a
listener to a specific partition. Pre-creates the topic before
subscribing (so a fast publisher never races a not-yet-existing topic).KafkaTopologyBuilder + IKafkaTopologyBuilder /
IKafkaTopicConfig — multi-partition + custom configs (retention,
cleanup policy) via the Confluent.Kafka.AdminClient. Wired to the
rig via KafkaRigBuilder.WithTopology(…).KafkaFixtureOptions.DefaultPartitions — global default for
topics created by the listener.OrderingAssert.PerKeyMonotonic per key).Confluent.Kafka (transitive)using Rig.TUnit.Messaging.Helpers;
using Rig.TUnit.Messaging.Kafka.Fixtures;
using Rig.TUnit.Messaging.Kafka.Helpers;
await using var fx = new KafkaFixture();
await fx.InitializeAsync();
// Per-key ordered send (hashed to a partition by Confluent.Kafka).
await using var sender = new KafkaEventSender(fx.ConnectionString, topic: "orders");
await using var listener = new KafkaListener(fx.ConnectionString, "orders", groupId: "shipping");
await listener.StartAsync(ct);
await sender.SendAsync(
"{\"orderId\":1}",
context: new SendContext(PartitionKey: "customer-42"),
ct: ct);
Multi-partition topology via the WithTopology rig hook:
services.AddRigTUnit(rig =>
rig.UseKafka(RigConnect.FromValue(fx.ConnectionString), k =>
k.WithTopology(t =>
t.Topic("orders", c => c
.WithPartitions(6)
.WithReplicationFactor(1)
.WithConfig("cleanup.policy", "compact")
.WithConfig("retention.ms", "86400000")))));
| Property | Type | Default | Description |
|---|---|---|---|
Image |
string |
"confluentinc/cp-kafka:7.6.1" |
Broker image |
StartupTimeoutSeconds |
int |
120 |
Kafka boot |
NumPartitions |
int |
3 |
Default topic partition count |
ReplicationFactor |
short |
1 |
Single-broker dev cluster |
DefaultPartitions |
int |
1 |
Per-listener default when no topology declares the topic (range 1–200) |
Rig.TUnit.Messaging.Kafka.Fixtures.KafkaFixtureRig.TUnit.Messaging.Kafka.Options.KafkaFixtureOptions —
DefaultPartitions controls the auto-create count.Rig.TUnit.Messaging.Kafka.Builder.KafkaRigBuilder — ships
WithTopology(Action<IKafkaTopologyBuilder>).Rig.TUnit.Messaging.Kafka.Helpers.KafkaListener — Subscribe or
Assign(int partition) for pinned-partition tests.Rig.TUnit.Messaging.Kafka.Helpers.KafkaEventSender — ships
SendAsync(string, SendContext, …) overload.Rig.TUnit.Messaging.Kafka.Topology.IKafkaTopologyBuilderRig.TUnit.Messaging.Kafka.Topology.IKafkaTopicConfig —
WithPartitions, WithReplicationFactor, WithConfig(key, value).Rig.TUnit.Messaging.Kafka.Topology.KafkaTopologyBuilderPer-test topic orders_{IsolationKey:short}. Teardown deletes the
topic. Consumer groups also carry the IsolationKey suffix so parallel
tests do not join the same rebalance group.
KafkaFixtureOptions.FixedHostPort breaks this.Local: Broker transport failure — consumer started before broker
finished topic creation. KafkaListener.StartAsync retries with
exponential backoff; do not shortcut the wait.IsolationKey.MessageAssert.Within(…)
rather than a fixed delay.See .
OrderingAssert; global ordering across partitions is
explicitly not guaranteed. Use SendContext.PartitionKey so all
messages for a key land in the same partition.SendContext.SessionKey is
supplied without PartitionKey, the sender folds it to the
Message.Key automatically.correlationId no longer doubles as Message.Key — the legacy
conflation in KafkaEventSender was decoupled. Tests that relied on
the old behaviour must pass PartitionKey explicitly.KafkaEventSender.SendTombstoneAsync.auto.offset.reset=earliest is set by default so new consumer groups
see historical messages; switch to latest for replay-free tests.EnsureTopicExistsAsync swallows
CreateTopicsException when every result is TopicAlreadyExists.See ;
baseline in benchmarks/baseline-005.json.
MIT. See .
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
Showing the top 1 NuGet packages that depend on Rig.TUnit.Messaging.Kafka:
| Package | Downloads |
|---|---|
|
Rig.TUnit.All
Meta-package containing every Rig.TUnit.* package. DISCOURAGED — prefer per-feature or per-stack meta-packages (Rig.TUnit, Rig.TUnit.Microservices). |
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.1.0-beta.2 | 72 | 4/27/2026 |
| 0.0.0-alpha.0.14 | 60 | 4/26/2026 |