Python 2.6 Unittest помощь с параметрами и argparse, как решить? - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь запустить базовый модульный тест на 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()

1 Ответ

2 голосов
/ 02 апреля 2019

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

  • Удалены глобальные переменные (например: 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
...