Модульное тестирование (phpunit)

Установка phpunit

В первую очередь необходимо убедиться, что установлен Composer - менеджер php пакетов.

Далее устанавливаем phpunit:

$ composer global require "phpunit/phpunit=4.6.*"
$ sudo ln -s ~/.composer/vendor/bin/phpunit /usr/local/bin/phpunit

При работе с phpunit нам могут понадобиться некоторые дополнительные модули, такие как:

$ composer global require 'phpunit/dbunit=*'
$ composer global require 'phpunit/php-invoker=*'
$ composer global require 'phpunit/phpunit-selenium=*'
$ composer global require 'phpunit/phpunit-story=*'
$ composer global require 'phpunit/phpunit-skeleton-generator=*'

Есть еще ряд полезных иснтрументов, которые могут пригодиться для тестирования качества кода:

PHPDCD - Dead Code Detector (DCD) для PHP. Он сканирует в PHP проекте все неиспользуемые функции и методы и сообщает о них.

$ composer global require 'sebastian/phpdcd=*'
$ sudo ln -s ~/.composer/vendor/bin/phpdcd /usr/local/bin/phpdcd

Пример проверки:

project_directory$ phpdcd .

PHPMD - PHP Mess Detector. Помогает найти в коде потенциальные проблемы, такие как возможные ошибки, субоптимальный код, усложненные выражения, неиспользуемые параметры, методы, свойства.

$ composer global require 'phpmd/phpmd=2.2.*'
$ sudo ln -s ~/.composer/vendor/bin/phpmd /usr/local/bin/phpmd

Пример проверки:

project_directory$ phpmd . text codesize,unusedcode,naming

PHP Depend - показывает качество дизайна кода для расширяемости, повторного использования и сопровождения.

$ composer global require 'pdepend/pdepend=*'
$ sudo ln -s ~/.composer/vendor/bin/pdepend /usr/local/bin/pdepend

Пример запуска

phpDocumentor - инструмент для генерирования документации из PHP кода.

$ composer global require 'phpdocumentor/phpdocumentor=*'
$ sudo ln -s ~/.composer/vendor/bin/phpdoc /usr/local/bin/phpdoc

Пример запуска:

project_directory$ mkdir docs && phpdoc -d . -t docs

PHP CodeBrowser - инструмент для создания HTML презентации PHP кода, где выделены участки с выявленными нарушениями по обеспечению качества инструментов, таких как PHP CodeSniffer или PHPMD.

$ composer global require 'mayflower/php-codebrowser=~1.1'
$ sudo ln -s ~/.composer/vendor/bin/phpcb /usr/local/bin/phpcb

Пример запуска:

project_directory$ mkdir cb && phpcb -s . -o cb

PHP Copy/Paste Detector (PHPCPD) - инструмент для поиска дублированного кода.

$ composer global require 'sebastian/phpcpd=*'
$ sudo ln -s ~/.composer/vendor/bin/phpcpd /usr/local/bin/phpcpd

Пример проверки:

project_directory$ phpcpd .

PHPLOC - инструмент для быстрого измерения размера и анализа структуры PHP проекта.

$ composer global require 'phploc/phploc=*'
$ sudo ln -s ~/.composer/vendor/bin/phploc /usr/local/bin/phploc

Пример проверки:

project_directory$ phploc --log-xml phploc.xml .

PHP CodeSniffer - набор из двух PHP инструментов. Основной - phpcs, позволяет выявить нарушения стандартов кодирования в PHP, CSS и JS файлах. И второй - phpcbf, позволяет проводить автоматическую коррекцию стандартов. PHP CodeSniffer является важным инструментом , благодаря которому код остается чистым и последовательным.

$ composer global require 'squizlabs/php_codesniffer=*'
$ sudo ln -s ~/.composer/vendor/bin/phpcs /usr/local/bin/phpcs

Дополнительная проверка стандарта Symfony2 для PHP CodeSniffer:

$ cd ~/.composer/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards
$ git clone git://github.com/escapestudios/Symfony2-coding-standard.git Symfony2
$ cd Symfony2
$ git checkout 2.0.1

Пример проверки:

project_directory$ find . -type f -name '*.php' -exec phpcs --standard=Symfony2 '{}' ';'

Запуск тестов

Для запуска тестов выполните команду:

$ phpunit

Для тестирования Symfony2 проекта необходимо в первую очередь обновить вендоры.

Запуск тестирования проекта:

$ phpunit -c app

Для тестирования отдельного компонента нужно выполнить команду:

$ phpunit src/Symfony/Component/Finder/

Выполняйте тестирование кода перед сохранением изменений в системе контроля версий.

Покрытие кода тестами

При добавлении нового кода Вы можете проверить покрытие кода тестами, используя возможенисти phpunit:

$ phpunit --coverage-html=cov/

Проверте покрытие кода, открыв cov/index.html в браузере.

Установка одной командой

composer global require "phpunit/phpunit=4.6.*" && sudo ln -s ~/.composer/vendor/bin/phpunit /usr/local/bin/phpunit && composer global require 'sebastian/phpdcd=*' && sudo ln -s ~/.composer/vendor/bin/phpdcd /usr/local/bin/phpdcd && composer global require 'phpmd/phpmd=2.2.*' && sudo ln -s ~/.composer/vendor/bin/phpmd /usr/local/bin/phpmd && composer global require 'pdepend/pdepend=*' && sudo ln -s ~/.composer/vendor/bin/pdepend /usr/local/bin/pdepend && composer global require 'phpdocumentor/phpdocumentor=*' && sudo ln -s ~/.composer/vendor/bin/phpdoc /usr/local/bin/phpdoc && composer global require 'squizlabs/php_codesniffer=*' && sudo ln -s ~/.composer/vendor/bin/phpcs /usr/local/bin/phpcs && composer global require 'mayflower/php-codebrowser=~1.1' && sudo ln -s ~/.composer/vendor/bin/phpcb /usr/local/bin/phpcb && composer global require 'sebastian/phpcpd=*' && sudo ln -s ~/.composer/vendor/bin/phpcpd /usr/local/bin/phpcpd && composer global require 'phploc/phploc=*' && sudo ln -s ~/.composer/vendor/bin/phploc /usr/local/bin/phploc && composer global require 'phpunit/dbunit=*' && composer global require 'phpunit/php-invoker=*' && composer global require 'phpunit/phpunit-selenium=*' && composer global require 'phpunit/phpunit-story=*' && composer global require 'phpunit/phpunit-skeleton-generator=*' && cd ~/.composer/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards && git clone git://github.com/escapestudios/Symfony2-coding-standard.git Symfony2 && cd Symfony2 && git checkout 2.0.1

Дополнительные инструменты

Есть еще несколько полезных инструментов для проверки кода.

PHP lint - инструмент для проверки кода на наличие ошибок. Этот инструмент встроен в пакет PHP и запускается командой php -l:

project_directory$ find . -type f -name '*.php' -exec php -l '{}' ';'

Twig lint - инструмент првоерки Twig шаблонов на наличие ошибок. При использовании Symfony2 можно запустить проверку командой:

project_directory$ app/console twig:lint src

В большенстве web проектов часто используется JavaScript и CSS. Для этих языков есть свои инструменты проверки кода.

Они представляет собой модули Node.js. Поэтому вначале необходимо установить Node.js.

Пример установки для Ubuntu:

$ sudo apt-get install npm nodejs
$ sudo ln -s /usr/bin/nodejs /usr/bin/node

JS lint - инструмент проверки кода JavaScript. Установить его можно с помощью npm:

sudo npm install -g jslint

Проверить код можно командой:

project_directory$ find . -type f -name '*.js' -exec jslint '{}' ';'

Если нужно исключить некоторые файлы из проверки:

project_directory$ find src -type f -name '*.js' -a \( -not -name 'jquery*.js' -a -not -name 'bootstrap*.js' \) -exec jslint '{}' ';'

JS hint - еще один инструмент проверки кода JavaScript. Установить его можно с помощью npm:

sudo npm install -g jshint

Проверить код можно командой:

project_directory$ find . -type f -name '*.js' -exec jshint '{}' ';'

Если нужно исключить некоторые файлы из проверки:

project_directory$ find src -type f -name '*.js' -a \( -not -name 'jquery*.js' -a -not -name 'bootstrap*.js' \) -exec jshint '{}' ';'

CSS lint - инструмент проверки кода CSS. Установить его можно с помощью npm:

sudo npm install -g csslint

Проверить код можно командой:

project_directory$ find . -type f -name '*.css' -exec csslint '{}' ';'

Если нужно исключить некоторые файлы из проверки:

project_directory$ find src -type f -name '*.css' -a -not -name 'bootstrap*.css'  -exec csslint '{}' ';'

Согласно принципу единственной обязанности - Single responsibility principle (одному из принципов SOLID, который следует применять не только к написанию кода, но и к созданию архитектуры), библиотеки, которые нужно исключить, следует выносить в отдельные бандлы (модули), как это сделал я с jquery и twitter bootstrap.

Скорость загрузки JavaScript, CSS файлов и изображений является одним из показателей качества.

Теги: Модульное тестирование php, Phpunit, Composer, Phpdcd, Dead code detector, Dcd, Phpmd, Php mess detector, Pdepend, Php depend, Phpdoc, Phpdocumentor, Phpcb, Php codebrowser, Php copy/paste detector, Phpcpd, Phploc, Symfony2, Phpcs, Php codesniffer, Phpcbf, Стандарт symfony2, Покрытие кода тестами, Phpunit coverage


Похожие статьи

PHP Depend

Модульное тестирование Dependency Injection в Symfony2