Perl тесты - общий родитель для тестов - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть набор тестов, которые всегда называются Module.t, каждый из которых начинается так:

use 5.026;
use strict;
use warnings;

use Test::Perl::Critic (-severity => 3);
use Module::Path 'module_path';
use Test::More tests => 8;
use Test::Log4perl;
Test::Log4perl->suppress_logging;

BEGIN { use_ok("My::Module") }
critic_ok(module_path("My::Module"));

... actual tests for this module ...

Это сделано так, потому что куча модулей не очень хорошо написана и пытается реорганизоватьВ процессе работы я пытаюсь со временем написать тесты для отдельных модулей.Например.Я не могу просто включить Perl :: Critic для всех источников, потому что он взорвется мне в лицо.

Я хотел бы в идеале сделать «родительский» тест для всех этих, чтобы, когда я или другойРазработчик хочет написать новый тест, они всегда будут иметь все необходимые вещи.Что-то вроде:

use 5.026;
use strict;
use warnings;

# 6 tests because 2 (use_ok and critic_ok) are already in the parent
use parent ParentTest("My::Module", tests => 6);

... actual tests for this module ...

Есть ли в Perl способ сделать это?

Отказ от ответственности: Я - нуб perl, так что, возможно, у этого есть лучшее решение :-)

1 Ответ

0 голосов
/ 10 ноября 2018

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

Что-то вроде:

# ParentTest.pm
package ParentTest;
use strict;
use warnings;

use Test::Perl::Critic (-severity => 3);
use Module::Path 'module_path';
use Test::More;
use Test::Log4perl;

sub import {
    my (undef, $module, %args) = @_;

    $args{tests} += 2;

    plan %args;
    Test::Log4perl->suppress_logging;
    use_ok $module;
    critic_ok module_path $module;

    @_ = 'Test::More';
    goto +Test::More->can('import');
}

1

Использование будет:

use ParentTest "My::Module", tests => 6;

Это все не проверено, но идея такова:

  • Мы хотим запустить некоторый код для настройки первоначального плана тестирования и выполнить несколько тестов.
  • Мы такжеЯ хочу экспортировать все, что экспортирует Test::More, поэтому наш вызывающий не должен use Test::More сами.
  • use Some::Module @args эквивалентен BEGIN { require "Some/Module.pm"; Some::Module->import(@args); }, поэтому мы можем просто поместить нашу пользовательскую логику в import method.
  • Мы начнем с игнорирования первого аргумента (который является именем класса, потому что import вызывается как метод класса) и присвоения оставшихся аргументов $module и %args.
  • Мы увеличиваем $args{tests} на 2, чтобы учесть два дополнительных теста, которые мы выполняем автоматически (если tests не был передан, он неявно создается здесь).
  • Мы передаем %argsдо plan с Test::More, что удобно для создания плана тестирования вненачальная строка use.
  • Мы выполняем начальные тесты.
  • Мы выполняем вызов Test::More::import, стирая наш собственный кадр стека.Это выглядит так, как будто наш вызывающий номер Test::More->import() экспортирует в них все служебные функции Test::More.
  • Унарный + в goto +Test::More->... не имеет никакого реального эффекта, но помогает различатьgoto LABEL и goto EXPRESSION синтаксические формы.Нам нужна последняя интерпретация.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...