Perl-средства для регрессионного тестирования - PullRequest
5 голосов
/ 15 сентября 2008

Существует ли модуль Perl, который позволяет мне просматривать различия между фактическим и эталонным выходом программ (или функций)? Тест не пройден, если есть различия.

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

Ответы [ 6 ]

11 голосов
/ 16 сентября 2008

В Perl есть отличные утилиты для тестирования. Наиболее часто используемый модуль - это, вероятно, Test :: More, который предоставляет всю инфраструктуру, которая вам может понадобиться для написания регрессионных тестов. Утилита доказывания предоставляет простой интерфейс для запуска наборов тестов и суммирования результатов. Модуль Test :: Differences (который можно использовать с Test :: More) также может быть полезен для вас. Он форматирует различия как параллельные сравнения. Что касается фиксации фактического вывода в качестве нового справочного материала, это будет зависеть от того, как тестируемый код обеспечивает вывод и как вы его захватываете. Это должно быть легко, если вы пишете в файлы, а затем сравниваете их. Если это так, вы можете использовать модуль Text :: Diff в своем наборе тестов.

6 голосов
/ 16 сентября 2008

Как уже упоминалось, Test :: Differences является одним из стандартных способов сделать это, но я должен был упомянуть PerlUnit: пожалуйста, не используйте это. Это «оставленная программа» и не интегрируется со стандартными инструментами тестирования Perl. Таким образом, для всех новых тестовых модулей вам придется портировать их функциональность, если вы хотите их использовать. (Если кто-то взял обслуживание этого заброшенного модуля, напишите мне. Мне нужно поговорить с ними, поскольку я поддерживаю инструменты тестирования ядра, которые я хотел бы помочь интегрировать с PerlUnit).

Отказ от ответственности: хотя Id не написал его, в настоящее время я поддерживаю Test :: Differences, поэтому я могу быть предвзятым.

4 голосов
/ 16 сентября 2008

Я склонен использовать больше функций Test :: Simple и Test :: More. Я посмотрел на PerlUnit, и он, кажется, предоставляет большую часть функциональности, уже встроенной в стандартные библиотеки с библиотеками Test :: Simple и Test :: More.

3 голосов
/ 16 сентября 2008

Я спрашиваю тех из вас, кто рекомендует использовать PerlUnit. У него не было релиза за 3 года. Если вы действительно хотите тестирование в стиле xUnit, взгляните на Test :: Class , он выполняет ту же работу, но более перлиским способом Тот факт, что он все еще поддерживается и имеет регулярные выпуски, также не повредит.

Просто убедитесь, что это имеет смысл для вашего проекта. Может быть, старый добрый Test :: More - это все, что вам нужно (обычно для меня). Я рекомендую прочитать разделы " Почему вы не должны [не] использовать Test :: Class " в документации.

2 голосов
/ 16 сентября 2008

Стандартными рабочими лошадками сообщества являются Test :: Simple (для начала тестирования) и Test :: More (на тот момент, когда вы хотите больше, чем Test :: Simple может сделать для вас). Оба построены вокруг концепции ожидаемого и фактического результата, и оба покажут вам различия, когда они произойдут. Perldoc для этих модулей поможет вам в этом.

Возможно, вы также захотите ознакомиться с Perl QA wiki , и, если вы действительно заинтересованы в тестировании perl, список рассылки perl-qa, возможно, стоит посмотреть - хотя обычно он больше создание систем тестирования для Perl, чем использование этих систем на языке.

Наконец, использование модуля module-starter (из Module :: Starter) даст вам действительно хороший макет «стандарта CPAN» для новой работы - или для добавления существующего кода - включая готовую настройку тестового жгута.

2 голосов
/ 16 сентября 2008

Для проверки вывода программы есть Test :: Command . Это позволяет легко проверить stdout и stderr (и значение выхода) программ. E.g.:

use Test::Command tests => 3;

my $echo_test = Test::Command->new( cmd => 'echo out' );

$echo_test->exit_is_num(0, 'exit normally');
$echo_test->stdout_is_eq("out\n", 'echoes out');
$echo_test->stderr_unlike( qr/something went (wrong|bad)/, 'nothing went bad' )

Модуль также имеет функциональный интерфейс, если вам больше по вкусу.

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