python - pytest - 在执行期间更改 Jupyter 笔记本单元格中的变量值

标签 python jupyter-notebook pytest

我们计划向 Jupyter 笔记本添加集成测试,以验证它们是否使用 pytest 端到端运行。和 nbval插入。 我们希望拥有的一项功能是能够参数化笔记本执行,以便我们可以在 Jupyter 笔记本单元中尝试不同的变量值,并有效地测试同一笔记本的多个场景。

例如

foo = 1
print(foo)

我们希望能够将 1,2,3,100,900 等任何值分配给 foo 并查看执行的输出。本质上是这样的:
<EXECUTE_NOTEBOOK> -p foo=2
<EXECUTE_NOTEBOOK> -p foo=3
<EXECUTE_NOTEBOOK> -p foo=4
<EXECUTE_NOTEBOOK> -p foo=100
<EXECUTE_NOTEBOOK> -p foo=900

并查看不同的输出。

我们知道 papermill 已经支持这样的东西:https://papermill.readthedocs.io/en/latest/usage-execute.html#execute-via-the-python-api

pytest也有这样的功能吗?

最佳答案

您可以使用 Papermill 作为一种选择,但是您也可以尝试在笔记本本身内部对测试进行参数化,以避免将每个参数集作为单独的测试运行(如上例所示)。一种方法是使用 ipytest库,它类似于 nbval,但在我看来更简单一些( here is the example notebook )。

如果您基本上有一个想要操作的输入值,并且该值将确定整个笔记本的输出,那么您可以做的一个想法是:

  1. 最后将笔记本中的所有其他函数/步骤包装成一个函数
  2. 使用单元魔术%%run_pytest[clean],以便ipython知道运行此单元
  3. @pytest.mark.parametrize装饰它以传递您想要测试的值

这样,您的整个笔记本将根据传递给此函数的参数重新运行几次。

关于python - pytest - 在执行期间更改 Jupyter 笔记本单元格中的变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63962231/

相关文章:

python - 在 Ruby gem 中包含 Python 依赖项

python - Python中使用for循环和dict进行字符串控制

python - 在 Windows 上安装 firebird RDBMS 绑定(bind)包时出错

python - 如果将数组乘以等于或大于 10**20 的数字,为什么 numpy 数组的 dtype 会自动更改为 'object'?

jupyter - nbconvert 从命令行输出结果执行 Jupyter notebook

python - 如何为每组 pandas 列创建一个子图

python - 你如何更新 Ipython 中的内联图像?

python - 如何测试需要文件的点击命令

python - py.test -n <进程数> => "py.test: error: unrecognized arguments: -n"

python - 流量控制和失败 : Database access not allowed, 使用 "django_db".... 错误