Как протестировать аргументы командной строки? - PullRequest
6 голосов
/ 10 мая 2011

Я пытаюсь предоставить аргументы командной строки для Python unittest и сталкиваюсь с некоторыми проблемами.Я искал в интернете и нашел способ предоставить аргументы как

unittest.main(argv=[myArg])

. Проблема в том, что это нормально работает для одного аргумента командной строки, но не удается для более чем одного аргумента.

unittest.main(argv=[myArg1, myArg2, myArg3])

Вышеприведенный вызов завершается с ошибкой, приведенной ниже:

  File "/opt/python2.6.6/lib/python2.6/unittest.py", line 816, in __init__
    self.parseArgs(argv)
  File "/opt/python2.6.6/lib/python2.6/unittest.py", line 843, in parseArgs
    self.createTests()
  File "/opt/python2.6.6/lib/python2.6/unittest.py", line 849, in createTests
    self.module)
  File "/opt/python2.6.6/lib/python2.6/unittest.py", line 613, in 
    loadTestsFromNames suites = [self.loadTestsFromName(name, module) 
    for name in names]
  File "/opt/python2.6.6/lib/python2.6/unittest.py", line 584, in 
    loadTestsFromName parent, obj = obj, getattr(obj, part)
AttributeError: 'module' object has no attribute 'admin'

Подробнее об этом узнал, и обнаружил, что Python unittest обрабатывает все, отправленное с использованием argv, как тестовый пример для запуска.знать, есть ли еще способ представить более одного аргумента в мои юнит-тесты.Я хочу переопределить некоторые жестко закодированные значения, такие как IP-адрес, тег тестового примера и т. Д., И, по сути, запустить этот сценарий тестирования из основного сценария тестирования.

Заранее спасибо.

Ответы [ 3 ]

10 голосов
/ 10 мая 2011

Почему бы просто не извлечь аргументы командной строки перед запуском unittest.main, а затем дать ему [sys.argv[0]] для его argv?

Что-то вроде:

if __name__ == '__main__':
   # do stuff with sys.argv
   unittest.main(argv=[sys.argv[0]])

Обратите внимание, что когда задано argv=None, unittest.main фактически принимает это как сигнал для анализа sys.argv.unittest.main требуется как минимум один элемент argv для использования в качестве имени программы.Поэтому избегать None, [sys.argv[0]] - это хорошее значение, так как он думает, что у него нет аргументов командной строки.


PS Я только что заметил ваше последнее предложение.Если это так - не используйте аргументы командной строки.Ваш «основной» сценарий тестирования должен просто использовать API unittest для загрузки тестовых случаев для модуля, настраивая их по своему желанию.

3 голосов
/ 10 мая 2011

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

from optparse import OptionParser
parser = OptionParser()
parser.add_option("-t", "--tag", dest="tag", help="tag id")

Затем попробуйте заполнить tag значениями, как если бы они пришли из командной строки, а затем передайте их в ваши тестовые классы __init__.

1 голос
/ 20 февраля 2013

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

Я обнаружил, что переопределение sys.argv внутри каждого теста, для которого он мне нужен, сработало для меня.Аргумент функции unittest.main(), который вы описываете, используется для самого модульного теста, а не для модуля, который вы хотите протестировать.

...