Skip to content
Talk to our solutions team

Outputs & Reports

What each runner emits and how to consume it in CI and locally.

By default no files are written: results stream to the console and the exit code is 0 (all passed) / 1 (any failure). Two opt-in artifacts:

Standard JUnit XML for CI ingestion (GitLab/GitHub test reports, Jenkins):

Terminal window
kis test -t tests/ --junit .test/junit.xml

Full structured results for querying and cross-run analysis:

Terminal window
kis test -t tests/ --db .test/results.db

Tables:

TableContents
runsone row per run: status, run_type, totals (total_tests, passed_tests, failed_tests, skipped_tests, errored_tests), duration_ms
suite_runsper-suite rollups, parent-linked (parent_suite_id)
test_runsper-test results
step_runsper-step results
assertion_resultsper-assertion: expression, passed, field, operator, expected, actual
http_exchangeswire evidence per HTTP step: dns_ms, connect_ms, tls_ms, ttfb_ms, transfer_ms, total_ms, request_size, response_size, redirects
captured_variablesvariables extracted during the run

Query with the DuckDB CLI:

Terminal window
duckdb .test/results.db "SELECT s.step_name, avg(x.total_ms) AS avg_ms, avg(x.ttfb_ms) AS avg_ttfb
FROM step_runs s JOIN http_exchanges x ON x.step_run_id = s.id
GROUP BY 1 ORDER BY 2 DESC"

http_exchanges also stores full request/response headers (JSON) and bodies per step, so a failing run can be forensically replayed from the DB alone.

Notes:

  • DuckDB is single-writer — don’t point two concurrent runs at the same file.
  • Load-test metrics tables are planned but not present yet; --db covers functional runs.
  • redirects is currently always 0.

Colored per-test/per-step streaming output; --no-color disables ANSI (auto-disabled when stdout isn’t a TTY). Diagnostics (env discovery, db/junit paths) go to stderr, results to stdout.

  • Log file: <prefix>-<RFC3339Nano timestamp>.log in the working directory (--prefix, default test), mirrored to stdout. -s/--logresponses includes response bodies; -n/--loglinenumbers adds line numbers.
  • Summary table after the run with canonical columns TEST PLAN / TEST SCENARIO / TEST CASE / TEST STEP / STATUS / DURATION (✅ pass / ❌ fail). Data-driven rows get -RC<n> suffixes when there are ≥ 2 records.
  • Load mode adds a status line every 100 ms and per-phase summary tables — see Load testing.
  • Exit code 1 on any failure.

Legacy writers (test.svc load, legacy plan runner)

Section titled “Legacy writers (test.svc load, legacy plan runner)”

The v1 pipeline selects writers by type name: log, table, csv, jsonl, std, distributed. Selection comes from the environment config, not flags:

Env keyDefaultMeaning
<env>.logtypelogwriter for the execution log
<env>.tabletypetablewriter for the results table (also writes a .csv)
<env>.outputfile-name prefix (directory + prefix)
<env>.logbodyinclude response bodies

File naming: functional …test-<plan>-<timestamp>.log / .csv; load …test-load-<timestamp>.log plus <prefix>_summary.txt.

Known quirks:

  • --output/-o on the legacy commands is accepted but unused — the prefix comes from <env>.output.
  • In the legacy test.svc load pipeline <prefix>_summary.txt is currently created but left empty (the table writer call is disabled); the tests-mode load pipeline does render its phase tables.
  • The distributed writer streams results to the orchestrator instead of local files — see Server modes.