Python, модульный тест - передача аргументов командной строки в setUp unittest.TestCase - PullRequest
28 голосов
/ 03 декабря 2009

У меня есть скрипт, который действует как оболочка для некоторых модульных тестов, написанных с использованием модуля 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 для этого, и его метод run принимает в качестве аргумента TestSuite. Я предполагаю, что он запустит сам метод setUp, поэтому мне нужны параметры, доступные в XMLTestRunner.

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

Ответы [ 4 ]

47 голосов
/ 17 января 2010

Ну, я хочу сделать то же самое и собирался задать этот вопрос сам. Я хотел улучшить следующий код, потому что он имеет дублирование. Это позволяет мне посылать аргументы для тестирования 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())
7 голосов
/ 23 мая 2014
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()
5 голосов
/ 03 декабря 2009

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

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

0 голосов
/ 07 февраля 2014

Если вы определяете атрибуты в методе 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...