Skip to main content
Every run writes two report files, whether it was started by plugwrightTest<Env> or by the matrix:

JSON

status is pass, fail or skip. plugin names the plugin a test came from when it was inherited rather than found in your test directory. botUsername is the bot that ran it, when one connected. Every skip carries its reason: excluded by name, wrong environment, a capability the environment doesn’t have, or an earlier test in the same describe.serial block that stopped the chain. A skipped test that doesn’t say why is worse than a failing one, because it reads as coverage. Tests from a serial block appear as ordinary entries, in the order they ran, under their full describe path.

Concurrent tests

A test (or block) run with concurrency still gets one entry, not N. durationMs is the slowest instance, and instances carries every instance’s own outcome:
instances is null for an ordinary, non-concurrent test — botUsername on the row itself is where its bot lives instead. The JUnit report doesn’t carry this breakdown; it only ever sees the one aggregated pass/fail/duration, so read the JSON report when a concurrent test fails.

JUnit XML

The suite name is plugwright.<env>, so a matrix run produces one suite per environment and CI keeps them apart. classname is the spec file, name is the full test name including its describe chain. Failures carry the message as the attribute and the stack as the body. Most CI systems pick these up with a glob:

Matrix summary

An environment that produced no report at all gets an ERROR: line instead of counts:
Failed tests and an unreachable server are different problems, and the summary keeps them apart so you know whether to read the diff or fix the stand.