повторные тесты unittest для семейства классов - PullRequest
7 голосов
/ 28 марта 2010

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

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

DictType = hashtable.HashDict

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

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

Ответы [ 2 ]

5 голосов
/ 28 марта 2010

То, как я справляюсь со стандартным 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 содержащий модуль сабстрактный базовый класс).

0 голосов
/ 28 марта 2010

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

См. пример

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...