Как я могу использовать Test::More и друзей для автоматического тестирования унаследованного поведения?

Контекст:

Скажем, у меня есть несколько модулей, которые наследуются друг от друга (используя наследство старой школы с base а также parentне лось или подобное). Foo::Bar наследуется Foo, а также Foo::Bar::Baz наследуется Foo::Bar, Все эти модули имеют тестовые наборы, написанные с Test::More, Набор тестов для дочернего класса проверяет только те методы, которые он реализует. Дочерние классы не обязательно переопределяют все методы своих родителей, хотя они могут добавлять новые методы, которых нет у их родителей.

Вопрос:

Есть ли какие-то рамки тестирования, техника или Test::More функция, с помощью которой я могу писать тесты, которые будут не только тестировать поведение подкласса, но также будут запускать тестовые наборы для любых унаследованных поведенческих / родительских классов? По сути, я ищу что-то, что позволило бы мне написать тесты для уникального / специального поведения подкласса, но также проверит и убедится, что подкласс ведет себя в тестах так же, как ожидается, что его родительский класс (ы),

Что я пробовал:

Я написал очень простой тестовый комплект с методом генератора, который создает экземпляр указанного в строке модуля и запускает тесты для него в зависимости от того, какой тип модуля был запрошен (есть центральный хеш, который отслеживает иерархию подкласса / суперкласса), но это кажется грубым. Я предполагаю, что (как и большинство вещей, которые мне нужно сделать в Perl), кто-то другой уже сделал это гораздо более элегантно и надежно.

1 ответ

Решение

То, что вы ищете, это Test::Class,

Вы можете сделать тестовый класс для Foo::Barкоторый я бы назвал Test::Foo::Bar, Этот модуль Perl будет использовать Test::Class как его базовый класс. Но вместо тестирования Foo::Bar напрямую, доступ к нему через метод:

sub class {'Foo::Bar'}

Это позволяет нам переопределить это позже.

Затем вы делаете новый тестовый класс, Test::Foo::Bar::Baz который наследует от Test::Foo::Bar, Делая это, вы автоматически наследуете все тесты, которые вы написали для родительского класса. Конечно, вам нужно переопределить class():

sub class {'Foo::Bar::Baz'}

Вуаля! Теперь вы запускаете все свои тесты из Test::Foo::Bar на Foo::Bar::Bazи вы можете переопределить или сделать новые тесты для вашего сердца.

Chromatic имеет подробный пример в своем блоге: Resuing Test Code с помощью Test::Class

И вы правы насчет уже существующих тестовых ремней безопасности. Смесь Test::Class, Test::Harness, а также prove должен позаботиться о ваших потребностях, и есть очень мало причин, чтобы написать свои собственные.

Другие вопросы по тегам