Convert Azure DevOps / TFS xlsx test case exports into a self-contained HTML execution kit with evidence capture and PDF export.
Project description
tfs-test-runner
Convert Azure DevOps / TFS test case
xlsxexports into a self-contained HTML test execution kit with screenshot capture, status tracking, notes, and PDF evidence export. No server, works offline. Optional GPT translation.
📖 Full docs: luizhcrs.github.io/tfs-test-runner (PT-BR)
| Dark theme (default) | Light theme |
|---|---|
| Settings panel (theme + PDF options) | Case detail with evidence |
|---|---|
More screenshots — failures filter, PDF evidence, PDF with status badges, full plan, mobile, empty state
| Filter "Failures" | PDF evidence (default) |
|---|---|
| PDF with status pills (toggle ON) | Mobile / narrow viewport |
|---|---|
| Empty state | Full plan (long screenshot) |
|---|---|
| 03-full-plan.png |
Quick start
pip install tfs-test-runner
# Scaffold a fresh QA plan directory with templates
tfs-test-runner init my-qa-plan
cd my-qa-plan
# … fill in cases.xlsx …
# Validate the schema
tfs-test-runner validate cases.xlsx
# Generate the HTML execution kit
tfs-test-runner plan cases.xlsx -o plan.html
Open plan.html in any browser. The tester pastes screenshots (Ctrl+V) at each step, marks PASS/FAIL/N/A, writes notes, then clicks PDF for an evidence deliverable.
No Azure DevOps? Use init
tfs-test-runner init scaffolds a directory with a blank xlsx template (cell comments documenting each column) plus example phases.yaml and glossary.yaml. Fill the xlsx manually — same schema as Azure DevOps Test Plans → Export to Excel.
Subcommands
tfs-test-runner --help # full command list
tfs-test-runner plan cases.xlsx # generate HTML kit
tfs-test-runner validate cases.xlsx # check schema, print stats
tfs-test-runner init my-plan # scaffold new plan
tfs-test-runner screenshots # regen docs prints (maintainers)
Common flags
# GPT translation (paid, best quality)
export OPENAI_API_KEY=sk-...
tfs-test-runner plan cases.xlsx --llm --lang pt-BR -o plan.html
# Argos translation (free, offline; auto-installs language pair)
pip install 'tfs-test-runner[argos]'
tfs-test-runner plan cases.xlsx --argos --lang pt-BR -o plan.html
# Phase grouping + custom title + logo
tfs-test-runner plan cases.xlsx \
--phases phases.yaml \
--title "Sprint 42 — Acceptance" \
--logo company.png -o plan.html
# Validate before generating
tfs-test-runner validate cases.xlsx --strict
Features
- Phase / case / step tree, search (
/), filter chips, expand/collapse - Per-step PASS / FAIL / N/A, notes textarea, paste/drop/pick screenshot
- Per-image captions, lightbox zoom
- Per-case PDF (evidence-only) and full-plan PDF with cover sheet
- Settings panel (gear icon): light/dark/auto theme + status-in-PDF toggle
- JSON backup/restore (state + images)
- Keyboard:
/search,Ctrl+PPDF,Escclose lightbox/settings
💡 In the print dialog, uncheck "Headers and footers" so the browser doesn't inject
file:///…and date/time at every page.
Documentation
- docs/USAGE.md · PT-BR — full walkthrough for testers
- docs/ARCHITECTURE.md · PT-BR — pipeline, data shapes, design choices
- CONTRIBUTING.md — dev setup
- CHANGELOG.md — release notes
YAML configs (examples in examples/)
# phases.yaml — group cases
phases:
- id: p1
title: "Phase 1 — Smoke"
level: easy
case_ids: ["101", "104"]
- id: p2
title: "Phase 2 — Failures"
match: ["failure", "invalid", "error"]
# glossary.yaml — refine LLM translation (optional)
preserve: ["Sign In", "Save", "Cancel"]
notes: "Domain: web QA. Tone: technical, imperative."
Python API
from tfs_test_runner import parse_xlsx, translate_cases, assign_phases, render
cases = parse_xlsx("cases.xlsx")
translate_cases(cases, backend="llm", target_lang="pt-BR")
render(assign_phases(cases), "plan.html", page_title="My Plan")
Development
pip install -e .[dev]
pytest -q
CI matrix: Ubuntu / macOS / Windows × Python 3.10 / 3.11 / 3.12.
License
MIT — © 2026 luizhcrs. PRs welcome.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tfs_test_runner-2.1.1.tar.gz.
File metadata
- Download URL: tfs_test_runner-2.1.1.tar.gz
- Upload date:
- Size: 37.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0fe676c1b6eadea4873d969899d4e5243409db6535638697d9a9dc365b5e6328
|
|
| MD5 |
c6ede2ffaa9d882c3902ac4dbdd19a80
|
|
| BLAKE2b-256 |
e38ccdad9d9df725dcb625a486d9fb91b0d2db9c2d18093cbfe639148507fe29
|
Provenance
The following attestation bundles were made for tfs_test_runner-2.1.1.tar.gz:
Publisher:
release.yml on Luizhcrs/tfs-test-runner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tfs_test_runner-2.1.1.tar.gz -
Subject digest:
0fe676c1b6eadea4873d969899d4e5243409db6535638697d9a9dc365b5e6328 - Sigstore transparency entry: 1401198611
- Sigstore integration time:
-
Permalink:
Luizhcrs/tfs-test-runner@3c3a2f53e766b647004149ad999560feccee86b7 -
Branch / Tag:
refs/tags/v2.1.1 - Owner: https://github.com/Luizhcrs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@3c3a2f53e766b647004149ad999560feccee86b7 -
Trigger Event:
push
-
Statement type:
File details
Details for the file tfs_test_runner-2.1.1-py3-none-any.whl.
File metadata
- Download URL: tfs_test_runner-2.1.1-py3-none-any.whl
- Upload date:
- Size: 33.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0d4ca300848e2347890174f9ce886403d6628eefb92c649e340ffbfc7cb28145
|
|
| MD5 |
4f2fc441077af029e6e5448637f55d27
|
|
| BLAKE2b-256 |
8ef35b93a1357471b61c20b7862d004ef3e0eb60febb55588b58298501c086d6
|
Provenance
The following attestation bundles were made for tfs_test_runner-2.1.1-py3-none-any.whl:
Publisher:
release.yml on Luizhcrs/tfs-test-runner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tfs_test_runner-2.1.1-py3-none-any.whl -
Subject digest:
0d4ca300848e2347890174f9ce886403d6628eefb92c649e340ffbfc7cb28145 - Sigstore transparency entry: 1401198718
- Sigstore integration time:
-
Permalink:
Luizhcrs/tfs-test-runner@3c3a2f53e766b647004149ad999560feccee86b7 -
Branch / Tag:
refs/tags/v2.1.1 - Owner: https://github.com/Luizhcrs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@3c3a2f53e766b647004149ad999560feccee86b7 -
Trigger Event:
push
-
Statement type: