Skip to main content

📓 NotebookTester

uv image

A fast, reliable, and parallel Jupyter notebook testing tool with caching support! Test your notebooks with confidence.

🌟 Features

  • 🚀 Parallel Execution: Test multiple notebooks simultaneously
  • ⏱️ Configurable Timeouts: Set custom timeouts for notebook execution
  • 💾 Smart Caching: Cache test results to avoid unnecessary re-runs
  • 🎯 Selective Testing: Only test modified notebooks
  • 📊 Detailed Logging: Comprehensive logs with test results and errors
  • 🛠️ CLI Support: Easy to use command-line interface

🔧 Installation

Choose your preferred package manager:

Using pip (slow legacy)

pip install notebooktester

Using uv (10-100x faster)

see uv docs for more info.

uv add notebooktester

🚀 Quick Start

Test a single notebook:

notebooktester path/to/your/notebook.ipynb

Test all notebooks in a directory:

notebooktester path/to/notebooks/directory

Test a specific list of notebooks:

notebooktester nb1.ipynb nb2.ipynb nb3.ipynb

You can mix files and directories, and combine them with any of the options below:

notebooktester nb1.ipynb nb2.ipynb -t 120 -w 4

🎮 Command Line Options

notebooktester [OPTIONS] PATHS...

Options:

  • -t, --timeout SECONDS: Timeout in seconds for each notebook (default: 60). With --report, the minimum duration to show (default: 30)
  • -w, --workers NUMBER: Number of parallel workers (default: CPU count)
  • -c, --cache-dir PATH: Cache directory for test results (default: .notebookcache)
  • -v, --verbose: Enable verbose output (full log stream, no progress bar)
  • -pb, --progressbar: Show a live, time-weighted progress bar based on cached notebook timings (mutually exclusive with -v)
  • -f, --force: Ignore cache and force test execution
  • -r, --report: Show long-running notebooks from the cache instead of running tests
  • --version: Show the installed version and exit

Every run prints a summary line first, e.g. Testing 42 notebooks (30 cached/skipped, 12 to run) - estimated time ~3m10s, using timings from previous cached runs.

📋 Example Usage

Basic usage:

notebooktester notebooks/

With custom timeout and workers:

notebooktester notebooks/ -t 120 -w 4

Force re-run all tests:

notebooktester notebooks/ --force

Find long-running notebooks from the cache (no re-run needed):

notebooktester --report

Same, but with a lower threshold:

notebooktester --report -t 20

🔍 Cache Behavior

NotebookTester maintains a cache of test results to optimize performance:

  • Only notebooks modified since their last test run are re-tested
  • If the notebook timed out, and the current timeout has not been increased, notebook is skipped
  • Cached results include success/failure status and error messages
  • Force flag (-f) bypasses the cache

🐢 Long-Running Notebook Report

Once you've run the tests at least once, --report reads straight from the cache to show which notebooks are the slowest — no re-execution required. This pairs well with param() (see below): use the report to find your slow notebooks, then wrap their expensive parameters in param() so they run fast under notebooktester while keeping their real values everywhere else.

notebooktester --report
notebooktester --report -t 20        # lower the threshold to 20s
notebooktester --report -c .my-cache # point at a different cache dir

Example output:

>>notebooktester --report -t 20

🐢 Long-running notebooks (> 20s)

Notebook                        Time   Timeout  Status
------------------------------------------------------
notebooks/slow_train.ipynb     55.2s       60s  ✅ PASSED
notebooks/medium.ipynb         33.7s       60s  ✅ PASSED
------------------------------------------------------
2 notebook(s), 88.9s combined

⚡ Reducing Notebook Runtime with param()

Wrap expensive values in param(full, test=...) so notebooks run with a cheap stand-in under notebooktester, while keeping the real value everywhere else (e.g. when run interactively):

from notebooktester import param

EPOCHS = param(100, test=2)
SEARCH_SIZE = param(10_000, test=50)

📊 Output

The tool provides:

  • Progress bar for test execution
  • Colored console output for test results
  • Detailed logs in the logs/ directory
  • Summary of passed and failed tests

Example output:

>>notebooktester notebooks/ -t 120 -w 4
Running tests with 4 workers
Starting notebook tests - found 10 notebooks
✅ PASSED - notebook1.ipynb: Success
❌ FAILED - notebook2.ipynb: Cell execution error
⏰ TIMEOUT - notebook3.ipynb: A cell timed out

Test Summary: 8 passed, 2 failed

🤝 Contributing

Contributions are welcome! Feel free to:

  • Report bugs
  • Suggest features
  • Submit pull requests

👤 Author

Raoul Grouls

Metadata

Release files for notebooktester 0.3.8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for notebooktester 0.3.8
File Size Uploaded Provenance
notebooktester-0.3.8.tar.gz 94.6 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for notebooktester 0.3.8
File Interpreter ABI Platform
notebooktester-0.3.8-py3-none-any.whl Python 3 none any Details

Total release size: 105.8 kB

Release files / notebooktester-0.3.8.tar.gz

Download URL notebooktester-0.3.8.tar.gz
Size 94.6 kB
Tags Source
SHA-256 checksum
How to use checksums
5469429a5dfad04fbf9928fdd992bac414ea6f52672913005e6591c6e1197cb7
BLAKE2b-256 checksum
How to use checksums
9776499818936f464f30212e476e53cdb2cf7e07cfb02014af91e41ab90d6407
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / notebooktester-0.3.8-py3-none-any.whl

Download URL notebooktester-0.3.8-py3-none-any.whl
Size 11.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cdb695e5b39eb96e1fa79c843e8d0f1c4134daa724fc8330c0ed1b3d7062f517
BLAKE2b-256 checksum
How to use checksums
8e32b72fe810896573220d61284aec192b7aecda321d4cea1e3f8b991ef76f26
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Security for notebooktester 0.3.8

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page