我们计划向 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 )。
如果您基本上有一个想要操作的输入值,并且该值将确定整个笔记本的输出,那么您可以做的一个想法是:
- 最后将笔记本中的所有其他函数/步骤包装成一个函数
- 使用单元魔术
%%run_pytest[clean]
,以便ipython
知道运行此单元 - 用
@pytest.mark.parametrize
装饰它以传递您想要测试的值
这样,您的整个笔记本将根据传递给此函数的参数重新运行几次。
关于python - pytest - 在执行期间更改 Jupyter 笔记本单元格中的变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63962231/