Дополнительно
python, unittest: есть ли способ передать приложению параметры командной строки
У меня есть модуль, который импортирует unittest и имеет несколько TestCases. Я хотел бы принять некоторые опции командной строки (например, ниже, имя файла данных), но когда я пытаюсь передать опцию, я получаю сообщение "опция -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()
45
5
В развитие ответа Алекса, это на самом деле довольно просто сделать, используя
argparse
:Я не проверял все флаги, которые можно передать в unittest, чтобы увидеть, работают они или нет, но передача имен тестов работает, например:
Запускает MyTest с
foo
иdata.txt
.В секции
if __name__ == '__main__':
, которую вы'не показываете нам, вам'нужноoptparse
и затемdel sys.argv[1:]
перед передачей управления кодуunittest
, чтобы последний не пытался интерпретировать опции командной строки еще раз, когда вы'уже с ними разобрались. (Немного сложнее иметь некоторые собственные опции и также передавать некоторые из них вunittest
, хотя это можно сделать, если у вас есть такие сложные потребности).Я думал, что я'д поделиться своим решением для добавления --debug перейти к тесту для контроля регистратора:
Затем я протянул
unittest.В TestCase
чтобы добавить запись:Теперь я могу включить сообщения в мой тест, используя --debug, но он игнорируется в обычных регрессий.
Для небольших автономных приложений, я использую первоначальный вариант Сентинел (-T) и называть unittest.главная() перед вызовом argparse.ArgumentParser()
Вы не должны принимать аргументы и опции для запуска нетестов, поскольку таким образом вы заставляете их работать в других, менее предсказуемых условиях. Вы должны выяснить, зачем вам нужно запускать тесты с разными данными, и сделать ваш набор тестов достаточно полным, чтобы охватить все наборы данных без необходимости каждый раз запускать их по-разному.