python测试策略开发和自动分级

时间:2016-09-06 12:02:49

标签: python file python-3.4 file-handling

我有一个输入文件列表和一个预期的输出文件,我想编写一个自动分级器,它接受一个python程序,在输入文件上运行它,并将其输出与输出文件进行比较。我使用的方法是使用python的os模块使用os.system('python program.py > actual.out')运行程序,然后使用os.system()再次在输出和expected.out之间执行diff。

我目前面临的问题是从文件中读取输入,因为给出的程序是从控制台读取的。那么,我应该如何重定向文件中的输入,使其可以被program.py中的sys.stdin读取。

import os
def grade(program_py_file_handler,input_dir,output_dir):
   #create temporary file for program.py using program_py_file_handler
   #one by one read all files from input_dir
   #run program.py using os.system generating a temp file
   #do diff be temp file and expected file

有没有更好的方法在不使用diff命令的情况下执行diff?

将program.py中的输出重定向到我使用python program.py>tem.out的文件。我应该使用什么等效的输入文件重定向到progam.py,这样无论我在program.py中使用过sys.stdin,它都将从传递的文件中读取? (修改program.py不是一个选项。)

1 个答案:

答案 0 :(得分:0)

你可以使用Python 3.3+中的内置模块来做所有事情,因为你实际上是在subprocess并在预期的输出上做diff。简单的最小例子:

check.py

import sys
from subprocess import check_output
from difflib import ndiff

def split(s):
    return s.splitlines(keepends=True)

def check(program_name, expected):
    output = check_output([sys.executable, program_name]).decode('utf8')
    diff = ndiff(split(output), split(expected))
    print(''.join(diff), end="")

def main():
    check('hello.py', 'Good Morning!\n')

if __name__ == '__main__':
    main()

hello.py

print('Good Evening!')

运行示例

$ python check.py 
- Good Evening!
?      ^^^
+ Good Morning!
?      ^^^

根据需要修改,链接库中的其他方法/函数。如果您需要stdin用于子进程,您可能需要创建Popen对象并调用通信,但请先阅读文档以供将来参考。