簡體   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