Подтвердить что ты не робот

Python, unit test - передать аргументы командной строки setUp unittest.TestCase

У меня есть script, который действует как обертка для некоторых модульных тестов, написанных с использованием модуля Python unittest. Помимо очистки некоторых файлов, создания потока вывода и создания некоторого кода, он загружает тестовые примеры в пакет с помощью

unittest.TestLoader().loadTestsFromTestCase()

Я уже использую optparse, чтобы вытащить несколько аргументов командной строки, используемых для определения местоположения вывода, независимо от того, нужно ли регенерировать код и нужно ли выполнять очистку. Я также хочу передать конфигурационную переменную, а именно URI конечной точки, для использования в тестовых случаях.

Я понимаю, что я могу добавить OptionParser в метод setUp для TestCase, но вместо этого хочу передать параметр setUp. Возможно ли это с помощью loadTestsFromTestCase()? Я могу выполнить итерацию по возвращенному TestSuite TestCases, но могу ли я вручную вызвать setUp на TestCases?

** РЕДАКТИРОВАТЬ ** Я хотел бы указать, что могу передать аргументы setUp, если я перебираю тесты и вызываю setUp вручную, например:

(options, args) = op.parse_args()
suite = unittest.TestLoader().loadTestsFromTestCase(MyTests.TestSOAPFunctions)
for test in suite:
    test.setUp(options.soap_uri)

Однако для этого я использую xmlrunner, и его метод запуска принимает в качестве аргумента TestSuite. Я предполагаю, что он будет запускать метод setUp, поэтому мне нужны параметры, доступные в XMLTestRunner.

Надеюсь, это имеет смысл.

4b9b3361

Ответ 1

Хорошо, я хочу сделать то же самое и сам задал этот вопрос. Я хотел улучшить следующий код, потому что он имеет дублирование. Это позволяет мне отправлять аргументы для тестирования TestCase:

import unittest
import helpspot

class TestHelpSpot(unittest.TestCase):
    "A few simple tests for HelpSpot"

    def __init__(self, testname, path, user, pword):
        super(TestHelpSpot, self).__init__(testname)
        self.hs = helpspot.HelpSpot(path, user, pword)

    def test_version(self):
        a = self.hs.version()
        b = self.hs.private_version()
        self.assertEqual(a, b)

    def test_get_with_param(self):
        a = self.hs.filter_get(xFilter=1)

    def test_unknown_method(self):
        self.assertRaises(helpspot.HelpSpotError, self.hs.private_wuggienorple)

if __name__ == '__main__':
    import sys
    user = sys.argv[1]
    pword = sys.argv[2]
    path = sys.argv[3]

    test_loader = unittest.TestLoader()
    test_names = test_loader.getTestCaseNames(TestHelpSpot)

    suite = unittest.TestSuite()
    for test_name in test_names:
        suite.addTest(TestHelpSpot(test_name, path, user, pword))

    result = unittest.TextTestRunner().run(suite)
    sys.exit(not result.wasSuccessful())

Ответ 2

if __name__ == '__main__':
    from optparse import OptionParser
    parser = OptionParser()
    parser.add_option("-z", "--zebra",
                      action="store_true", dest="zebra", default=False,
                      help="run like a zebra")    


    (options, args) = parser.parse_args()

    if options.zebra:
        zebrafy()


    # remove our args because we don't want to send them to unittest
    for x in sum([h._long_opts+h._short_opts for h in parser.option_list],[]):
        if x in sys.argv:
            sys.argv.remove(x)


    unittest.main()

Ответ 3

Я бы определенно советовал не передавать аргументы setUp, как это; setUp предназначен для вызова неявно при запуске теста, поэтому вы не должны явно его вызывать так.

Одним из способов решения этой проблемы было бы установить значения, которые необходимо установить как переменные среды или значения в глобально доступном "контексте" модуле, который позволит тестовым случаям обращаться к ним по мере необходимости. Я хотел бы использовать переменные среды, поскольку он более гибкий с точки зрения запуска тестов (вы больше не полагаетесь на аргументы командной строки).

Ответ 4

Если вы определяете атрибуты в методе init, вы можете просто передать их все в конструкторе, как это.

import unittest
import helpspot

class TestHelpSpot(unittest.TestCase):
    "A few simple tests for HelpSpot"

    def __init__(self, testname, path, user, pword):
        super(TestHelpSpot, self).__init__(testname)
        self.path = path
        self.user = user
        self.pword = pword
....
....
....


if __name__ == '__main__':
    True

    suite = unittest.TestSuite()
    suite.addTest(TestHelpSpot("test_version", path, user, pword))    

    unittest.TextTestRunner().run(suite)