Является ли использование основной функции модулей Python для проверки правильности плохой идеей? - PullRequest
1 голос
/ 15 сентября 2011

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

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

На данный момент яиспользование метода main внутри 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 ...

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

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

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

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

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

1 голос
/ 15 сентября 2011

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

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

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

...