python, unittest: есть ли способ передать параметры командной строки в приложение - PullRequest
42 голосов
/ 23 июня 2009

У меня есть модуль, который импортирует unittest и имеет несколько тестовых случаев. мне бы хотелось принять некоторые параметры командной строки (например, ниже, имя файла данных), но когда я пытаюсь передать опцию, я получаю сообщение "опция -i не распознана". Можно ли использовать unittest + для предоставления опций приложению (примечание: я использую optparse для обработки опций)? Спасибо.

$ python test_app_data.py -i data_1.txt

option -i not recognized

=====================

продолжение: это реализация предложенного решения:

import cfg_master  #has the optparse option-handling code

...

if __name__ == '__main__':    
    #add you app's options here...
    options_tpl = ('-i', '--in_dir', '-o', '--out_dir')
    del_lst = []
    for i,option in enumerate(sys.argv):
        if option in options_tpl:
            del_lst.append(i)
            del_lst.append(i+1)

    del_lst.reverse()
    for i in del_lst:
        del sys.argv[i]

    unittest.main()

Ответы [ 5 ]

55 голосов
/ 28 декабря 2011

Опираясь на ответ Алекса, на самом деле это довольно легко сделать с помощью argparse:

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--input', default='My Input')
    parser.add_argument('filename', default='some_file.txt')
    parser.add_argument('unittest_args', nargs='*')

    args = parser.parse_args()
    # TODO: Go do something with args.input and args.filename

    # Now set the sys.argv to the unittest_args (leaving sys.argv[0] alone)
    sys.argv[1:] = args.unittest_args
    unittest.main()

Я не проверял все флаги, которые вы можете передать в unittest, чтобы увидеть, работают ли они или нет, но передача имен тестов в них работает, например:

python test.py --input=foo data.txt MyTest

Запускает MyTest с foo и data.txt.

32 голосов
/ 23 июня 2009

В разделе if __name__ == '__main__':, который вы нам не показываете, вам нужно будет optparse, а затем del sys.argv[1:], прежде чем передать управление коду unittest, чтобы последний код не пытался интерпретировать параметры командной строки снова , когда вы уже имели дело с ними. (Немного сложнее иметь несколько собственных опций и , а также передать некоторые значения до unittest, хотя это можно сделать, если у вас действительно есть такие сложные потребности).

2 голосов
/ 13 марта 2018

Я думал, что поделюсь своим решением для добавления ключа --debug в тест для управления регистратором:

if __name__=='__main__':
     parser = argparse.ArgumentParser(description="Build a compilation script")
     parser.add_argument('--debug', help='Turn on debug messages', action='store_true', default=False)

     args = parser.parse_args()

     if args.debug:
         log_level = logging.DEBUG
     else:
         log_level = logging.INFO

     logging.basicConfig(level=log_level)
     sys.argv.pop()
     unittest.main()

Затем я расширил unittest.TestCase, чтобы добавить запись:

 class mcs_TestCase(unittest.TestCase, object):
     def __init__(self, *args, **kwargs):
         super(mcs_TestCase,self).__init__(*args,**kwargs)
         logging.basicConfig()
         self.logger = logging.getLogger(__name__)
         ...

Теперь я могу включать и выключать сообщения в моем тесте, используя --debug, но в обычных регрессиях это игнорируется.

1 голос
/ 22 октября 2014

Для небольших автономных приложений я использую начальную опцию стража (-t) и вызываю unittest.main () перед вызовом argparse.ArgumentParser ()

if __name__ == "__main__":
    if len(sys.argv) > 1 and sys.argv[1] in ["-t", "--test"]:
        del(sys.argv[1])
        sys.exit(unittest.main()) # pass sys.argv[

    p = argparse.ArgumentParser()
    . . .
0 голосов
/ 23 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...