我正在为学生作业写一个自动评分器。一些任务是编写从STDIN读取并打印到STDOUT的程序。
目前,我的分级器在一个批次中传递输入,然后将所有STDOUT作为一个批次读取(impl:我使用subprocess.run(..., input="bluen7n".encode(), capture_output=True)
(。
然而,当向学生提供反馈时,将STDOUT和STDIN交错会更有帮助,就像他们在终端上运行程序时所经历的那样。
因此,对于一个要求颜色和数字的程序,我目前可以将STDIN和STDOUT表示为:
STDIN
blue
7
标准输出
name a color: pick a number: nice choices :)
但我想在测试运行后显示的是:
name a color: blue
pick a number: 7
nice choices :)
这是一个已解决的问题吗?如果没有,我可以将现有的哪些工具组合在一起来实现这一点?在SO/谷歌30分钟的研究中,我发现有很多方法可以处理子流程通信,所以我希望有人能为我指明最有成效的方向。
Charles Duffy的评论,以及对另一个问题的回答中的信息,让我了解当前的解决方案。
我没有通过Popen
(或衍生工具(运行学生提交,而是使用runpy.run_path
:以编程方式调用它
runpy.run_path(script_name, _globals, '__main__')
这使我可以像运行__main__
一样运行脚本,就像从终端运行一样。
我用自定义版本的input
和print
设置了_globals
,以便截获这些调用并记录活动。此外,我在_globals
中重写sys.argv
,以具有用于提交的模拟参数。
通过截取input
,我既可以断言打印了正确的提示,也可以提供适当的响应。
Extra:为了简化测试,我编写了一个类,加载一个预期的对话框,然后运行提供的脚本,并断言每个input
和print
都遵循预期的对话框。
最终结果可以在byu pytest utils/io_checker.py 中找到