2013-12-09 20 views
12

インタラクティブな使用例で私のコードの一部を文書化するためにIPythonノートブックを使い始めました。ドキュメントがコードから古くなってしまうのを避けるため、ノートブックのコードを定期的に実行して、出力の変更をキャッチしてランタイムエラーのフラグを立てることをお勧めします。IPythonノートブックのテスト

私は回帰テストを実行するためにnosetestsを使用しており、この目的のためにIPythonノートブックを実行する方法があるかどうか疑問に思っていました。私はipython_noseで行われているように、IPythonノートブック内からnosetestsを実行しようとしていないことに注意してください。 doctestプラグインの行に沿って何かがあります。そのようなプラグインは存在しますか?

答えて

5

私は実際にそれを行うためのノーズプラグインについて知らないが、hereはそのようなことに必要な基本的な部分を示すスクリプトです。他の人にはforkedの機能が追加されています。

ノートブックで使用するのと同じカーネルオブジェクトを作成し、「すべて実行」と同じ実行を実行して、結果の出力を比較することが重要です。それはおそらく大部分が正しいdoctest関数に置き換えられるかもしれないいくつかの原始的なサニタイズを持っていますが、それは非常に複雑ではありません。

2

nosebookがあなたの目的に合っています。ちょうどそのようなケースを処理するためにビルドしました。ノートブックに特別なマークアップを必要とせず、@ minrkで言及されたサニタイズのいくつかを行います。

1

Andrea Zoncapytest-ipynbを最近公開しました。私はまだそれをテストしていないが、それはあなたの要件に合っているようだ(よく鼻の標的ではないが、失敗時のセル表示のようなきれいな機能がある)。私は間違いなく、学生のための課題や材料をテストするためにそれを使用します:)

2

私は最近、似たような処理を行うスクリプトを書いていたし、そのほとんどがthis blog on 'Testing Jupyter Notebooks'

に基づいていた。ここでの1からわずかに修正したバージョンですブログ:

def test_notebooks(): 
    for notebook in glob("./*.ipynb"): 
    nb, errors = _notebook_run(notebook) 
    assert errors == [] 
:あなたは今、この機能を使用することができ

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 

関連する問題