Python unittest пропустить тест только для одного подкласса

1

Позвольте сказать, что у меня есть мой unittest, настроенный так:

import unittest

class BaseTest(object):
    def setup(self):
        self.foo = None

    def test_something(self):
        self.assertTrue(self.foo.something())

    def test_another(self):
        self.assertTrue(self.foo.another())

    def test_a_third_thing(self):
        self.assertTrue(self.foo.a_third_thing())

class TestA(BaseTest, unittest.TestCase):
    def setup(self):
        self.foo = FooA()


class TestB(BaseTest, unittest.TestCase):
    def setup(self):
        self.foo = FooB()


class TestC(BaseTest, unittest.TestCase):
    def setup(self):
        self.foo = FooC()

Теперь скажем, что FooC еще не реализовал a_third_thing, и я хочу пропустить test_a_third_thing для ТОЛЬКО класса TestC. Есть ли способ использовать декоратор @unittest.skipif для этого? Или какой-нибудь другой удобный способ пропустить этот тест только для этого класса?

Python 2.7, если это имеет значение

  • 0
    BaseTest должен наследовать TestCase
  • 1
    Вы можете переопределить тест в TestC , например, def test_a_third_thing(self): pass
Показать ещё 2 комментария
Теги:
python-unittest
python-decorators

2 ответа

1
Лучший ответ

Возможно, вам не нужно "пропустить" тест. Один простой подход - переопределить базовый тест с помощью манекена.

class TestC(BaseTest, unittest.TestCase):
    def setup(self):
        self.foo = FooC()

    def test_a_third_thing(self):
        """Override the assertions of the base test."""
        pass
0

Вы не можете использовать @unittest.skipif здесь, потому что он оценивается во время модуля, и проверка должна выполняться во время выполнения.

Для достижения желаемого результата ваш test_a_third_thing в базовом классе должен выглядеть следующим образом:

class BaseTest(unittest.TestCase):   
    def test_a_third_thing(self):
        if not getattr(self.foo, "a_third_thing", None):
            self.skipTest(self.foo.__class__.__name__ + ' has no a_third_thing, skip')
        else:
            self.assertTrue(self.foo.a_third_thing())

Также исправьте опечатки в вашем примере setup to setUp. Удалите 'unittest.TestCase' из списка наследования тестовых классов и добавьте в базовый класс.

  • 0
    Спасибо. В моем примере нет опечаток, BaseTest сознательно не наследуется от TestCase, потому что я не хочу запускать тесты для BaseTest (у него нет действительного атрибута foo). Смотрите этот вопрос: stackoverflow.com/questions/1323455/…
  • 0
    @C_Z_ если вы ответили на ваш вопрос, можете ли вы принять этот ответ?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню