Wednesday, February 8, 2012

Perl: как из обычного скрипта сделать модуль

Если вы используете в процессе разработки TDD, то наверняка знаете, как непросто бывает тестировать standalone-скрипты. В общем случае, скрипту можно передать какие то параметры и сравнить вывод с ожидаемым.

Гораздо легче тестировать модули. Код разбивается на небольшие функции, каждая из которых выполняет одну задачу. Если функции не имеют побочных эффектов, можно передать им некие аргументы и проверить возвращаемые значения.

Допустим наш скрипт содержит какие-то функции, которые необходимо протестировать. Как сделать так, чтобы скрипт можно было подключить в виде модуля, не исполняя?

Для этого достаточно обернуть основной код скрипта в функцию, и не вызывать эту функцию в том случае, если в стеке вызовов что-либо есть - это означает, что скрипт подгружен с помощью require:
main() unless caller();

sub main {
sub1();
sub2();
...
}


Функциональность скрипта абсолютно не пострадала, зато теперь его можно подключить с помощью require и полноценно протестировать.

Кстати, подобный подход встречается и в Python:
def main():
# the main code goes here

if __name__ == "__main__":
main()

No comments:

Post a Comment