测试IPython笔记本

时间:2013-12-09 23:52:57

标签: python ipython nose ipython-notebook nosetests

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

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

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

我最近编写了一个类似的脚本,其中大部分基于this blog on 'Testing Jupyter Notebooks'

以下是博客上稍微修改过的版本:

@PropertySource("/WEB-INF/config/prod.properties")

您现在可以将此功能用作:

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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