То, как я справляюсь со стандартным unittest
, заключается в создании подклассов - в конце концов, переопределение данных так же просто, как и переопределение методов.
Итак, у меня есть базовый класс для тестов:
class MappingTestBase(unittest.TestCase):
dictype = None
# write all the tests using self.dictype
и подклассы:
class HashtableTest(MappingTestBase):
dictype = hashtable.HashDict
class OtherMappingTest(MappingTestBase):
dictype = othermodule.mappingimpl
Здесь подклассам нужно только переопределить dictype
.Иногда удобнее также выставить MappingTestBase
, используя "методы перехвата".Когда тестируемые типы не имеют точно идентичных интерфейсов во всех случаях, это можно обойти, если подклассы переопределят методы ловушек по мере необходимости - это шаблон проектирования «Шаблонный метод», см., Например, на этой странице., в котором есть закомментированная и составленная по времени коллекция из нескольких моих видео лекций по шаблонам проектирования - часть II посвящена методу шаблона и его вариантам в течение первых 30 минут.
У вас нетконечно, чтобы все это было в одном модуле (хотя я часто нахожу, что так можно было бы разобраться, вы также можете создать один отдельный тестовый модуль для каждого тестируемого вами типа, каждый import
содержащий модуль сабстрактный базовый класс).