Является ли Perl юнит-тестированием только для модулей, а не программ? - PullRequest
6 голосов
/ 03 февраля 2012

Документы, которые я нахожу в сети и у меня есть книга, Perl Testing , говорят или предлагают, чтобы модульное тестирование для Perl обычно выполнялось при создании модулей.

Isэто правда?Разве нет способа протестировать настоящие программы с использованием Test::More и двоюродных братьев?

Ответы [ 2 ]

11 голосов
/ 03 февраля 2012

Конечно, вы можете тестировать скрипты используя Test :: More . Это просто сложнее, потому что большинство сценариев нужно будет запускать как отдельный процесс, из которого вы получаете выходные данные, а затем проверяете их на ожидаемый результат.

Вот почему modulinos (см. Главу 17 в: Брайан Д Фой , Мастеринг Perl , второе издание, O'Reilly, 2014). Модуль - это скрипт, который также можно использовать как модуль. Это облегчает тестирование, так как вы можете загрузить модуль в свой тестовый скрипт и затем протестировать его функции, как если бы вы работали с обычным модулем.

Ключевой особенностью модуля является следующее:

#! /usr/bin/perl
package App::MyName; # put it in a package

run() unless caller; # Run program unless loaded as a module

sub run {
  ... # your program here
}

Функция не должна вызываться run; Вы можете использовать main, если вы программист на Си. У вас также обычно есть дополнительные подпрограммы, которые run вызывает по мере необходимости.

Тогда ваши тестовые сценарии могут использовать require "path/to/script" для загрузки вашего модуля и выполнения его функций. Так как многие сценарии включают в себя написание вывода, и его часто проще печатать по ходу, чем делать print sub_that_returns_big_string(), может оказаться полезным Test :: Output .

0 голосов
/ 03 февраля 2012

Это не самый простой способ протестировать ваш код, но вы можете протестировать скрипт напрямую. Вы можете запустить скрипт с определенными параметрами, используя system (или лучше IPC::Run3), захватить выходные данные и сравнить их с ожидаемым результатом.

Но это будет тест верхнего уровня. Трудно сказать, какая часть вашего кода вызвала проблему. Юнит-тесты используются для тестирования отдельных модулей. Это позволяет увидеть, откуда возникла проблема. Кроме того, тестирование функций по отдельности намного проще, потому что вам нужно думать только о том, что может произойти с небольшим фрагментом кода. Способ тестирования зависит от размера вашего проекта. Конечно, вы можете поместить все в один файл, но размещение кода в модуле (или даже разбиение его на разные модули) в будущем даст вам преимущества: код можно будет легко использовать повторно и тестировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...