kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 jd.
jd.
Вопрос

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 2009-06-22T23:23:05+00:00 5
 jd.
jd.
Редактировал вопрос 23-го июня 2009 в 1:04
Программирование
unit-testing
python
Решение / Ответ
 tghw
tghw
28-го декабря 2011 в 7:23
2011-12-28T19:23:36+00:00
Дополнительно
Источник
Редактировать
#9188438

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

58
0
Alex Martelli
Alex Martelli
22-го июня 2009 в 11:37
2009-06-22T23:37:01+00:00
Дополнительно
Источник
Редактировать
#9188436

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

 Tats_innit
Tats_innit
Редактировал ответ 19-го января 2016 в 2:21
32
0
Ray Salemi
Ray Salemi
13-го марта 2018 в 4:24
2018-03-13T16:24:12+00:00
Дополнительно
Источник
Редактировать
#9188440

Я думал, что я'д поделиться своим решением для добавления --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, но он игнорируется в обычных регрессий.

Ray Salemi
Ray Salemi
Редактировал ответ 13-го марта 2018 в 4:38
2
0
 qneill
qneill
22-го октября 2014 в 2:15
2014-10-22T14:15:55+00:00
Дополнительно
Источник
Редактировать
#9188439

Для небольших автономных приложений, я использую первоначальный вариант Сентинел (-T) и называть unittest.главная() перед вызовом 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()
    . . .
1
0
 ironfroggy
ironfroggy
23-го июня 2009 в 12:02
2009-06-23T00:02:49+00:00
Дополнительно
Источник
Редактировать
#9188437

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

-6
0
Похожие сообщества 30
Python beginners
Python beginners
17 345 пользователей
Вопросы про Python для чайников. Cпам и троллинг неприемлем. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Правила группы: https://t.me/ru_python_beginners/1649981
Открыть telegram
Python
Python
14 260 пользователей
Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/1961404
Открыть telegram
🐍 Python Stepik Chat
🐍 Python Stepik Chat
11 616 пользователей
Этот уютный чат создан для помощи в решение задач на прекрасном курсе "Поколение Python: курс для начинающих" и не только. Правила: https://t.me/pythonstepikchat/619142 Чат для оффтопа - t.me/+fqNb78zlQY81NGUy Наш канал - @kimport_this
Открыть telegram
aiogram
aiogram
8 192 пользователей
Репозиторий: https://github.com/aiogram/aiogram Сайт: https://aiogram.dev Полезная информация: https://t.me/aiogram_ru/1421485?thread=1421477
Открыть telegram
Python — вакансии и аналитика
Python — вакансии и аналитика
6 468 пользователей
Публикуем вакансии и запросы на поиск работы по направлению Python, Flask и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @golang_jobs, @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs
Открыть telegram
Сообщество Python Программистов
Сообщество Python Программистов
5 885 пользователей
Канал: @pip_install Наши сайты: https://python-scripts.com https://selenium-python.com https://itfy.org Мы в ВК: https://vk.com/open_sourcecode Вакансии: https://t.me/python_scripts_hr
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 1 день назад
2
Денис Васьков
Зарегистрирован 2 дня назад
3
Dima Patrushev
Зарегистрирован 5 дней назад
4
sirojidddin otaboyev
Зарегистрирован 1 неделю назад
5
Елена Гайдамамакинат
Зарегистрирован 1 неделю назад
ID
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией