Repository navigation
Test Plan Results by Build Modernized
Tracking issue: #1980 (net-new report; Reports area).
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.
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 fullrbb.*i18n set (55 keys × 10 bundles).
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.
- 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/bcount as executed;not_run = assigned − executed;coverage = executed / assigned;pass rate = passed / executed;total_executionscounts events attached to a real build. - Builds referenced by an execution but deleted from the project are appended
with a synthetic
#idname, so history never disappears.
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 #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.



