我正在尝试使用 nbgrader
自动化 autograding
。通常,学生在 autograded answer
单元格中编写一段代码(如 variable
或 function
),教师使用(通过引用 variable
或 function
)来编写 autograder tests
。
但有时,来自 autograded answer
单元格的输入代码可能只是一个 print(...)
,它将某些内容输出到屏幕(而不是 variable
或 function
)。在这种情况下,如何捕获打印输出,以便我们可以在下一个单元格中使用它来写入 autograder tests
?
回答1
nbgrader 文档 https://nbgrader.readthedocs.io/en/stable/user_guide/autograding_resources.html?highlight=print#id3 演示了如何修补内置函数 print
以便您可以捕获和测试打印输出:
问题:验证函数调用是否导致打印某个结果
def foo() #... print('right result')
对此的测试代码可以写成
from unittest.mock import patch with patch('__main__.print') as mock_print: foo() mock_print.assert_called_once_with('right_result')
此测试通过如果打印正确,但如果打印错误,则静默:
def foo() #... print('wrong result')
会引发断言错误,输出形式为
--------------------------------------------------------------------------- AssertionError Traceback (most recent call last) ... AssertionError: Expected call: print('right result') Actual call: print('wrong result')