Является ли использование основной функции модулей Python для проверочного тестирования плохой идеей?

Я быстро объясню, что я имею в виду под этим.

Я работаю над проектом с использованием python, где у меня есть несколько модулей, выполняющих сегменты работы. Скажем, например, у меня есть модуль с именем Parser.py, и этот модуль имеет функцию parseFile(), которую мой основной модуль Main.py вызывает для анализа некоторых файлов.

На данный момент я использую основной метод внутри Parser.py.

if __name__ == "__main__":
    line_list = parseFile(sys.argv[1])

    out_file = open(sys.argv[2], "w")
    for i in range(len(line_list)):
        out_file.write(line_list[i].get_string(True))

Не важно, что именно делает синтаксический анализ, но важная часть заключается в том, что если вы его вызовете, то первый аргумент будет входным файлом для синтаксического анализа, второй аргумент — выходным файлом для синтаксического анализа.

Итак, что я делаю, по сути, так это использую пакетный файл для проверки результатов моего синтаксического анализатора с помощью типичной системы ввода, вывода, базовой линии...

ECHO Set the test, source, input, output and baseline directories
set TESTDIR=%CD%
set SRCDIR=%CD%\..\pypro\src
set INDIR=%CD%\input
set OUTDIR=%CD%\output
set BASEDIR=%CD%\baseline


:: Parser.py main method is base for unit testing on parsing
ECHO Begin Parser testing
cd %INDIR%\Parser
FOR %%G IN (*.psma) DO %SRCDIR%\Parser.py %%G %OUTDIR%\Parser\%%G
ECHO Parser testing complete

cd %TESTDIR%

"C:\Program Files\WinMerge\winmergeU.exe" "%OUTDIR%"  "%BASEDIR%" 

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

Что-то не так с этим методом? Я сделал это, потому что это было бы легко. Мой план состоит в том, чтобы продолжать делать это с максимально возможным количеством модулей, которые действительны и имеют смысл делать таким образом, а также с набором тестов pyunit внутри pydev...


person Colton Phillips    schedule 15.09.2011    source источник


Ответы (2)


Я думаю, что это хорошая идея, и, кажется, это обычный вариант использования конструкции if __name__ == '__main__'. Хотя это более обычная структура:

def main(argv=None):
    if argv is None:
        argv = sys.argv
    # etc.

if __name__ == "__main__":
    sys.exit(main() or 0)

Это дает вам дополнительную гибкость в использовании вашего main из интерактивного интерпретатора. Есть еще несколько хороших примеров от Гвидо и других здесь< /а>.

person wim    schedule 15.09.2011

Лично я в таких ситуациях создаю тестовые случаи (хотя они могли бы быть скорее интеграционными тестами, а не только модульными тестами).

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

Плохая сторона использования его в качестве __main__ заключается в том, что вам придется не забыть запустить его в качестве точки входа, и вы, вероятно, забудете сделать это позже, когда проект разрастется, и у вас будет много таких файлов - или в по крайней мере, есть тестовый пример, который вызывает этот main() :)

person Fabio Zadrozny    schedule 15.09.2011