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

时间:2020-09-18 20:07:59

标签: python jupyter-notebook pytest

我们计划向Jupyter笔记本添加集成测试,以通过使用pytestnbval插件来验证它们是否端到端运行。 我们希望拥有的一项功能是能够对笔记本的执行进行参数化,以便我们可以在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

并查看不同的输出。

我们知道造纸厂已经支持以下内容:QMetaObject::invokeMethod(QObject *context, Functor function, Qt::ConnectionType type = Qt::AutoConnection, FunctorReturnType *ret = nullptr)

pytest也具有这样的功能吗?

1 个答案:

答案 0 :(得分:1)

您可以将Papermill作为一个选项,但是也可以尝试在笔记本计算机内部对测试进行参数化,以避免将每个参数集作为单独的测试运行(如上例所示)。一种实现方法是使用ipytest库,该库与SELECT * FROM test_table WHERE to_tsvector(discription) @@ to_tsquery('remote controller'); 类似,但在我看来却更简单(here is the example notebook)。

如果您基本上具有要输入的一个输入值,然后将确定整个笔记本的输出,那么您可以做的一个主意是:

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

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

相关问题