I wrote the code for my undergraduate TA jobs, to check assignment codes of students in Python class are correct or not.
Usage of the code is
$ python [test01.py[,test02 , ...] answer.dat grade.md
It will write grades (range 0~100) to a file called grade.md
.
"""
Testing Assginments
by kidkkr
03-16-2017
"""
import os
import sys
from difflib import SequenceMatcher
class ResultChecker:
""" Check python code result with answer data """
__slots__ = '_srcFiles', '_ansFile', '_gradeFile', '_grade', '_ans'
def __init__(self, srcFiles, ansFile, gradeFile):
self._srcFiles = srcFiles
self._ansFile = ansFile
self._ans = open(self._ansFile, 'r').read()
self._gradeFile = gradeFile
self._grade = "# Grade File\n"
def _run_code(self, src):
print('-----------running ' + src + '..-----------')
os.system('python ' + src + ' > result.swp')
res = open('./result.swp', 'r').read()
ratio = int(SequenceMatcher(None, res, self._ans).ratio() * 100)
self._grade += src + ' ' + str(ratio) + '\n'
print('result: ' + str(ratio))
def check(self):
for src in self._srcFiles:
self._run_code(src)
open(self._gradeFile, 'w').write(self._grade) # Write _grade to a file
print('Checking has completed.')
print(self._gradeFile + ":")
print(self._grade)
def __main__():
if len(sys.argv) < 2: # Check arguments
raise ValueError('')
srcFiles = sys.argv[1:-2]
ansFile = sys.argv[-2]
gradeFile = sys.argv[-1]
ResultChecker(srcFiles, ansFile, gradeFile).check()
if __name__ == '__main__':
__main__()