unittest тестирует повторное использование на семейство классов

У меня есть проблема при организации моего unittest основанный тест класса для семейства тестов. Например, предположите, что я реализую интерфейс "словаря" и имею 5 различных реализаций, хотят к тестированию.

Я действительно пишу один тестовый класс, который тестирует интерфейс словаря. Но как я могу приятно снова использовать его для тестирования моих всех классов? До сих пор я делаю ужасный:

DictType = hashtable.HashDict

В вершине файла и затем используют DictType в тестовом классе. Для тестирования другого класса, я вручную изменяюсь DictType к чему-то еще.

Как может сделать это иначе? Не может передать аргументы unittest классы так являются там более хорошим путем?

7
задан zaharpopov 28 March 2010 в 07:30
поделиться

2 ответа

Я решаю эту проблему с помощью стандартного 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 минут.

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

5
ответ дан 7 December 2019 в 12:18
поделиться

Вы можете посмотреть testscenarios , который позволяет вам установить список, называемый сценариями. Затем код генерирует версию тестового класса для каждого значения / сценария в списке

См. пример

Таким образом, в вашем случае сценариями будет список вроде [{dicttype: hashtable.HashDict}, {dicttype: otherimpl.class},] и используйте self.dicttype в своем тестовом коде.

0
ответ дан 7 December 2019 в 12:18
поделиться
Другие вопросы по тегам:

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