День 4: Тестирование
Четвертая статья цикла Perl 6 Advent Calendar на русском языке.
Авторы Perl имеют давнюю привычку снабжать тестами свои модули, и в Perl 6 мы планируем продолжить эту замечательную традицию.
Тестирование очень простое. Традиционный perl-way – это выводить данные в Test Anything Protocol. Но вы не должны делать это сами, вы можете использовать для этого специальный модуль.
Предположим, что вы написали замечательную функцию вычисления факториала:
sub fac(Int $n) {
[*] 1..$n
}
Сейчас нас не интересует как работает функция – мы хотим это выяснить. Так давайте проверим:
use v6;
sub fac(Int $n) {
[*] 1..$n
}
use Test;
plan 6;
is fac(0), 1, 'fac(0) работает';
is fac(1), 1, 'fac(1) работает';
is fac(2), 2, 'fac(2) работает';
is fac(3), 6, 'fac(3) работает';
is fac(4), 24, 'fac(4) работает';
dies_ok { fac('ох, я же строка') }, 'можно вызывать только с целым аргументом';
И запустим:
$ perl6 fac-test.pl 1..6 ok 1 - fac(0) работает ok 2 - fac(1) работает ok 3 - fac(2) работает ok 4 - fac(3) работает ok 5 - fac(4) работает ok 6 - можно вызывать только с целым аргументом
Здесь use Test; загружает модуль тестирования, plan 6; говорит о том, что мы хотим запустить шесть испытаний. Затем идут пять строк шаблона is $got, $expected, $description. is() сравнивает строки, но поскольку целое всегда можно представить строкой, это нормально.
И наконец строкой dies_ok { $some_code }, $description мы проверяем, что вызов функции с нецелым аргументом является критической ошибкой.
Вывод имеет следующий вид: 1..6, затем по одной строке на каждый тест, который начинается на ok (или not ok если тест провален), номер теста, пробел, тире, пробел и описание теста.
Предположим, что вы запускаете больше тестов и не хотите смотреть на вывод каждого, но хотите общий результат. Команда prove из Perl 5 даст вам следующее:
prove --exec perl6 fac-test.pl fac-test.pl .. ok All tests successful. Files=1, Tests=6, 11 wallclock secs ( 0.02 usr 0.00 sys + 10.26 cusr 0.17 csys = 10.45 CPU) Result: PASS
Вы так же можете поместить все ваши файлы с тестами в отдельную директорию, например t/, и запустить prove рекурсивно на все .t файлы в этой директории:
prove --exec perl6 -r t
Так же неплохо поместить эту строку в ваш Makefile, чтобы просто ввести команду make для запуска тестов.