Python 2.6 Unittest помощь с параметрами и argparse, как решить?

Я пытаюсь запустить базовый модульный тест на Python 2.6, который принимает аргументы с помощью argparse.

Я ограничен в своей среде и не могу устанавливать какие-либо дополнительные библиотеки или использовать какие-либо модули для тестирования, кроме unittest.

Однако я считаю, что ответ лежит здесь:

Как вы пишете тесты для часть argparse модуля python?

Однако у меня возникли проблемы с рефакторингом предоставленного основного ответа с моим кодом.

Без рефакторинга моего примера кода, который я предоставил, может ли кто-нибудь показать мне свет и показать мне, как написать модульный тест для приведенного ниже кода, который принимает -H и -S на лету?

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


#!python
import argparse
import sys

try:
    HOSTNAME = sys.argv[2]
    SOMESTRING = sys.argv[3]
except IndexError:
    print "Please Enter the Hostname and Somestring"


def argparse_msg():
    return "testscript_example -H somehost -S somestring"


def check_arg(args=None):
    parser = argparse.ArgumentParser(description="A Test Example", usage=argparse_msg())
    parser.add_argument("-H", "--host",
                        help="HostName",
                        required=True)

    parser.add_argument("-S", "--somestring",
                        help="HostName",
                        required=True)

    results = parser.parse_args(args)

    return (results.host, results.somestring)


def message_test():
    print HOSTNAME + " " + SOMESTRING


def main():
    message_test()


if __name__ == "__main__":
    HOSTNAME, SOMESTRING = check_arg(sys.argv[1:])
    main()

person Gavin Jones    schedule 02.04.2019    source источник
comment
При использовании unittest (или другого пакета тестирования) вы не можете указать значения командной строки для своего собственного скрипта. Командная строка предназначена для самого unittest (у которого есть собственный парсер). Другие ссылки: stackoverflow.com/questions/51710083/, stackoverflow.com/questions/42331049/   -  person hpaulj    schedule 02.04.2019
comment
Все еще пытаюсь понять это, было бы здорово, если бы вы могли показать базовый пример в коде....   -  person Gavin Jones    schedule 02.04.2019


Ответы (1)


Чтобы облегчить тестовый класс, я изменил код следующим образом:

  • Удалены глобальные переменные (например: HOSTNAME, SOMESTRING)
  • Передаваемые параметры в функции
  • Возвращенная строка из функции, а не печать (из message_test и main)

Обновленный код receiver.py:

#!python
import argparse
import sys


def argparse_msg():
    return "testscript_example -H somehost -S somestring"


def check_arg(args=None):
    parser = argparse.ArgumentParser(description="A Test Example", usage=argparse_msg())
    parser.add_argument("-H", "--host",
                        help="HostName",
                        required=True)
    parser.add_argument("-S", "--somestring",
                        help="HostName",
                        required=True)
    results = parser.parse_args(args)
    return (results.host, results.somestring)


def message_test(HOSTNAME, SOMESTRING):
    return "{} {}".format(HOSTNAME, SOMESTRING)


def main(HOSTNAME, SOMESTRING):
    return message_test(HOSTNAME, SOMESTRING)


if __name__ == "__main__":
    HOSTNAME, SOMESTRING = check_arg(sys.argv[1:])
    print(main(HOSTNAME, SOMESTRING))

Результат запуска receiver.py:

python receiver.py -H localhost -S demo
localhost demo

Тестовый файл (test_receiver.py):

from receiver import check_arg
import unittest

class ParserTest(unittest.TestCase):

    def test_main(self):
        HOSTNAME, SOMESTRING = check_arg(['-H', 'test', '-S', 'sample string'])
        self.assertEqual(HOSTNAME, 'test')
        self.assertEqual(SOMESTRING, 'sample string')        

if __name__ == '__main__':
    unittest.main()

Результат запуска test_receiver.py:

python test_receiver.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
person arsho    schedule 02.04.2019