Тестирование IPython Notebooks

Я начинаю использовать ноутбуки IPython для документирования своего кода с использованием интерактивных примеров использования. Чтобы избежать слишком долгого устаревания документации из кода, я хотел бы, чтобы код в записной книжке выполнялся на регулярной основе, чтобы уловить любые изменения в выходе и определить ошибки времени выполнения.

Я использую nosetests для запуска регрессионных тестов и задавался вопросом, есть ли способ для этого выполнять IPython Notebooks для этой цели. Обратите внимание, что я не пытаюсь запустить nosetests изнутри IPython-ноутбука (как это сделано в ipython_nose). Что-то более похоже на плагин doctest. Существует ли такой плагин?

Ответ 1

Я не знаю фактического плагина для носа, чтобы сделать это автоматически, но здесь - это script, показывающий основные элементы, которые необходимы для такого вещь. Другие с тех пор раздвоены, чтобы добавить некоторые функции.

Суть в том, что вы создаете тот же объект Kernel, который использует ноутбук, и выполняете одно и то же выполнение, которое выполнялось бы "Run All", и сравнивайте полученный результат. Он имеет некоторую примитивную санитацию, которая, вероятно, может быть в значительной степени заменена правильными функциями доктрины, но она не слишком сложна.

Ответ 2

nosebook может соответствовать вашим целям. Я построил его для обработки именно таких случаев: он не требует специальной разметки в записной книжке и не выполняет некоторую санитацию, упомянутую @minrk.

Ответ 3

Недавно я написал script, который делает что-то подобное, и большая часть его была основана на в этом блоге на тему "Тестирование ноутбуков Jupyter"

Здесь немного измененная версия из той, что написана в блоге:

from glob import glob

import nbformat
from nbconvert.preprocessors import ExecutePreprocessor
from nbconvert.preprocessors.execute import CellExecutionError

def _notebook_run(path):
  """
  Execute a notebook via nbconvert and collect output.
   :returns (parsed nb object, execution errors)
  """
  kernel_name = 'python%d' % sys.version_info[0]
  this_file_directory = os.path.dirname(__file__)
  errors = []


  with open(path) as f:
    nb = nbformat.read(f, as_version=4)
    nb.metadata.get('kernelspec', {})['name'] = kernel_name
    ep = ExecutePreprocessor(kernel_name=kernel_name, timeout=10) #, allow_errors=True

    try:
      ep.preprocess(nb, {'metadata': {'path': this_file_directory}})

    except CellExecutionError as e: 
      if "SKIP" in e.traceback:
        print(str(e.traceback).split("\n")[-2])
      else:
        raise e

  return nb, errors

Теперь вы можете использовать эту функцию как:

def test_notebooks():
  for notebook in glob("./*.ipynb"):
    nb, errors = _notebook_run(notebook)
    assert errors == []

Ответ 4

Недавно Андреа Зонка опубликовала pytest-ipynb. Я еще не тестировал его, но он, похоже, соответствует вашим требованиям (ну, возможно, он не предназначен для носа, но он имеет аккуратные функции, такие как индикация клеток при сбоях). Я определенно буду использовать его для тестирования заданий и материалов для студентов:)