blob: b3abe9373f80de08e31eecfbb82c7c58f698d9c5 [file] [log] [blame] [view]
# Go test events
Running tests with the `-json` flag or passing test output through `go tool
test2json1` will produce a stream of JSON events. Each event specifies an
action, such as `run`, `pass`, `output`, etc. An event *may* specify what test
it belongs to. The VSCode Go test controller must capture these events in order
to notify VSCode of test output and lifecycle events.
## Tests
Processing test events generated by `TestXxx(*testing.T)` functions is easy.
Events with an empty `Test` field can be ignored, and all other events have a
meaningful `Action` field. Output is recorded, and run/pass/fail/skip events are
converted to VSCode test API events.
[go#37555](https://github.com/golang/go/issues/37555) did require special
handling, but that only appeared in Go 1.14 and was backported to 1.14.1.
## Benchmarks
Test events generated by `BenchmarkXxx(*testing.B)` functions require
significantly more processing. If a benchmark fails or is skipped, the `Test`
and `Action` fields are populated appropriately. Otherwise, `Test` is empty and
`Action` is always `output`. Thus, nominal lifecycle events (run/pass) must be
deduced purely from test output. When a benchmark begins, an output such as
`BenchmarkFooBar\n` is produced. When a benchmark completes, an output such as
`BencmarkFooBar-4 123456 123.4 ns/op 123 B/op 12 allocs/op` is produced. No
explicit `run` or `pass` events are generated. Thus:
- When `BenchmarkFooBar\n` is seen, the benchmark will be marked as running
- When an explicit fail/skip is seen, the benchmark will be marked as failed/skipped
- When benchmark results are seen, the benchmark will be marked as passed
Thus, a benchmark that does not produce results (and does not fail or skip) will
never produce an event indicating that it has completed. Benchmarks that call
`(*testing.B).Run` will not produce results. In practice, this means that any
incomplete benchmarks must be explicitly marked as passed once `go test`
returns.