Я создаю приложение на Perl как " modulino ", чтобы упростить тестирование. Структура каталогов выглядит примерно так:
MainScript.pm
t/001_load.t
t/002_setup.t
t/003_etc...
Первый тест в каждом тестовом файле .t также загружает модуль с:
BEGIN { use_ok('MainScript'); }
Для тестирования я запускаю следующее в каталоге верхнего уровня:
prove -l
Все до этого момента прекрасно работает. Я сталкиваюсь с проблемой, когда случайно запускаю тестовые сценарии .t напрямую.
Мои пальцы имеют почти автономную привычку нажимать горячие клавиши для запуска сценария сразу после сохранения его в моем текстовом редакторе. Когда я делаю это с одним из тестовых файлов, он покорно запускается и сообщает о сбое по всем направлениям. Это ожидается, так как он не может видеть модуль, если он запускается из своего собственного каталога. Меня беспокоит то, что некоторые тесты пишут в файловую систему. Примерами являются файлы конфигурации и файлы данных, используемые для проверки. Я предпочел бы, чтобы тестовый скрипт каркал перед тем, как он что-то сделает, если он не сможет загрузить модуль, который должен тестироваться. Таким образом, мне не нужно беспокоиться о том, что из остальной части теста ничего не выйдет.
Решение, с которым я сейчас работаю, заключается в замене строки BEGIN { use_ok('MainScript'); }
стандартным вызовом использования:
use MainScript;
Выполнение теста с prove -l
все еще работает, как и ожидалось. Несмотря на то, что тест use_ok был удален, очевидно, что все в порядке, поскольку остальная часть файла выполняется. Если по какой-либо причине тест не может найти модуль, он дросселирует и «доказать» все еще показывает тестовый файл как неудачный. Если я запускаю скрипт непосредственно из редактора, он завершается неудачно во время компиляции с сообщением, что не может найти запрошенный модуль в @INC. Это кажется мне желательным поведением.
Есть ли лучший способ сделать это, и / или есть ли в этом подходе что-то, что укусит меня в будущем?