【Jupyter】開発用Notebookはnbmakeで自動テストしよう

一度書いたソースコードの品質を長期にわたって保つため、自動テストの取り組みはますます注目されています。しかし、通常のソースコードならまだしも、開発上の必要があって整備したJupyter Notebookのテスト技法に関する議論や知見はまだまだ深まっていないのではないでしょうか(特に日本においては)。ひょっとすると開発目的にNotebookを使う、ということ自体がマイナーなのかもしれませんが、いざ使うとなると、開発チームとしてデグレを起こさないような取り組みも考える必要があるだろうと思います。そこでここでは、

  • どのようにJupyter Notebookを利用したコードの品質を保つか (どのように、いずれの時点で何度実行しても期待する結果になることを保証するか)

という課題を解決する(かもしれない)、nbmakeというツールを紹介していきます。

基本的にシステム開発的な文脈から話をしますが、nbmakeというツール自体、学術研究等におけるNotebookコードの再現性担保にも活用できるものだと思いますので、そういった点に悩まれている方も是非読んでみて欲しいです。

Who Am I ?

Webシステム開発をやっているエンジニアです。業務ではGo, PythonとちょっぴりTypescriptを触っています。

私が今いるプロジェクトでは、開発上のニーズがあってJupyter Notebook(.ipynb拡張子ファイル)を使っています。その際、通常のソースコードと似たような形での自動テスト実施、ひいてはCI/CDパイプラインを構築できないだろうか?と調べてみたところ、見つけたのがnbmakeというツールでした。

ちなみにJupyter Notebookでのテストツールとして、pytest-ipynbもあるようなのですが、最新版リリースが2019年と、今はアップデートされていないようでした。

nbmakeの使いかた

nbmakeは、pytestと組み合わせてJupyter Notebook(.ipynb拡張子ファイル)のテストができるツールです。

使いかた自体は簡単で、以下のようにpytestと合わせてインストールし、コマンドを叩くだけです。

pip install pytest nbmake

# カレントディレクトリ以下のNotebookを(再帰的に)実行確認
pytest --nbmake "."

公式のexampleに対して↑を実行してみると、↓のような結果が得られます。mybinder.orgの環境を利用しました。

$ pytest --nbmake "."
============================================================ test session starts ============================================================
platform linux -- Python 3.9.7, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
rootdir: /home/jovyan
plugins: nbmake-1.2, anyio-3.5.0
collected 3 items                                                                                                                           

ipynb/Boggle.ipynb .                           [33%]
ipynb/Cheryl-and-Eve.ipynb .                   [66%]
ipynb/Differentiation.ipynb .                  [100%]

============================================================= warnings summary ==============================================================
ipynb/Boggle.ipynb: 20 warnings
ipynb/Cheryl-and-Eve.ipynb: 37 warnings
ipynb/Differentiation.ipynb: 31 warnings
  /opt/conda/lib/python3.9/site-packages/nbformat/validator.py:315: DeprecationWarning: Passing a schema to Validator.iter_errors is deprecated and will be removed in a future release. Call validator.evolve(schema=new_schema).iter_errors(...) instead.
    for error in errors:

-- Docs: <https://docs.pytest.org/en/stable/warnings.html>
====================================================== 3 passed, 88 warnings in 31.18s ======================================================

テストコードはどこに書くか?

では、このnbmakeでNotebookのテストをするにあたって、アサーション等のテストコードはどこに実装すべきなのでしょうか?

これについては、公式がちょっとしたヒントを書いてくれています。

you are able to write assertion code in cells which will be hidden from readers.

テストコードも同じNotebook上のセルに実装して、テスト実装をしたセルは隠しておく。アイデアの1つとしてですが、とても面白いと感じます。JupyterlabのUIだと、View > Collapse Selected Codeで実現できそうです。

返信がありません

コメントを残す

メールアドレスが公開されることはありません。