Написание модульного теста для нескольких файлов Python - PullRequest
2 голосов
/ 12 февраля 2020

Я пытаюсь написать программу тестирования для проверки многих (идентичных) заданий студентов. У меня есть тест, написанный с использованием библиотеки unittest . Документация, кажется, указывает, что каждый тест должен быть связан с одним файлом. Вместо этого я хотел бы иметь один тестовый файл и использовать аргументы командной строки для указания теста на файл, который он должен тестировать.

Я знаю, что могу сделать это, используя модуль argparse в моих модульных тестах, но есть ли лучший способ? Кажется, что это поведение должно поддерживаться в unittest, но я не могу найти ничего в документации ...

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Вообще говоря, 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)
1 голос
/ 12 февраля 2020

Создайте основной тестовый каталог и добавьте суб тестовые пакеты. Подготовьте тестового бегуна, указывающего на каталог тестов. Это может действовать как набор. Я приложил фрагмент кода, который я использовал для моего набора тестов.

import os
import unittest

def main(test_path, test_pattern):
    print(('Discovering tests in : {}'.format(test_path)))
    suite = unittest.TestLoader().discover(test_path, test_pattern)
    unittest.TextTestRunner(verbosity=2).run(suite)

if __name__ == '__main__':
    root_path = os.path.abspath('.')
    test_path = os.path.join(root_path, 'src/tests/')
    test_pattern = 'test_*'
    main(test_path, test_pattern)

...