Skip to content

Test Plan Results by Build Modernized

CI Agent edited this page Nov 1, 2026 · 1 revision

Test Plan Results by Build (modernized)

Tracking issue: #1980 (net-new report; Reports area).

What it is

A read-only TestLink 2.0.1 report under Reports that shows, for one test plan, how far every build got: how many of the plan's assigned test-case versions were executed in that build, their latest status inside that build, the pass rate, the coverage and the number of execution events.

1.9.20 answers the same question only one test case at a time (results by test case / build pair), so a lead cannot see the whole build timeline before promoting the next build. This screen puts every build of the plan side by side and adds a plan-wide snapshot built from the latest result of each version across all builds.

Screen

gui/templates/results/resultsByBuild.html

  • Dashio teal header, dark toolbar (Refresh, Export CSV, Platform, Apply, Close), report-context panel and locale switcher.
  • Verdict banner: ready (coverage and pass rate at least 80%), at_risk (coverage or pass rate below 50%), watch (in progress), empty (plan without assigned versions).
  • 9 KPI cards: builds, builds with activity, assigned versions, executed versions (+ coverage), passed, failed, blocked, not run, pass rate.
  • 12-column DataTable, newest build first — every build of the project is listed, a build without executions shows zeros, open builds are tinted. Columns: build, state (Open / Closed), assigned, executed, passed, failed, blocked, not run, pass rate + bar, coverage + bar, execution events, last execution.
  • Platform re-scoping, CSV export (UTF-8 BOM, ;, formula neutralisation), localized state cards (401/403/404/405, project_mismatch, invalid_request) and the full rbb.* i18n set (55 keys × 10 bundles).

BFF

api/resultsbybuild/index.php — plain PHP, session auth, bffSameOriginGuard, bffEnforceSession, Cache-Control: no-store.

Action Method Parameters
init GET|HEAD tplan_id, optional tproject_id, platform_id
report GET|HEAD tplan_id, optional tproject_id, platform_id

Rights: testplan_metrics on the owning project of the plan. The client-supplied tproject_id is only an assertion; a non-numeric platform_id is rejected before any lookup and a foreign platform answers 400. Error contract: not_authenticated 401, no_right 403, tplan_not_found / project_mismatch 404, invalid_request 400, method_not_allowed 405.

Semantics

  • Per-build snapshot: one pass over the plan's executions in canonical order (executions.id ASC) keeping the last status per (build, version) — a retest replaces the earlier result but still counts as an event.
  • Plan snapshot: the last status per version across all builds (latest wins).
  • Only p / f / b count as executed; not_run = assigned − executed; coverage = executed / assigned; pass rate = passed / executed; total_executions counts events attached to a real build.
  • Builds referenced by an execution but deleted from the project are appended with a synthetic #id name, so history never disappears.

Wiring

Reports launcher (cfg/reports.cfg.php), ASIDE (api/aside), api/resultsnav and $actions->resultsByBuild; server label $TLS_link_report_results_by_build in all 19 locale/*/strings.txt.

Suite

Suite #1980 in tmp/TLU_Test_Cases.md — 18/18 PASS (default scope, per-build latest-wins, empty build row, empty plan, platform validation, cross-project assertion, unknown ids, 400/401/403/404/405, wrong verb / CSRF proof, browser render EN+DE, CSV, search no-match, Reports/ASIDE integration). Fixture: tmp/fixtures_1980.php.

Screenshots

Results by Build - default scope

Results by Build - German locale

Results by Build - plan without builds

Results by Build - unknown plan

Clone this wiki locally