繁体   English   中英

测试IPython笔记本

[英]Testing IPython Notebooks

我开始使用IPython笔记本来记录我的一些代码和交互式使用示例。 为了避免文档从代码中过时,我希望笔记本中的代码能够定期执行以捕获输出中的任何更改并标记运行时错误。

我使用nosetests来运行回归测试,并想知道是否有办法让它为此目的执行IPython笔记本。 请注意,我不是试图从IPython笔记本中运行nosetests (就像在ipython_nose中一样 )。 更多关于doctest插件的内容。 这样的插件存在吗?

我不知道实际的鼻子插件是自动执行的,但这里有一个脚本,显示了这样的事情所必需的基本部分。 其他人已经分叉它添加一些功能。

要点是您创建了笔记本使用的相同内核对象,并执行“全部运行”所执行的相同执行,并比较结果输出。 它有一些原始的清理,可能很大程度上可以被正确的doctest函数取代,但它并不是非常复杂。

我最近编写了一个类似的脚本,其中大部分基于这个关于'测试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 == []

nosebook可能适合您的目的。 我构建它来处理这样的情况:它不需要笔记本中的特殊标记,并进行@minrk提到的一些清理。

最近Andrea Zonca发表了pytest-ipynb 我还没有测试它,但它似乎符合你的要求(也许不是针对鼻子,但它具有像故障时的细胞指示一样的简洁功能)。 我一定会用它来测试学生的作业和材料:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM