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