Данный пост написан по материалам книги "Perl Testing: A Developer's Notebook"
Perl предоставляет множество удобных модулей для тестирования, например Test::Builder, с котороми производится взаимодействие через единый формат передачи результатов тестирования ( анг. - Test Anything Protocol(TAP) ). Понимание TAP помогает интерпретировать результаты испытаний и способствует более правильной организации тестов в ваших проектах.
Примечание: TAP - Test Anything Protocol - единый формат передачи результатов тестирования.
Примечание: Далее все тестовые модули выводят отчеты в формате TAP, Test::Harness их интерпретирует.
Примечание: Перевод на русский язык Test::Harness .
Сохраните следующий код программы в sample_output.pl
#!perl print <<END_HERE; 1..9 ok 1 not ok 2 # Failed test (t/sample_output.t at line 10) # got: '2' # expected: '4' ok 3 ok 4 - это тест 4 not ok 5 - test 5 should look good too not ok 6 # TODO: тест 6 планируется реализовать в будущем ok 7 # skip этот тест пропускается ok 8 # skip этот тест пропускается ok 9 # skip этот тест пропускается END_HERE
Теперь запустите через prove (см. "Выполнение тестов" ):
$ prove sample_output.pl samplesample_output.pl .. Failed 2/9 subtests (less 3 skipped subtests: 4 okay) Test Summary Report ------------------- samplesample_output.pl (Wstat: 0 Tests: 9 Failed: 2) #[1] Failed tests: 2, 5 #[2] Files=1, Tests=9, 0 wallclock secs ( 0.03 usr + 0.01 sys = 0.04 CPU) #[3] Result: FAIL #[4]
Скрипт отработал и вывел результат в формате TAP, точно так же, как если бы это был тестовый скрипт. Вывод скрипта затем был обработан утилитой prove, в итоге мы видим общий отчет по результатам.
#[1] - всего тестов - 9, из них 2 неудачны
#[2] - неудачные тесты под номерами 2 и 5
#[3] - в тестах участвовал один тестовый файл, 9 тестов, затрачено процессорного времени 0.04 сек.
#[4] - Общий результат - неудача (FAILURE)
В отчете также упоминается о трех пропущенных тестах. Пропущены тесты под номерами 7,8,9, каждый из них содержит метку #skip. Они считаются успешными (об этом будет обсуждаться в следующий раз).
Остается любопытная строка, тест 6. Она начинается с 'not ok', но тест не считается неудачным, поскольку там же указана метка #TODO. ( этот случай рассмотрим позже, в одном из следующих постов.)
Все остальное содержимое вывода игнорируется, которое состоит из диагностических сообщений, добавленных разработчиком. При разработке бывает полезно посмотреть на вывод теста в целом, будь то с помощью prove -v или непосредственным выполнением скрипта perl. (см. "Выполнение тестов" ).
Что происходит, когда фактическое число тестов отличается, от того, что ожидалось? Запуск несоответствующего числа тестов расценивается как ошибка. Сохраните следующий код теста в файле few_tests.t:
use Test::More tests => 3; pass( 'one test' ); pass( 'two tests' );
Запустим его командой prove:
$ prove few_tests.t few_tests.t .. 1/3 # Looks like you planned 3 tests but ran 2. few_tests.t .. Dubious, test returned 255 (wstat 65280, 0xff00) Failed 1/3 subtests Test Summary Report ------------------- few_tests.t (Wstat: 65280 Tests: 2 Failed: 0) Non-zero exit status: 255 Parse errors: Bad plan. You planned 3 tests but ran 2. Files=1, Tests=2, 0 wallclock secs ( 0.07 usr 0.02 sys + 0.05 cusr 0.01 csys = 0.15 CPU) Result: FAIL
Test::More сообщает, что фактическое число выполненных тестов отлично от указанного числа.
Сохраните следующий код в файле too_many_tests.t:
use Test::More tests => 2; pass( 'one test' ); pass( 'two tests' ); pass( 'three tests' );
Запустите его командой prove:
$ prove few_many_tests.t few_many_tests.t .. 1/2 # Looks like you planned 2 tests but ran 3. few_many_tests.t .. Dubious, test returned 255 (wstat 65280, 0xff00) All 2 subtests passed Test Summary Report ------------------- few_many_tests.t (Wstat: 65280 Tests: 3 Failed: 1) Failed test: 3 Non-zero exit status: 255 Parse errors: Bad plan. You planned 2 tests but ran 3. Files=1, Tests=3, 0 wallclock secs ( 0.04 usr 0.00 sys + 0.02 cusr 0.01 csys = 0.07 CPU) Result: FAIL
В результате мы видим, что третий тест расценивается как ошибка, Test::More снова сообщил о несоответствии указанного числа тестов с фактическим.