Тестирование 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. Я еще не тестировал его, но он, похоже, соответствует вашим требованиям (ну, возможно, он не предназначен для носа, но он имеет аккуратные функции, такие как индикация клеток при сбоях). Я определенно буду использовать его для тестирования заданий и материалов для студентов:)