Python Unittest2 - избегайте включения TestCase в Discover () - PullRequest
3 голосов
/ 09 июня 2011

Я использую unittest2 на Python2.5, чтобы обнаружить тесты с unittest.TestLoader.discover, например:

suite = unittest2.loader.TestLoader().discover(test_path)
unittest2.TextTestRunner(verbosity=2,
        resultclass=ColorTestResult).run(suite)

для некоторых test_path в основе моего проекта.

У меня есть базовый класс, который расширен и перегружен многими другими, но я хотел бы проверить, что у этих производных нет регрессий. Давайте назовем этот базовый класс A и его производные A1, A2 и т. Д.

Я хотел бы создать базовый класс unittest2.TestCase, который может быть перегружен для каждого из производных A. Другими словами, я хотел бы иметь иерархию примерно так:

class A:
    pass

class A1(A):
    pass

class UT(unittest2.TestCase):
    target = A

class UT2(UT):
    target = A1

Теперь уловка в том, что я превращаю A в абстрактный класс, и UT завершится неудачей практически во всех тестовых случаях, которые будут подходящим образом проходить для UT2 и т. Д.

Мне кажется, что самое простое решение состоит в том, чтобы discover от unittest2 как-то "пропустил" UT. Я думаю, что это было бы возможно, поместив его в файл, отличный от одного подходящего шаблона 'test * .py', хотя, похоже, это не так.

Есть ли какие-либо решения для вышеуказанного сценария, которые могут быть уместными?

Буду благодарен за любые мысли и предложения.

1 Ответ

2 голосов
/ 09 июня 2011

Я предполагаю, что проблема в том, что UT2 наследуется от UT, поэтому модуль, в котором определен UT2, импортирует UT - и, следовательно, делает его доступным в пространстве имен модуля.Таким образом, даже если обнаружение не смотрит на модуль, в котором определено UT, оно все равно может найти TestCase в модуле UT2.

Это общая проблема с наличием базовых TestCases, которые сами определяют тесты.

Есть несколько возможностей.Можно было бы представить UT через функцию, поэтому ваш модуль, содержащий UT2, импортирует функцию вместо UT напрямую:

class UT2(get_base_class()):
    target = A1

Доступ к атрибутам в UT можно получить с помощью super ().

Другим, возможно, лучшим решением было бы сделать UT более абстрактным.Вы можете опустить цель в UT (так как она кажется бесполезной?) И использовать вызов setUp skipTest, если цели нет (или если цель A).

A третий Решение было бы иметь UT не наследовать от TestCase, но использовать его как mixin:

class UT2(TestCase, UT):
     target = A1
...