В Perl традиционно используется пакет модулей для тестирования: Test::Simple, Test::More, а также комплексные фреймворки вроде Test::Class, Test::Most. Базовым является Test::More — он предоставляет богатый набор функций: проверки равенства, сравнения структур, тестирование на выброс исключений и др.
Классификация популярных модулей:
Test::Simple — для совсем простых, начальных тестов;Test::More — стандарт де-факто для большинства проектов;Test::Exception, Test::Deep, Test::Warn — для проверки дополнительных аспектов (исключения, вложенные структуры, предупреждения);Test::Class, Test::Class::Moose — объектно-ориентированные подходы.Пример теста с Test::More:
use Test::More tests => 2; is(2 + 2, 4, 'Сумма работает'); like('foo_bar', qr/foo/, 'Есть foo');
Best practices:
Можно ли написать свои тесты в Perl без использования модулей Test::*, просто используя конструкции die/print? Какие риски при таком подходе?
Ответ: Формально да — можно писать свои "тесты", используя print и die для вывода результата. Однако в таком случае не формируется корректный подход к автоматизации: не поддерживаются TAP/CPAN-интеграции, сложно создавать отчёты и анализировать множество тестов, затруднено масштабирование и поддержка тестовой базы.
Пример неудачного теста:
print 'Умножение ок ' if multi(2,3) == 6; die 'FAIL' if multi(2,0) != 0;
История
В старом проекте тесты были написаны "вручную" через die и print. Невозможно было интегрировать сборку CPAN-модулей автоматически — скрипты не возвращали четких статусов, из-за чего ошибки тестирования пропускались в релизах.
История
Попытка смешать использование Test::Simple и Test::More без учёта структуры TAP (Test Anything Protocol) привела к нарушению вывода иадки автоматической системы тестирования. Понадобилась переработка тестовой инфраструктуры.
История
Отсутствие хорошего покрытия тестами
Test::Exceptionстало причиной пропуска ряда ошибок обработки входных данных: один из модулей некорректно выбрасывал исключения, это не было обнаружено во время тестирования, баг попал в продакшн.