Как добавить метод тестирования в группу классов, производных от Django TestCase?

У меня есть группа тестовых случаев, для которых все должны пройти точно такой же тест, в духе «Возвращает ли метод x имя существующего файла?»

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

class SharedTest(TestCase):
    def x(self):
        ...do test...

class OneTestCase(SharedTest):
    ...my tests are performed, and 'SharedTest.x()'...

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

    class SharedTest(TestCase):
        def x(self):
            if type(self) != type(SharedTest()):
                ...do test...
            else:
                pass

, но получил эту ошибку:

ValueError: no such test method in <class 'tests.SharedTest'>: runTest

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

13
задан JivanAmara 11 November 2014 в 22:50
поделиться

1 ответ

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

class SharedTest(TestCase):
    def setUp(self):
        self.do_not_run = True

    def test_foo(self):
        if getattr(self, 'do_not_run', False):
            return
        # Rest of the test body.

class OneTestCase(SharedTest):
    def setUp(self):
        super(OneTestCase, self).setUp()
        self.do_not_run = False

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

Обновление

Как говорит sdolan , примесь — правильный путь. Почему я не видел этого раньше?

Обновление 2

(После прочтения комментариев) Было бы неплохо, если бы (1) метод суперкласса мог избежать хакерской if getattr(self, 'do_not_run', False): check; (2) если количество тестов было подсчитано точно.

Существует возможный способ сделать это. Django подбирает и выполняет все тестовые классы в tests, будь то tests.py или пакет с таким именем. Если тестовый суперкласс объявлен вне модуля тестов, этого не произойдет. Он по-прежнему может быть унаследован тестовыми классами. Например, SharedTest можно найти в app.utils и затем использовать в тестовых примерах.Это будет более чистая версия вышеуказанного решения.

# module app.utils.test
class SharedTest(TestCase):
    def test_foo(self):
        # Rest of the test body.

# module app.tests
from app.utils import test
class OneTestCase(test.SharedTest):
    ...
3
ответ дан 1 December 2019 в 20:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: