2012-01-16 1 views
1

Я создаю приложение perl как «modulino», чтобы упростить тестирование. Структура каталогов выглядит примерно так:Как я могу убить тестовый скрипт perl, если модуль для тестирования недоступен?

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. Для меня это кажется желательным поведением.

Есть ли лучший способ сделать это и/или есть что-то в этом подходе, которое укусит меня по дороге?

+0

Как насчет 'BEGIN {use_ok ('MainScript') || BAIL_OUT («неудачная загрузка MainScript»); } ' –

ответ

4

Так я всегда это делал.

У меня есть один тест (обычно называемый 00-load.t), который делает use_ok и ничего больше (кроме печати номера версии). Все тесты, которые на самом деле выполняют модуль, имеют нормальный use, потому что если это не удается, нет смысла приступать к испытаниям.