Python, unittest: есть способ передать параметры командной строки в приложение

У меня есть модуль, который импортирует unittest и имеет некоторые TestCases. я бы хотел принять некоторые параметры командной строки (например, ниже, имя файла данных), но когда я пытаюсь передать параметр, я получаю сообщение "option -i not detected". Возможно ли иметь 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 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()

Ответ 1

Основываясь на ответе Алекса, это довольно легко сделать, используя 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.

Ответ 2

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

Ответ 3

Для небольших автономных приложений я использую параметр начальной проверки (-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()
    . . .

Ответ 4

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