Repository navigation
Runner Coverage 2026 10 26
A coverage review (2026-10-26) estimated that QASight supported about 23% of test framework usage natively (pytest, Behave/BehaveX, Playwright) and could record about 94% through JUnit XML. A third of that 94% needed an extra reporter package first (jest-junit, a .NET JUnit logger, gotestsum, ...), and JUnit drops what the runner knew: describe blocks, retries, files that failed before any test ran, tags. The aim is for QASight to be the default results history for any test tool, so the common runners should work with the output they already write, with no extra install.
qasight/reporting/junit_import.py stays the one entry for every result file (stage junit_xml globs, qasight ingest, POST /api/v1/ingest). It now recognises a file by its content, not its name, and hands it to that runner's importer. Each importer writes the same Allure result dicts, so nothing after the import changes.
| File | Written by | Importer |
|---|---|---|
JUnit XML (<testsuite> / <testsuites>, and any other XML) |
most runners | junit_import.py |
Playwright JSON (suites list) |
--reporter=json |
playwright_import.py |
Jest / Vitest JSON (testResults list) |
jest --json, vitest --reporter=json
|
jest_import.py |
TRX (<TestRun>) |
dotnet test --logger trx (xUnit, NUnit, MSTest) |
trx_import.py |
go test -json lines (Action / Package events) |
go test -json |
gotest_import.py |
Robot Framework output.xml (<robot>) |
robot |
robot_import.py |
Allure *-result.json
|
any Allure adapter | allure_passthrough.py |
-
Identity. Each importer builds a stable
fullName:file › describe › titlefor Jest/Vitest (paths relative to the repo, or to the report's common folder when made elsewhere),Namespace.Class.Methodfor TRX,package.Test/subtestfor Go, Robot's long name. These are also the names the runners' own "run only this test" options take, which later rerun commands rely on. -
What JUnit lost. A Jest test that passed on retry is flaky; a test file that failed to load is one
brokenresult; TRX data rows are one result each; a failed Go package with no failing test (build error) is onebrokenresult; a Go parent test counts only when it failed on its own, so a failing subtest is not counted twice; Robot tags become Allure tags. Failures outside any test are never dropped (added 2026-10-31): a Jest/Vitest file whose hook threw while its tests passed or skipped, a Playwright spec that fails to load (top-levelerrors), a Go test that never finished, a Go 1.24+ build failure (build-outputevents), a TRX run whose host crashed (RunInfo outcome="Error") and a JUnit suite that claims failures no case carries each become onebrokenresult;qasight ingestfails when every matching file was unreadable. -
Allure folders.
qasight ingest allure-results/(a folder argument stands for its files) copies each result with the attachments it names, from the same folder only. Containers and the folder's settings files are skipped without a warning. -
Server uploads.
POST /api/v1/ingestkeeps a file's safe name and suffix (an Allure result names its attachments by file name) and reads every stored file by content. -
Native JavaScript stages. New equipment
jest,vitest(frameworks/jest_adapter.py) andcypress(frameworks/cypress_adapter.py) run the runner throughnpxand add the report QASight reads, likeplaywrightdoes: Jest's--json --outputFile, Vitest'sjsonreporter (andvitest run, never watch mode), Cypress's built-injunitreporter. Jest and Vitest take--maxWorkersfromworkers; Cypress can't parallelise without its cloud, soworkerswarns there. A stage that sets its own reporter keeps it. -
Rerun commands for more runners.
services/rerun_commands.py(the run page's "Rerun these tests") also uses theframeworklabel each imported result carries, so an ingested file gets its own runner's command: Jest/Vitest (test files plus-t '^(describe path title|...)$'),go test -run '^(TestA|TestB)$' <packages>(top-level tests, which rerun their subtests),dotnet test --filter FullyQualifiedName=...(data rows rerun their method),robot --test <name> <root suite folder>, and for JUnit XML from a JVM buildmvn test -Dtest=Class#m1+m2orgradle test --tests Class.methodwhen the run's target repo has apom.xmlor a Gradle build. The pytest guess for dotted JUnit names now needs atest_*.py/*_test.pyfile, the files pytest collects, so a Java class is no longer offered as a pytest module. Cypress gets none: its JUnit file does not name the spec file. - Unknown files are skipped with a note in the stage log, as malformed JUnit always was. They never fail the stage on their own.
- Jest, Vitest, .NET, Go and Robot suites can be recorded with the output their runner writes by default. JUnit XML keeps working for everything else.
- Detection reads each file once more than before (a sniff, then the parse). Result files are small next to the test run.
-
historyIdstill hashes the stage's tool withfullName, so moving a suite from JUnit XML to its runner's own format starts a new history for its tests (different names). - Allure containers (fixtures) are not shown; QASight has no place for them.
A comparison with Qualflare (a hosted test-results service that lists XCTest, RSpec, k6 and Espresso among its 23+ frameworks) found these four still needed a JUnit reporter or weren't covered. Same pattern, same entry point:
| File | Written by | Importer |
|---|---|---|
RSpec JSON (examples list + summary) |
rspec --format json |
rspec_import.py |
k6 summary (metrics + root_group) |
k6 run --summary-export=..., or handleSummary writing JSON.stringify(data)
|
k6_import.py |
xcresulttool JSON (testNodes tree) |
xcrun xcresulttool get test-results tests --path X.xcresult (Xcode 16+) |
xcresult_import.py |
Android instrumentation JUnit (suite device property) |
connectedAndroidTest (Espresso, UI Automator, Compose) |
junit_import.py |
-
RSpec.
full_nameisspec file › full description. Pending examples are skipped; errors outside examples (a spec file that failed to load) become onebrokenresult. Rerun:rspec <files> -e <description>, withbundle execwhen the target repo has aGemfile. -
k6. A load test has no test cases, so each check and each threshold becomes one result (
checks › group › name,thresholds › metric › expression). A check with any failed iteration isfailed("3 of 120 failed"); a crossed threshold isfailedwith the metric's values. Both the--summary-exportshape (keyed by name, thresholdtrue= failed) and thehandleSummaryshape (lists,{"ok": false}) are read. Results have no duration (each would span the whole run). No rerun command: only the whole script reruns. -
XCTest. The
.xcresultbundle is a database only Apple's tool reads, so the input is the JSONxcresulttoolexports; reading the bundle directly would need macOS.full_nameisBundle/Suite/test(), the-only-testing:form. A test that passed on a repetition after failing is flaky. No rerun command:xcodebuildalso needs a scheme and destination the results don't record. -
Android. The Android Gradle plugin's JUnit XML already worked; suites that name a
deviceare now labelledandroid(and the device ashost), so the run page offers./gradlew connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=Class#method. In a project with several modules that have instrumentation tests, run it on the module's own task.
Builds on Command Adapter and JUnit Import, Playwright JSON Import and Ingest and Team Server.
Generated from docs/Specs & ADRs/Runner Coverage - 2026-10-26.md. Edit it there; changes made in the wiki are overwritten.
Architecture
CLI Commands
Processes & Guides
- CI-CD Pipeline Setup
- E2E Harness Operations Guide
- GitLab Pages Demo
- Publishing Docker Images
- Publishing to Artifactory
- Publishing to PyPI
- Setup Snippets
- Shared Resource Pools
- Team Server
Prompts & Snippets
Roadmap & Strategy
- Feature Gaps and Quick Wins - 2026-10-31
- New User Journey Audit - 2026-11-01
- Paid Features to Offer Free - 2026-10-31
- Product Roadmap
Specs & ADRs
- Affected Test Selection - 2026-10-30
- Alerts Where Developers Look - 2026-10-22
- Architecture Consolidation - 2026-10-06
- Architecture Review - 2026-10-31
- BehaveX Reports - 2026-10-21
- Better Flaky Signal - 2026-11-01
- Command Adapter and JUnit Import - 2026-09-25
- Config JSON Schema - 2026-10-22
- Crash Detection - 2026-10-31
- Delta Comparison Policy
- Docs Site - 2026-10-19
- Docs Vault and Wiki Sync - 2026-10-07
- Easy Setup - 2026-11-01
- Engine Fixes - 2026-11-01
- Engineering Health Review - 2026-10-31
- Exporting Results - 2026-11-01
- Flaky Test Issues - 2026-11-01
- Flaky Test Quarantine - 2026-10-22
- Free Copies of Paid Features - 2026-11-01
- GitHub Action PR Comment - 2026-10-19
- Human-Run Resource Provider - 2026-10-30
- Importer and Integration Bug Hunt - 2026-10-31
- Ingest and Team Server - 2026-10-22
- Interview Readiness Fixes - 2026-10-07
- Library Packaging
- Lifecycle Fixes - 2026-11-02
- MCP Server - 2026-11-01
- New User Journey Automation - 2026-11-01
- Open Source Features - 2026-10-19
- OpenTelemetry Export - 2026-10-30
- Phase 3 Delta Comparison Engine Plan
- Phase 3 Unified Dashboard Plan
- Phase 4 BYOK and Failure Analysis
- Phase 5 UI Redesign - Cycles-First Navigation
- Playwright Adapter - 2026-10-19
- Playwright JSON Import - 2026-10-22
- Plugin API - 2026-10-19
- Product Roadmap Work - 2026-10-25
- Product to Ten - 2026-10-25
- Project Health - 2026-10-26
- QASight Logo - 2026-11-05
- Qualflare Follow-ups - 2026-10-26
- Quarantine From the UI - 2026-11-01
- Specs & ADRs
- Rename to QASight - 2026-11-04
- Repository Pattern - Database-Agnostic Refactor
- Resource Lifecycle Hooks - 2026-10-26
- Resource Pools and Leases - 2026-10-26
- Run Deletion and Stop - 2026-11-02
- Runner Coverage - 2026-10-26
- Scale Runs and Stages - 2026-10-24
- Security and Install Review - 2026-10-31
- Switchable Team Features - 2026-10-24
- Test Delivery Metrics - 2026-11-02
- Test Labels, Environments and Releases - 2026-11-02
- Test Source in AI Summaries - 2026-11-01
- Throwaway Stage Containers - 2026-10-24
- Tidy Cards and Demo Examples - 2026-11-05
- UI Design Review - 2026-10-31
- UI Polish - 2026-11-08
- UI Restyle - 2026-10-19
- UI Review Fixes - 2026-11-01
Testing Workflows
Vault