У меня есть группа тестовых случаев, для которых все должны пройти точно такой же тест, в духе «Возвращает ли метод 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
Во-первых, я хотел бы получить любые элегантные предложения для этого. Во-вторых, хотя я и не хочу использовать хак типа (), я бы хотел понять, почему он не работает.
Я столкнулся с похожей проблемой. Я не мог предотвратить выполнение тестового метода в базовом классе, но я убедился, что он не выполняет никакого фактического кода. Я сделал это, проверив атрибут и немедленно вернувшись, если он был установлен. Этот атрибут был установлен только для базового класса, поэтому тесты выполнялись везде, кроме базового класса.
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):
...