Запуск unittest.main () из модуля? - PullRequest
2 голосов
/ 15 мая 2009

Я написал небольшую функцию, которая динамически определяет классы unittest.TestCase (тривиальная версия ниже).

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

factory.py:

import unittest

_testnum = 0
def test_factory(a, b):

    global _testnum

    testname = 'dyntest' + str(_testnum)

    globals()[testname] = type(testname, (unittest.TestCase,), {'testme': lambda self: self.assertEqual(a, b)})

    _testnum += 1


def finish():
    unittest.main()

someotherfile.py:

from factory import test_factory, finish


test_factory(1, 1)
test_factory(1, 2)


if __name__ == '__main__':
    finish()

Выход:

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

Так что он не выполняет никаких тестов.

Обратите внимание, что хранение всего этого в одном файле работает должным образом:

import unittest

_testnum = 0
def test_factory(a, b):

    global _testnum

    testname = 'dyntest' + str(_testnum)

    globals()[testname] = type(testname, (unittest.TestCase,), {'testme': lambda self: self.assertEqual(a, b)})

    _testnum += 1


test_factory(1, 1)
test_factory(1, 2)

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

Выход (как и ожидалось):

.F
======================================================================
FAIL: testme (__main__.dyntest1)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "partb.py", line 11, in <lambda>
    globals()[testname] = type(testname, (unittest.TestCase,), {'testme': lambda self: self.assertEqual(a, b)})
AssertionError: 1 != 2

----------------------------------------------------------------------
Ran 2 tests in 0.008s

FAILED (failures=1)

Как я использую свою функцию test_factory (), чтобы я мог выполнять все объекты TestCase, которые она определяет, из отдельного исходного файла?

Ответы [ 2 ]

9 голосов
/ 15 мая 2009

Общая идея (что unittest.main делает для вас):

suite = unittest.TestLoader().loadTestsFromTestCase(SomeTestCase)
unittest.TextTestRunner(verbosity=2).run(suite)

согласно http://docs.python.org/library/unittest.html?highlight=unittest#module-unittest. Ваши тестовые случаи скрыты в globals() с помощью функции test_factory, поэтому просто выполните dir(), найдите глобальные переменные, которые являются экземплярами unittest.TestCase (или с именами, начинающимися с 'dyntest' и т. Д.), И просто постройте свой набор таким образом и запустите его.

7 голосов
/ 15 мая 2009

По умолчанию unittest.main () ищет объекты модуля TestCase в основном модуле. Test_factory создает объекты TestCase в своем собственном модуле. Вот почему его перемещение за пределы основного модуля вызывает поведение, которое вы видите.

Попытка:

def finish():
    unittest.main(module=__name__)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...