Skip to main content

A single aggregated tqdm progress bar for pytest, xdist-aware, with failures printed above the bar. Interactive-only.

Project description

pytest-tqdm

CI PyPI Python versions License: MIT

One tqdm progress bar for your whole pytest run — even under pytest-xdist — topped with a live throughput / failures history panel. Failures scroll above the panel with full tracebacks; everything else stays quiet. Interactive-only, so it never pollutes CI logs or AI-agent output.

 throughput  ·  peak 32/s
   32 │                     ▁▄▃█▄▅█████████████████████▆▅▆▄▃▂
      │                 ▅▄█▅██████████████████████████████████▇▅▄
    0 │        ▄▅▅█████████████████████████████████████████████████▅▆▃
 failures
      │              ●●          ● ●   ●    ●  ●●     ● ●
 😰  61%|████████████▏     | 738/1210 [00:41<00:26, 17.9 test/s, ✓731 ✗7 s0]

The bar is a live red/green health signal (green while passing → red on the first failure), with a Doom-guy face that suffers as more tests fail. Above it, a sticky panel charts throughput over time (green bars, height = tests/s) and plots each failure as a red dot (height = failures that tick).

A one-line summary lands when the run finishes:

🙂  pytest-tqdm ▸ 1210 tests in 01:25  ·  14.2 tests/s  ·  ✓1180 ✗2 s28  ·  8 workers

Why

Under pytest-xdist the usual pretty progress plugins render a bar per file or per worker, and the output interleaves into noise. pytest-tqdm collapses the whole session into a single aggregated bar driven on the xdist controller (which receives every worker's report), so you get one clean line with ETA and throughput — plus a history panel and failures surfaced immediately, above it.

Install

pip install pytest-tqdm

The plugin auto-registers via pytest's pytest11 entry-point. Its only runtime dependency is tqdm.

Usage

By default the bar (and panel) turn on automatically whenever standard error is an interactive terminal (and you are on the xdist controller, not a worker). In CI, when output is piped, or under an AI coding agent, standard error is not a TTY, so the plugin stays completely silent — your existing reporter is untouched.

pytest -n auto            # bar + panel in your terminal, nothing changes in CI

Options

Flag pytest.ini / env Effect
(none) Auto-on in a TTY; panel + bar; failures print above with a full traceback.
--tqdm PYTEST_TQDM=1 Force on even without a TTY.
--no-tqdm PYTEST_TQDM=0 Force off.
--tqdm-no-chart tqdm_chart (ini) Hide the history panel, keep just the bar.
--tqdm-chart-height=ROWS tqdm_chart_height (ini) Throughput panel height (default 5).
--tqdm-names tqdm_names (ini) Stream every finished test name above the bar.
--tqdm-tb=full|line|no tqdm_tb (ini) Traceback verbosity above the bar (default full).
--tqdm-color=auto|always|never tqdm_color (ini) Colour (default auto = TTY only). NO_COLOR always wins.
--tqdm-no-face tqdm_face (ini) Hide the Doom-style health face.
--tqdm-interval=SECONDS tqdm_interval (ini) Min seconds between redraws (default 0.4).

Resolution order for activation: --tqdm / --no-tqdmPYTEST_TQDM → TTY auto-detection.

The history panel

On by default (disable with --tqdm-no-chart). A sticky panel above the bar, sampled every --tqdm-interval seconds and scrolling right → now:

  • throughput — green vertical bars, height ∝ tests/second that tick, auto-scaled to the running peak (labelled top-right).
  • failures — a red dot for every tick that had a failure, its height ∝ how many failed that tick, so bursts stand out.

Anything printed above the bar (failure tracebacks, --tqdm-names) scrolls above the whole panel, which then redraws underneath.

The bar, colours & the face

😎  42%|███████▉    | 512/1210 [00:37<00:48, 14.3 test/s, ✓510 ✗0 s0]

face · percentage · bar · done/total · elapsed<eta · throughput · ✓/✗/skip tally.

When colour is on (a TTY, or --tqdm-color=always), the bar is green while everything passes and flips red the instant a test fails (yellow if only skips so far); the tally is coloured too and failure headers are bold red.

The Doom-guy face tracks the failure ratio and degrades accordingly:

😎 all green → 🙂😐😟😰🤕💀 everything's on fire.

Hide it with --tqdm-no-face; turn colour off with --tqdm-color=never or NO_COLOR=1.

The end-of-run line

When the session finishes the live region is replaced by a single totals line: number of tests, wall time, tests/second, the pass/fail/skip tally, and how many xdist workers ran (serial if you ran without -n).

How it works

  • Controller-only. pytest-xdist forwards every worker's pytest_runtest_logreport to the controller, so one reporter there sees all results and drives a single bar/panel. Workers render nothing.
  • Summary preserved. The plugin subclasses pytest's TerminalReporter and merely mutes its live per-test writes — all bookkeeping still runs, so the native end-of-run summary, --durations, the failures recap, etc. are untouched.
  • stderr. The bar, panel and above-bar text go to standard error; the normal reporter's summary goes to standard out, so they never fight.

Compatibility

  • Python 3.9+
  • pytest 8 and 9
  • Works with and without pytest-xdist; disables pytest-sugar while active (one bar only).

License

MIT © Michał Pasternak

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

pytest_tqdm-0.3.0.tar.gz (14.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pytest_tqdm-0.3.0-py3-none-any.whl (13.0 kB view details)

Uploaded Python 3

File details

Details for the file pytest_tqdm-0.3.0.tar.gz.

File metadata

  • Download URL: pytest_tqdm-0.3.0.tar.gz
  • Upload date:
  • Size: 14.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.2

File hashes

Hashes for pytest_tqdm-0.3.0.tar.gz
Algorithm Hash digest
SHA256 e4d2440417ed0e8e73bc30ed4e570164958af2f7eb9a1b2553a95ce0d45f371c
MD5 13c7c04704cec8e844159b064cfdf956
BLAKE2b-256 3b17e0465dc326ea5633fd2d380b81499dfc3426e952c329464b63fd6f5d8cf8

See more details on using hashes here.

File details

Details for the file pytest_tqdm-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for pytest_tqdm-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0fdcd85a6525c2cf708db55f1de8fb8a9d91294db6ad358b4bf6255e71be4f94
MD5 6672dd7fae54e7b5547dc0d309dc09c1
BLAKE2b-256 1fbc4d5acac047f6ba8dd55b64625bc6ebe8989dd512ac8b859b4b4863430ec2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page