Welikeit.Ru | |
|
| |
|
|
PHP - Уроки - Написание автоматических тестов и среда phpUnitВведение. Итак, тестирование - деятельность, направленная на выявление такого рода несоответствий между ожидаемым и действительным. Выявляя несоответствия, некорректное поведение на стадии разработки, разработчик сознательно и планомерно уменьшает вероятность того, что с этим придется столкнуться пользователю. Тестировать программы (в частности php-скрипты) вполне можно и вручную. На примере формы обратной связи, понятно, что протестировать ее очень просто. Запустить браузер, зайти на нужный url, заполнить поля, нажать на "Ок", потом зайти в базу и проверить, появилась ли там соотвeтствующая запись. Прекрасно, но после любого изменения скрипта нельзя быть уверенным в его работоспособности. Можно понадеяться на авось и не проверять, работает ли скрипт после очередной модификации или нет, но помните, что если его не протестируете вы, это сделает заказчик во время сдачи проекта или конечный пользователь во время эксплуатации. В первом случае это грозит вам финансовой нестабильностью, а во втором пострадает ваш имидж. Для того, чтобы не тестировать вручную (это долгий, сложный и требующий особой усидчивости процесс), можно написать программу, тестирующую другие программы, или создать автоматизированные тесты. В любой современной методологии разработки ПО тестирование является неотъемлемой частью процесса, а значимость его написания не ниже значимости написания кода. Профессиональный разработчик обязан создавать наборы различного вида автоматизированных тестов (подробнее о видах тестов, правилах их именования и т.д. можно прочитать в статье Кирилла Максимова "Организация и именование автоматизированных тестов"). Несмотря на очевидную полезность и акцент методологий на процессе тестирования, личный опыт авторов свидетельствует о следующем разбросе мнений web-программистов насчет автоматизированного тестирования собственных скриптов: "Никто не пишет, почему я должен писать" Будни основной массы web-разработчиков - выбор хорошего сервера для размещения сайта. Трудно найти хостинг-провайдера (php+mysql за разумные деньги), который устроил бы сразу на 100%, а пeреезд на новый сервер даже для интерпретируемого языка, коим является мой горячо любимый PHP, может стать "фатальным". Даже в документации по Java - языке, изначально ориентированном на кроссплатформенность, написано, что цена переносимости никогда не равна нулю. Эти люди знают, что говорят. После переезда в прекрасно отлаженных и стабильно работающих ранее скриптах могут появиться warning'и, а какие-то программы перестанут работать совсем: поменялись пути, библиотеки, версия самого php. В итоге, имея набор тестов, переехать гораздо проще. Следует переписать скрипты, запустить набор тестов, посмотреть те тесты, которые завершились неудачно, разобраться, поправить, запустить набор тестов еще раз. Все. Вместо того, чтобы оставить "полуживой" проект на новом хостинге, "поверхностно" прокликав в браузере по ссылкам, мы получаем стабильно работающий сайт на новом сервере без особой головной боли. Автоматизированное тестирование в конечном итоге повышает качество кода, и, учитывая специфику web-программирования, упрощает процесс переезда с сервера на сервер. Вслед за решением тестировать, приходит необходимость как-то организовать этот процесс. Например, выделить для тестовых скриптов отдельную директорию, создать программу, которая запустит все скрипты и в зависимости от их исхода напишет "OK" или "Error". Вполне возможно проделать это "с нуля", но есть готовые тестовые инфраструктуры (вспомогательные программы), которые объединяют группы тестов "по темам", единообразно их сохраняют, запускают и выводят результаты. Cоздание тестов в phpUnit В основном из-за увлеченности методологией XP авторы знакомы с тестовой инфраструктурой JUnit, соответственно, для php их выбор пал на phpUnit, как на созданный энтузиастами порт своего "старшего брата". На сегодняшний день существует несколько различных версий порта JUnit на php. Как минимум 3 варианта c названием phpUnit и порт php_simpletest. Регулярно обновляется версия PEAR::PHPUnit (Sebastian Bergmann). Php_simpletest находится в состоянии первой беты, другие phpUnit'ы обновлялись год назад (phpUnit project) и два года назад (phpunit-1.0.0) соответственно. Все рассмотренные ниже примеры модульных тестов написаны с использованием PEAR::PHPUnit. Создадим набор тестов для класса Message, который форматирует и проверяет сообщение для последующей отправки его по e-mail. Конструктор класса получает 3 параметра (имя отправителя, его e-mail aдрес и тело сообщения). Метод format_message() форматирует сообщение перед отправкой, а is_valid() проверяет возможность отправки сообщения (заполнены ли поля, и корректно ли введен е-mail). Исходный код класса Message - здесь "Сердцем" тестирования является класс PHPUnit, который запускает TestSuite (набор тестов) и возвращает объект TestResult (результат теста). Для того, чтобы написать минимальный набор тестов, используя phpUnit, необходимо: Подключить библиотеку PHPUnit.php Мы протестируем следующие аспекты работы класса Message: его реакцию на пустое сообщение, и некорректный e-mail, а также сравним отформатированное объектом класса сообщение с эталонным. Создаем сообщение, подаем на вход конструктора неверный e-mail, ожидаем, что метод класса is_valid(), ответственный за его проверку, возвратит 'false'. <?php <?php <?php body <?php Разработка класса Message и разработка Message c набором тестов не очень сильно различаются по времени, но во втором случае мы имеем мощную "поддержку" на будущее, над каждой функцией мы размышляем как минимум дважды, и позже можем легко определить работоспособность скрипта на новой программно-аппаратной конфигурации. Приложение: исходный код message.inc.php <?php class Message { var $message; function Message($n, $from, $b) { $this->message = null; if (!strlen($this->name)) return false; ?> <?php /* наследуем от PHPUnit_TestCase и добавляем тестирующие методы
test<...> */ body /* запускаем набор тестов и выводим результат */ Автор: Невоструев Иван, Гусев Антон. По материалам: www.wmate.ru |
|
Copyright © 2006-09.
| |