Вообще говоря, unittest используется для проверки уровня модуля python код , а не взаимодействия python кода с внешними программами. AFAIK, запись в stdout (ie. Print) означает, что вы либо отлаживаете, либо передаете информацию в другую программу.
В вашем случае я не думаю, что юнит-тест действительно необходим, если только вы не хотите давать задания, которые должны «пройти этот юнит-тест» (что часто встречается в дикой природе).
Вместо этого я бы просто перебрал каталог, содержащий назначения, проверил стандартный вывод с помощью подпроцесса, а затем записал результаты в файл csv:
import subprocess
import os
import csv
ASSIGNMENT_DIR = '/path/to/assignments'
expected_stdout = 'Hello World!'
def _determine_grade(stdout):
if stdout == expected_stdout:
return '100%'
return '0%'
grades = {}
for assignment in os.listdir(ASSIGNMENT_DIR):
filepath = os.path.join(ASSIGNMENT_DIR, assignment)
stdout = subprocesss.check_output(f'python3 {filepath}', shell=True)
grade = _determine_grade(stdout)
grades.append({'assignment':assignment, 'grade':grade})
with open('/path/to/grades.csv', 'w+') as f:
w = csv.DictWriter(f, ('assignment', 'grade'))
w.writeheader()
w.writerows(grades)