Skip to main content

Pytest plugin for testing notebooks

Project description

nbmake

codecov PyPI versions PyPI versions PyPI Downloads

What? Pytest plugin for testing and releasing notebook documentation

Why? To raise the quality of scientific material through better automation

Who is this for? Research/Machine Learning Software Engineers who maintain packages/teaching materials with documentation written in notebooks.

Functionality

  1. Executes notebooks using pytest and nbclient, allowing parallel notebook testing
  2. Optionally writes back to the repo, allowing faster building of nbsphinx or jupyter book docs

Quick Start

If you have a notebook that runs interactively using an ipython kernel, you can try testing it automatically as follows:

pip install pytest nbmake
pytest --nbmake **/*ipynb

Configure Cell Timeouts

You can configure the cell timeout with the following pytest flag:

pytest --nbmake --nbmake-timeout=3000 # allows each cell 3000 seconds to finish

Allow Errors For a Whole Notebook

This configuration must be placed in the notebook's top-level metadata (not cell-level metadata).

Your notebook should look like this:

{
  "cells": [ ... ],
  "metadata": {
    "kernelspec": { ... },
    "execution": {
      "allow_errors": true,
      "timeout": 300
    }
  }
}

Allow a Cell to Throw an Exception

A cell with the following metadata can throw an exception without failing the test:

{
  "language": "python",
  "custom": {
    "metadata": {
      "tags": [
        "raises-exception"
      ]
    }
  }
}

Ignore a Code Cell

A cell with the following metadata will not be executed by nbmake

{
  "language": "python",
  "custom": {
    "metadata": {
      "tags": [
        "skip-execution"
      ]
    }
  }
}

Override Notebook Kernels when Testing

Regardless of the kernel configured in the notebook JSON, you can force nbmake to use a specific kernel when testing:

pytest --nbmake --nbmake-kernel=mycustomkernel

Add Missing Jupyter Kernel to Your CI Environment

If you are not using the flag above and are using a kernel name other than the default ‘python3’, you will see an error message when executing your notebooks in a fresh CI environment: Error - No such kernel: 'mycustomkernel'

Use ipykernel to install the custom kernel:

python -m ipykernel install --user --name mycustomkernel

If you are using another language such as c++ in your notebooks, you may have a different process for installing your kernel.

Parallelisation

For repos containing a large number of notebooks that run slowly, you can run each notebook in parallel using pytest-xdist.

pip install pytest-xdist

pytest --nbmake -n=auto

It is also possible to parallelise at a CI-level using strategies, see example

Build Jupyter Books Faster

Using xdist and the --overwrite flag let you build a large jupyter book repo faster:

pytest --nbmake --overwrite -n=auto examples
jb build examples

Mock out variables to simplify testing (experimental 🧪)

If your notebook runs a training process that takes a long time to run, you can use nbmake's mocking feature to overwrite variables after a cell runs:

{
  "cells": [
    ...,
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "nbmake": {
          "mock": {
            // these keys will override global variables after this cell runs
            "epochs": 2,
            "config": "/test/config.json",
            "args": {
              "env": "test"
            }
          }
        }
      },
      "outputs": [],
      "source": [
        "epochs = 10\n",
        "..."
      ]
    },
    ...
  ],
  ...
}

Advice on Usage

nbmake is best used in a scenario where you use the ipynb files only for development. Consumption of notebooks is primarily done via a docs site, built through jupyter book, nbsphinx, or some other means. If using one of these tools, you are able to write assertion code in cells which will be hidden from readers.

Pre-commit

Treating notebooks like source files lets you keep your repo minimal. Some tools, such as plotly may drop several megabytes of javascript in your output cells, as a result, stripping out notebooks on pre-commit is advisable:

# .pre-commit-config.yaml
repos:
  - repo: https://github.com/kynan/nbstripout
    rev: master
    hooks:
      - id: nbstripout

See https://pre-commit.com/ for more...

Disable Nbmake

Implicitly:

pytest

Explicitly:

pytest -p no:nbmake

See Also:

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

nbmake-1.3.3.tar.gz (11.5 kB view details)

Uploaded Source

Built Distribution

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

nbmake-1.3.3-py3-none-any.whl (11.6 kB view details)

Uploaded Python 3

File details

Details for the file nbmake-1.3.3.tar.gz.

File metadata

  • Download URL: nbmake-1.3.3.tar.gz
  • Upload date:
  • Size: 11.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.5

File hashes

Hashes for nbmake-1.3.3.tar.gz
Algorithm Hash digest
SHA256 0982e1e2c26b2fda7bac10f35b242c2b9b9b2574456975da158da05b0092888f
MD5 c5fb06525fda8e302b5854efb74a7f81
BLAKE2b-256 4805f43ce2004c8737ce0b106a18d65ae93c1bc9e5c019bda857fc0108f5da0a

See more details on using hashes here.

File details

Details for the file nbmake-1.3.3-py3-none-any.whl.

File metadata

  • Download URL: nbmake-1.3.3-py3-none-any.whl
  • Upload date:
  • Size: 11.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.5

File hashes

Hashes for nbmake-1.3.3-py3-none-any.whl
Algorithm Hash digest
SHA256 2f1cf4715ff24a5acd8929b4b71a9867e1e5efec5e4c74f51ceb2bacc6eb1c4d
MD5 d19d30bff42ab493e9d856de31b6f9b4
BLAKE2b-256 4bfd514136df225f6008cc08faa719ac79a0358167526f75c55cc453a25946f6

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