ПрограммированиеPerl разработчик, инженер по тестированию

Как работает тестирование в Perl: какие встроенные и сторонние модули для тестирования существуют, чем они отличаются, и какие практики тестирования широко используются в Perl-проектах?

Проходите собеседования с ИИ помощником Hintsage

Ответ

В 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:

  • Все публичные модули должны иметь автотесты в t/-директории.
  • Не смешивать тестовые данные с продакшен-кодом.
  • Применять модульные, интеграционные, иногда property-based тесты.

Вопрос с подвохом

Можно ли написать свои тесты в 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 стало причиной пропуска ряда ошибок обработки входных данных: один из модулей некорректно выбрасывал исключения, это не было обнаружено во время тестирования, баг попал в продакшн.