Skip to content

Reporting

Every Stove test failure ships with structured execution context. The reporter captures activity from registered systems: HTTP calls, DB ops, Kafka observations, WireMock stubs, and gRPC interactions. When an assertion fails, you get the stack trace plus the sequence of system activity that led to it.

In 30 seconds Add the Kotest or JUnit extension. Failures print a timeline by default (pretty console). Add reporting { } in Stove().with to tune output or use machine-readable JSON. Reporting pairs with Tracing and the Dashboard; it does not require either one.

Setup

dependencies {
  testImplementation("com.trendyol:stove-extensions-kotest")
}

class StoveConfig : AbstractProjectConfig() {
  override val extensions: List<Extension> = listOf(StoveKotestExtension())
  // ...
}
dependencies {
  testImplementation("com.trendyol:stove-extensions-junit")
}

@ExtendWith(StoveJUnitExtension::class)
abstract class BaseE2ETest { /* ... */ }

The extension registers an AfterTestListener that intercepts failures and prints the report.

Configure

Default is on, prints to console, dumps only on failure. Override inside Stove().with { }:

Stove().with {
    reporting {
        ReportingOptions(
            enabled = true,
            dumpOnFailure = true,                       // false = dump every test
            failureRenderer = PrettyConsoleRenderer(),  // or JsonReportRenderer()
        )
    }
    // ... your systems
}.run()

Renderers

PrettyConsoleRenderer (default)

Human-friendly. Color, alignment, system snapshots inline. Built with Mordant.

─── Stove Report ────────────
▶ http    POST /orders   201
▶ kafka   shouldBePublished
        topic=order.created.v1
        timeout=10s   (timed out)
─────────────────────────────

JsonReportRenderer

Machine-readable. Pipe into CI artifacts, MCP, or your own analyzer.

{
  "test": "OrderE2ETest.create",
  "entries": [
    { "kind": "http", "method": "POST",
      "path": "/orders", "status": 201 },
    { "kind": "kafka", "op": "shouldBePublished",
      "topic": "order.created.v1",
      "status": "timeout" }
  ]
}

What gets reported

Surface Captured
HTTP method, path, status, latency, request/response bodies (truncated)
Kafka producer publishes, consumer reads, topic, partition, offset, payload (truncated)
Databases (SQL + NoSQL) queries, bind args, rows affected, durations
WireMock stub matches and misses, request body
gRPC method, request, response, status
System snapshots per-system state at failure time (Kafka topics, WireMock unmatched, etc.)

Snapshots make root-cause analysis faster. A WireMock snapshot, for example, can show that an "unexpected 404" was the app hitting an unmocked path.

Pairs well with

  • Tracing. Reporter plus OTel = call chain inside your app, not just the test view.

  • Dashboard. Same data, browseable in a local web UI; persists across sessions.

  • MCP. Agents fetch the same evidence in token-efficient slices.

  • When a test fails. The full failure flow as a scroll story.

Troubleshooting

Symptom Check
No report on failure Extension registered? StoveKotestExtension() in extensions (Kotest) or @ExtendWith(StoveJUnitExtension::class) (JUnit)
Report missing system entries System registered before the runner block in Stove().with { }
Empty Kafka snapshot Interceptor bean registered? See Kafka pitfalls
JSON empty in CI Use JsonReportRenderer(); pipe System.out to a file or use dashboard JSON export