У меня есть проблема при организации моего unittest
основанный тест класса для семейства тестов. Например, предположите, что я реализую интерфейс "словаря" и имею 5 различных реализаций, хотят к тестированию.
Я действительно пишу один тестовый класс, который тестирует интерфейс словаря. Но как я могу приятно снова использовать его для тестирования моих всех классов? До сих пор я делаю ужасный:
DictType = hashtable.HashDict
В вершине файла и затем используют DictType
в тестовом классе. Для тестирования другого класса, я вручную изменяюсь DictType
к чему-то еще.
Как может сделать это иначе? Не может передать аргументы unittest
классы так являются там более хорошим путем?
Я решаю эту проблему с помощью стандартного 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 минут.
Вам, конечно, не обязательно иметь все это в одном модуле (хотя я часто нахожу наиболее ясным изложить все таким образом, вы также можете сделать один отдельный тестовый модуль для каждого типа, который вы тестируете, каждый импорт
модуля с абстрактным базовым классом).
Вы можете посмотреть testscenarios , который позволяет вам установить список, называемый сценариями. Затем код генерирует версию тестового класса для каждого значения / сценария в списке
См. пример
Таким образом, в вашем случае сценариями будет список вроде [{dicttype: hashtable.HashDict}, {dicttype: otherimpl.class},] и используйте self.dicttype в своем тестовом коде.